【问题标题】:PHP json_encode() - SQL limit and AJAX jsPHP json_encode() - SQL 限制和 AJAX js
【发布时间】:2014-09-02 19:54:32
【问题描述】:

我有这个 PHP:

function getList() {
    $sql = "    SELECT * FROM list  ";        
    try {
        $db = getConnection();
        $stmt = $db->query($sql);
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode(array('result' => $result));
        $db = null;
    } catch(PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}';
    }
}

还有这个 javascript:

$.ajax({
    type: 'GET',
    url: rootURL + '/' + myAPI,
    dataType: "json", 
    success: function(list) {
      var list = list.result; 
      console.log (list);
    }
    error: function( jqXHR, textStatus, errorThrown ) {
      console.log (" errors: " );
      console.log (jqXHR);
      console.log (textStatus);
      console.log (errorThrown);
    }
});

现在一切正常,直到我在数据库的 list 表中添加了一些行。 所以现在来自 AJAX 的 js list 结果是空的:

{"result":  }

我从 AJAX 收到的错误是:

Object { readyState=4, status=200, statusText="OK", more elements...}
parsererror
SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

所以我尝试删除:dataType: "json",result 仍然为空。 使它起作用的唯一方法是像这样限制 SQL 查询:

$sql = "    SELECT * FROM list LIMIT 9  ";

它的工作原理:

{"result":
[
{"ID":"1","name":"...","year":"0","description":"...","image_URL":...","state":"..."},
{"ID":"2","name":"...","year":"0","description":"...","image_URL":"...","state":"..."},
{"ID":"3","name":"...","year":"0","description":"...","image_URL":"...","state":"..."},
{"ID":"4","name":"...","year":"0","description":"...","image_URL":...","state":"..."},
{"ID":"5","name":"...","year":"0","description":"...","image_URL":"...","state":"..."},
{"ID":"6","name":"...","year":"0","description":"...","image_URL":"...","state":"..."},
{"ID":"7","name":"...","year":"0","description":"...","image_URL":...","state":"..."},
{"ID":"8","name":"...","year":"0","description":"...","image_URL":"...","state":"..."},
{"ID":"9","name":"...","year":"0","description":"...","image_URL":"...","state":"..."},
]

}

我不明白为什么会有这样的限制。我也试过了:

$sql = "    SELECT * FROM list LIMIT 10  ";

以此类推,但结果还是空:

{"result":  }

你能帮帮我吗?

谢谢

【问题讨论】:

  • 不要手动构造 JSON。使用echo json_encode(array('result' => $result))
  • 你试过了吗 var_dump($result); ? json_encode 返回 false,你必须找出原因。
  • 在开发者工具的网络选项卡中查看回复。您的脚本可能在 JSON 之前显示错误消息。
  • @LorenzMeyer,var_dump($result); 显示我期望的结果,array(13) ....@Barmar,谢谢我尝试了echo json_encode(array('result' => $result)),但结果相同,脚本没有给我任何错误消息
  • @Frank barmar 的建议给了你不同的输出,不是吗?睁大眼睛!

标签: javascript php sql ajax json


【解决方案1】:

http://php.net/json_encode 阅读手册。它说:

所有字符串数据必须是 UTF-8 编码。

确保您的数据在数据库中采用 UTF-8 编码。如果不是,您必须先转换它。

【讨论】:

  • @Frank 你的数据在数据库中的编码是什么?
  • 这是正确的 UTF-8 编码,例如我有:varchar(60) utf8_general_ci text utf8_general_ci tinytext utf8_general_ci enum('ONGOING', 'COMPLETE') utf8_general_ci
【解决方案2】:

如果它与 LIMIT 9 一起使用而不与 LIMIT 10 一起使用,那么问题出现在您的第 9 行之后的记录中,因此请检查您的第 10 行它可能有任何“特殊字符”、“换行符”,这会造成问题。

【讨论】:

  • 我试图删除第 9 行之后的任何行但同样的问题,它的问题是第 9 行之后的任何行,不管它的内容是什么
  • @Frank 编程不是魔术,而是逻辑。 9行没有神奇的边界线。内容是什么很重要。我已经告诉过你:睁大眼睛!
【解决方案3】:

我想在您的代码中指出两点以供查看。首先,错误的构造应该使用json_encode函数,这将确保格式有效,所以你应该这样做而不是echo '{"error":{"text":'. $e->getMessage() .'}}';

$response = new stdClass();
$response->error = new stdClass();
$response->error->text = $e->getMessage();
echo json_encode($response);

请注意,它看起来过于复杂,但我尝试保留您在示例中指定的格式。

另一件事是,如果没有设置正确的标头,Javascript 将不喜欢type: 'json'。所以我建议你的 PHP 函数应该是这样的:

function getList() {
    $response = new stdClass();
    $sql = "    SELECT * FROM list  ";        
    try {
        $db = getConnection();
        $stmt = $db->query($sql);
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        $response->result = $result;
        unset($db);
    } catch(PDOException $e) {            
        $response->error = new stdClass();
        $response->error->text = $e->getMessage();
    }
    header("Content-Type: application/json");
    echo json_encode($response);
    exit();
}

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多