PHP json_encode() - SQL限制和AJAX js

时间:2014-07-12 06:49:56

标签: javascript php sql ajax json

我有这个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":  }

你能帮我吗?

由于

3 个答案:

答案 0 :(得分:0)

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

  

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

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

答案 1 :(得分:0)

如果它正在使用LIMIT 9而不使用LIMIT 10,那么第9行之后就会出现问题,所以请检查你的第10行它可能有任何“特殊字符”,“新行字符”正在产生问题。

答案 2 :(得分:0)

有两点我想在你的代码中指出要看一下。首先,错误的构造应该使用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();
}

我希望这有帮助!