You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Retrofit字符串响应不完整及PHP查询返回异常问题

解决PHP查询结果输出不全与Retrofit响应截断问题

我来帮你梳理下这个问题的解决思路——你遇到的其实是两个关联的问题: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才能正确解析完整的字符串。

总结一下核心要点

  1. PHP端一定要正确获取SHOW CREATE TABLE返回的Create Table字段值;
  2. 输出时优先用JSON格式,避免特殊字符导致的截断;
  3. Retrofit端对应使用实体类接收JSON响应,这是最稳定的方案。

内容的提问来源于stack exchange,提问作者Shunan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:59:44