PHP无法读取MySQL的LONGTEXT字段并写入数组问题排查
解决LONGTEXT字段导致PHP json_encode无响应的问题
我之前碰过好几个类似的情况,你这个问题大概率是LONGTEXT字段的内容给json_encode添了乱子——要么是编码不对,要么是内存不够,要么是内容里藏着特殊控制字符。下面一步步给你排查和解决的方法:
1. 先搞清楚json_encode到底为啥失败
json_encode在处理无效内容时会返回false,但你直接echo的话就会输出空内容,看起来像“无响应”。先加个错误检测代码,直接看问题根源:
// 替换原来的echo json_encode($final); $jsonResult = json_encode($final); if ($jsonResult === false) { // 输出详细错误信息 echo json_encode([ "status" => "500", "error_message" => json_last_error_msg(), "error_code" => json_last_error() ]); exit; } echo $jsonResult;
运行后你会得到具体错误,比如:
JSON_ERROR_UTF8:内容不是合法的UTF-8编码JSON_ERROR_DEPTH:嵌套层级太深(不过你的结构简单,这个概率低)- 内存耗尽相关的错误:内容太大,内存不够用
2. 如果是UTF-8编码问题
LONGTEXT里可能混了其他编码的字符(比如GBK),或者有不可见的控制字符,导致json_encode失败。可以先清洗内容:
foreach ($result as $row) { $cv = $row['cover_letter']; // 先转成UTF-8,自动识别原编码 $cv = mb_convert_encoding($cv, 'UTF-8', 'auto'); // 过滤掉非打印的控制字符(保留换行、制表符) $cv = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $cv); $final[] = array("coverletter" => $cv); }
如果你的内容里有HTML标签,也可以用htmlspecialchars($cv, ENT_QUOTES, 'UTF-8')处理,避免引号之类的字符干扰JSON结构。
3. 如果是内存不足问题
如果LONGTEXT内容特别大(比如几十MB),json_encode需要更多内存来处理。可以临时调高PHP的内存限制:
// 在代码开头加这一行,根据实际情况调整大小,比如512M ini_set('memory_limit', '256M');
如果经常遇到这种情况,建议修改php.ini里的memory_limit参数,把值调得足够大(比如memory_limit = 512M)。
4. 额外优化:检查数据库连接字符集
确保PHP和MySQL的连接用的是UTF-8(最好是utf8mb4,支持emoji等特殊字符),不然取出的内容可能编码混乱。在连接数据库后加一行:
$conn->set_charset('utf8mb4');
5. 可选:分块处理大数据
如果你的查询结果有几百条带大LONGTEXT的记录,一次性处理会很吃力,可以改成分页查询,每次返回部分数据:
// 分页示例,每次取10条 $page = isset($_GET['page']) ? (int)$_GET['page'] : 1; $limit = 10; $offset = ($page - 1) * $limit; $sql = "SELECT * FROM openings WHERE shortlisted = 'NO' ORDER BY fullName asc LIMIT $offset, $limit";
先按第一步加错误检测,确定具体问题后再针对性解决,一般这几个方法就能搞定了。
内容的提问来源于stack exchange,提问作者C Williams
相关产品推荐
相关产品推荐

