PHP无法将mysqli查询的SQL结果写入JSON文件问题求助
PHP写入mysqli查询结果到JSON文件无变化问题排查方案
以下是几个常见的错误原因和对应的修复方法:
- 权限不足
运行PHP的进程(如web服务对应的www-data、apache用户,或CLI模式下的当前登录用户)没有脚本执行目录的写入权限,或是已存在的takeOutItems.json文件设置了禁止写入的权限。可以先尝试给目标目录开通写入权限,或是直接指定绝对路径验证权限问题。 - JSON编码失败
如果查询结果中存在非UTF-8编码的内容,json_encode会直接返回false,此时写入的内容为空,看起来就像文件没有变化。可以加错误判断定位编码问题:
也可以在查询前指定数据库连接编码为UTF-8避免该问题:$json = json_encode($rows); if ($json === false) { echo json_last_error_msg(); }mysqli_set_charset($mysqli, 'utf8mb4'); - 路径错误
你使用了相对路径指定文件,PHP的当前工作目录不一定等于脚本所在目录,生成的文件可能被存到了其他位置。可以用var_dump(getcwd())打印当前工作目录确认文件位置,也可以直接用绝对路径写文件:$filePath = __DIR__ . '/takeOutItems.json'; - 文件打开失败未捕获
你没有判断fopen的返回值,如果文件打开失败,后续写入操作不会生效,加判断即可定位问题:$fileobj = fopen($filePath, 'w'); if (!$fileobj) { die("文件打开失败"); }
修正后的参考代码
// 指定连接编码避免中文乱码和JSON编码失败 mysqli_set_charset($mysqli, 'utf8mb4'); $sth = mysqli_query($mysqli, "SELECT * FROM `table`"); $rows = array(); while($r = mysqli_fetch_assoc($sth)) { $rows[] = $r; } $mysqli->close(); $filePath = __DIR__ . "/takeOutItems.json"; $jsonContent = json_encode($rows, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); if ($jsonContent === false) { die("JSON生成失败:" . json_last_error_msg()); } $fileobj = fopen($filePath, 'w'); if (!$fileobj) { die("文件打开失败,请检查目录权限:" . $filePath); } fwrite($fileobj, $jsonContent); fclose($fileobj);
内容的提问来源于stack exchange,提问作者nebulator0
相关产品推荐
相关产品推荐

