Android Retrofit字符串响应不完整及PHP查询返回异常问题
我来帮你梳理下这个问题的解决思路——你遇到的其实是两个关联的问题:PHP端输出时的字符串截断,以及Retrofit接收响应时的解析异常,咱们一步步来解决:
PHP 端问题排查与修复
首先说SHOW CREATE TABLE test.account的输出问题:
1. 你可能没正确获取完整的建表语句
SHOW CREATE TABLE的查询结果是一个关联数组(不管用mysqli还是PDO),其中真正存建表语句的字段是Create Table(注意字段名里的空格)。如果你直接echo整个数组或者错误地取了其他字段,就会出现只输出部分内容的情况。
举个正确的获取示例:
用mysqli的写法:
$conn = mysqli_connect("localhost", "你的用户名", "你的密码", "test"); $result = mysqli_query($conn, "SHOW CREATE TABLE account"); $row = mysqli_fetch_assoc($result); // 重点:取`Create Table`字段的值 $fullCreateStmt = $row['Create Table'];
用PDO的写法:
$pdo = new PDO("mysql:host=localhost;dbname=test", "你的用户名", "你的密码"); $stmt = $pdo->query("SHOW CREATE TABLE account"); $row = $stmt->fetch(PDO::FETCH_ASSOC); $fullCreateStmt = $row['Create Table'];
2. 单引号包裹导致的截断问题
建表语句里通常包含反引号(`)或者可能有单引号,如果你直接用单引号包裹这个字符串输出,比如echo '$fullCreateStmt';,PHP会把语句里的单引号当成字符串结束符,直接截断内容。
解决这个问题最靠谱的方式是输出JSON格式的响应——JSON会自动转义所有特殊字符,既避免截断,也方便Retrofit解析:
// 先设置正确的响应头 header('Content-Type: application/json; charset=utf-8'); // 把建表语句包装成JSON对象输出 echo json_encode([ 'create_statement' => $fullCreateStmt ]);
如果一定要直接输出纯文本,记得用htmlspecialchars()转义特殊字符:
header('Content-Type: text/plain; charset=utf-8'); echo htmlspecialchars($fullCreateStmt, ENT_QUOTES);
Android Retrofit 端问题解决
Retrofit接收字符串响应不全,本质是因为未转义的特殊字符干扰了解析,优先推荐用JSON实体类来接收:
1. 定义响应实体类
根据PHP端输出的JSON结构,创建一个简单的实体类:
public class CreateTableResponse { private String create_statement; public String getCreateStatement() { return create_statement; } public void setCreateStatement(String create_statement) { this.create_statement = create_statement; } }
2. 修改Retrofit接口
把原来的Call<String>改成Call<CreateTableResponse>:
@GET("createQueries.php") Call<CreateTableResponse> loadCreateQueries(@Query("你的参数名") String param);
3. 处理响应
在回调里就能安全获取完整的建表语句了:
call.enqueue(new Callback<CreateTableResponse>() { @Override public void onResponse(Call<CreateTableResponse> call, Response<CreateTableResponse> response) { if (response.isSuccessful() && response.body() != null) { String fullStmt = response.body().getCreateStatement(); // 这里拿到的就是完整的建表语句 } } @Override public void onFailure(Call<CreateTableResponse> call, Throwable t) { // 处理请求失败逻辑 } });
如果你坚持用Call<String>接收
那必须确保PHP端设置了text/plain的响应头,并且用htmlspecialchars()转义了特殊字符,这样Retrofit才能正确解析完整的字符串。
总结一下核心要点
- PHP端一定要正确获取
SHOW CREATE TABLE返回的Create Table字段值; - 输出时优先用JSON格式,避免特殊字符导致的截断;
- Retrofit端对应使用实体类接收JSON响应,这是最稳定的方案。
内容的提问来源于stack exchange,提问作者Shunan

