我遇到了从PHP代码中获取响应的问题。 JavaScript文件表示JSON对象的长度为0。
这是我从 getalbums.php 脚本返回的JSON:
[
{
"album_id": "50ab2c3db9396",
"username": "tusik",
"title": "testalbum",
"cover_photo_url": "http:\/\/s3.amazonaws.com\/Looking_Glass_Images\/tusik_testalbum_testpic.jpeg"
},
{
"album_id": "50ab3b75a46fe",
"username": "tusik",
"title": "test",
"cover_photo_url": "http:\/\/s3.amazonaws.com\/Looking_Glass_Images\/tusik_test_test.png"
}
]
getalbums.php
<?php
session_start();
include("db.php");
$albumsArray = array();
$username = $_GET['uid'];
//Preventing MySQL injection
$username = stripslashes($username);
$username = mysql_real_escape_string($username);
$sql = "SELECT album_id,username,title,cover_photo_url FROM albums WHERE albums.username='$username'";
$result = mysql_query($sql) or die(mysql_error());
echo $count;
while ($row = mysql_fetch_object($result)) {
$albumsArray[] = $row;
}
echo json_encode( $albumsArray );
?>
如果我输入/getalbums.php?uid=tusik
,我会从上面获取JSON,因此我知道该页面有效。
albums.js
$.urlParam = function(name){
var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
return results[1] || 0;
}
var username = $.urlParam('uid');
var data = "uid=" + username;
$.ajax({
type: "GET",
url: "getalbums.php",
data: data,
dataType: "json",
processData: false
}).done(function(data) {
//Do work
}).fail(function(jqXHR, textStatus) {
alert( "Request failed: " + textStatus );
});
代码给了我这个错误。
TypeError: Cannot read property 'album_id' of undefined
有人能看出我做错了什么吗?
修改
修正了我的问题,jeroen的建议部分正确。 {'uid':username}
应该阅读{"uid":username}
。
答案 0 :(得分:4)
如果设置dataType: 'json'
,data
应该已经包含已解析的数据,而不是JSON字符串。所以调用parseJSON()
是一个不必要的步骤 - 它将尝试解析你的(已经解析过的)Javascript数组,当然这不是包含JSON的字符串,因此它失败并返回null
。
你也可以在the manual page for .ajax()
(强调我的)上查看:
的dataType
“json”:将响应评估为JSON, 返回JavaScript 对象 即可。在jQuery 1.4中,JSON数据以严格的方式解析;任何 格式错误的JSON被拒绝,并引发解析错误。 (见json.org 有关正确的JSON格式的更多信息。)
这意味着您应该能够简单地写:
...
}).done(function(data) {
console.log(data[0].album_id);
})
...
答案 1 :(得分:1)
您需要在您的ajax调用中将密钥和值发送到服务器:
$.ajax({
type: "GET",
url: "getalbums.php",
data: {'uid': username}, // here
dataType: "json",
processData: false
}).done(function(data) {
您只是在没有密钥的情况下发送数据,因此$_GET['uid']
为空/未设置且查询返回0行。
编辑:您还使用以下行宣传您的json:
echo $count;
您需要确保只有json_encode
行被回显/返回到jQuery回调函数,所以只需删除它或将其注释掉。
答案 2 :(得分:-2)
你能尝试简单的eval()函数吗? Click here如果您想了解有关JSON和eval()的更多详细信息。
var test = eval("(" + data + ")"); OR var test = eval(data);
我已经在我的许多应用程序中尝试了这个,这对我来说很好。