2

我在从我的 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"
  }
]

获取相册.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,所以我知道该页面有效。


相册.js

$.urlParam = function(name){
var results = new RegExp('[\\?&amp;]' + name + '=([^&amp;#]*)').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}

4

3 回答 3

4

如果设置dataType: 'json',data应该已经包含解析的数据,而不是 JSON 字符串。所以调用parseJSON()是一个不必要的步骤——它会尝试解析你的(已经解析的)Javascript数组,这当然不是包含JSON的字符串,所以它失败并返回null

您还可以在手册页上查看.ajax()(强调我的):

数据类型

"json":将响应评估为 JSON 并返回一个 JavaScript 对象。在 jQuery 1.4 中,JSON 数据以严格的方式解析;任何格式错误的 JSON 都会被拒绝并引发解析错误。(有关正确的 JSON 格式的更多信息,请参阅 json.org。)

这意味着您应该能够简单地编写:

...
}).done(function(data) {
    console.log(data[0].album_id);
})
...
于 2012-11-20T18:10:59.667 回答
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 回调函数,因此只需将其删除或将其注释掉。

于 2012-11-20T20:07:42.897 回答
-2

你能试试简单的 eval() 函数吗?如果您想了解有关 JSON 和 eval() 的更多详细信息,请单击此处。

var test = eval("(" + data + ")"); OR var test = eval(data);

我已经在我的很多应用程序中尝试过这个,这对我来说很好。

于 2012-11-20T18:28:04.267 回答