【问题标题】:JSON encode PHP AJAX jQuery response errorJSON 编码 PHP AJAX jQuery 响应错误
【发布时间】:2012-11-20 18:05:02
【问题描述】:

我在从我的 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('[\\?&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}

【问题讨论】:

  • 为什么不先检查data 包含什么?也许 php 回显了一个警告或错误。
  • 当我将数据打印到屏幕上时,它会显示 []

标签: php javascript jquery ajax json


【解决方案1】:

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

您也可以在the manual page for .ajax()(强调我的)上查看此内容:

数据类型

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

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

...
}).done(function(data) {
    console.log(data[0].album_id);
})
...

【讨论】:

  • 那么在json对象中返回album_id的正确方法是什么?抱歉,我对 javascript 很陌生。
  • @PrestonTighe 更新了我的答案。如果你尝试在控制台上自己写data,你会看到它已经被解析了。
  • 我已经尝试过这种性质的东西,但它给了我一个错误。错误是:TypeError: Cannot read property 'album_id' of undefined. 当我尝试使用console.log(data); 打印时,它给了我一个专辑属性长度为 0 的对象。
  • @PrestonTighe 使用检查器的网络选项卡(我使用内置的 Chrome 检查器)来分析从服务器返回的数据。响应必须是有效的 JSON。
  • 当我这样做并查看响应选项卡时。响应为空白。
【解决方案2】:

您需要在 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 回调函数,因此只需将其删除或注释掉即可。

【讨论】:

  • 好吧,如果我有 15 个代表,我会投赞成票。非常感谢您的帮助,但我仍然有问题。返回的数据长度仍为 0。有什么解决办法吗?
  • 好吧,这来自我的调试,但它没有影响任何东西,因为它首先是空的。我如何让这条线工作?console.log(data[0].album_id); 数据仍然以长度 0 返回。
  • @Preston Tighe php 脚本是否适用于正常请求?
  • 是的,我用$albumsArray = array( "album" =&gt; ""); 尝试过,然后我将专辑设置为某个东西,然后回显它。我可以从 albums.js 文件中提取专辑密钥。就像我说的 /getalbums.php?uid=tusik 也可以。
  • @bažmegakapa 这就是我的想法,所以 OP 的评论对我来说没有多大意义......
【解决方案3】:

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

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

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

【讨论】:

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