使用d3.json调用PHP的json_encode返回null问题求助
D3.json调用PHP接口返回Null、JSON解析报错的解决办法
问题现象
- 本地XAMPP环境下直接访问
getdata.php,能输出格式完全正确的JSON; - 将PHP输出的JSON内容复制到
test.json文件中,d3.json调用该文件可正常获取数据; - 直接用d3.json调用
getdata.php时,控制台输出null,同时抛出SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data错误。
相关代码如下:
PHP代码
<?php $mysqli = new mysqli('database','user','pass'); $myArray = array(); $query1="UPDATE ezDB.newsTable SET RADII = FLOOR(RAND()*(1200-100) + 100) #END"; $mysqli->query("$query1"); $query2="UPDATE ezDB.newsTable SET RADII = FLOOR(RAND()*((minRadii+500)-(minRadii-500)) + (minRadii-500))"; $mysqli->query("$query2"); if ($result = $mysqli->query("SELECT indexKey, radii, source, headline, siteurl, dateAdded, storyAge FROM ezDB.newsTable")) { while($row = $result->fetch_array(MYSQLI_ASSOC)) { $myArray[] = $row; } header("Access-Control-Allow-Origin: *"); echo json_encode($myArray, JSON_NUMERIC_CHECK); } $result->close(); $mysqli->close();
前端代码
d3.json("getdata.php", function(data) { console.log("TESTING PHP JSON:"); console.log(data); }
排查与解决步骤
清理PHP输出前的多余字符
这类JSON解析错误大多是因为PHP输出JSON前存在空格、换行或不可见BOM头:- 确认
getdata.php文件开头的<?php标签前没有任何空格、换行; - 检查代码中是否有意外输出(比如数据库操作的错误提示),这些内容会破坏JSON格式。
- 确认
修复SQL语句与添加错误处理
当前代码未处理数据库操作的错误,且SQL语句存在潜在问题:query1中的#END注释可能导致语法错误(MySQL单行注释推荐用--,注意后方带空格),若更新语句执行失败,会输出错误信息污染JSON;- 给数据库操作添加错误捕获,避免错误信息输出到前端:
// 处理query1执行错误 if (!$mysqli->query($query1)) { error_log("Query1执行失败: " . $mysqli->error); } // 处理query2执行错误 if (!$mysqli->query($query2)) { error_log("Query2执行失败: " . $mysqli->error); }
调整Header输出位置
HTTP Header必须在任何内容输出前发送,当前代码仅在查询成功时才输出跨域Header,建议移到代码最开头:<?php header("Access-Control-Allow-Origin: *"); $mysqli = new mysqli('database','user','pass'); // 后续代码...处理查询失败的边界情况
当前代码仅在查询成功时输出JSON,若查询失败则无任何输出,导致d3.json解析空内容报错,需补充失败处理:if ($result = $mysqli->query("SELECT indexKey, radii, source, headline, siteurl, dateAdded, storyAge FROM ezDB.newsTable")) { // 现有逻辑... } else { echo json_encode(array('error' => '查询失败: ' . $mysqli->error)); }修复前端语法错误
给出的前端代码缺少闭合括号,修正后:d3.json("getdata.php", function(data) { console.log("TESTING PHP JSON:"); console.log(data); });直接查看PHP接口的实际响应
在浏览器中直接访问getdata.php,打开开发者工具的「网络」面板查看响应内容,确认是否存在多余字符或错误信息,这是定位问题最直接的方式。
内容的提问来源于stack exchange,提问作者Connor
相关产品推荐
相关产品推荐

