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

使用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);
 }

排查与解决步骤

  1. 清理PHP输出前的多余字符
    这类JSON解析错误大多是因为PHP输出JSON前存在空格、换行或不可见BOM头:

    • 确认getdata.php文件开头的<?php标签前没有任何空格、换行;
    • 检查代码中是否有意外输出(比如数据库操作的错误提示),这些内容会破坏JSON格式。
  2. 修复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);
      }
      
  3. 调整Header输出位置
    HTTP Header必须在任何内容输出前发送,当前代码仅在查询成功时才输出跨域Header,建议移到代码最开头:

    <?php
    header("Access-Control-Allow-Origin: *");
    $mysqli = new mysqli('database','user','pass');
    // 后续代码...
    
  4. 处理查询失败的边界情况
    当前代码仅在查询成功时输出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));
    }
    
  5. 修复前端语法错误
    给出的前端代码缺少闭合括号,修正后:

    d3.json("getdata.php", function(data) {
        console.log("TESTING PHP JSON:");
        console.log(data);
    });
    
  6. 直接查看PHP接口的实际响应
    在浏览器中直接访问getdata.php,打开开发者工具的「网络」面板查看响应内容,确认是否存在多余字符或错误信息,这是定位问题最直接的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:52:44