【问题标题】:Error - Passing an array from PhP to jQuery using JSON错误 - 使用 JSON 将数组从 PhP 传递到 jQuery
【发布时间】:2013-12-26 00:33:42
【问题描述】:

我很抱歉,因为我知道有人问过这个问题before,而不是once

我已经和这个小混蛋苦苦挣扎了好几个小时了,但我似乎找不到我的错误。

问题很简单 - 我有一个 PhP 数组,我想将它从服务器端传递到客户端,使用 jQuery AJAX 和 JSON 格式的数据。

我的客户端 Ajax 调用的代码是

$.ajax({
  url: 'php/test/pass_array.php',
  method: 'POST',                            
  data: {test1: 'abc', test2: 'cde'}, //Random input data
  dataType: 'json',
  success: function(response_data)
  { 
    console.log(response_data);

  },
  error: function(jqXHR, textStatus, errorThrown) 
  {
    console.log(arguments);
    console.log('Error: ' + errorThrown + ' ' + textStatus + ' ' + jqXHR);
  }
});

我的服务器端 pass_array.php 脚本的代码是

header('Content-type: application/json; charset=utf-8');

echo json_encode(array("Name"=>"Johnny"));  //Build JSON object from the array

如您所见,这是非常基本的,但它不起作用。在客户端,永远不会收到 AJAX 响应。

当我检查浏览器控制台日志时,我得到了

Error: SyntaxError: Unexpected token  parsererror [object Object] 

我做错了什么魔鬼

我所有的文件都是 UTF-8 编码。如果我在 PhP 端删除 dataType: 'json' 和 heading() ,这也有效。在这种情况下,我得到以下字符串:

{"Name":"Johnny"} 

更新

在 PhP 端注释掉 header() 代码会使控制台显示以下错误:

Uncaught SyntaxError: Unexpected token o

怎么会有语法错误呢?我创建了一个 PhP 数组并使用 json_encode 对其进行编码。

更新 #2

修复它。

在我的 PhP 文件中,我有(只有一个!)行

include '../core/db_io.php';

我把那行注释掉了,效果很好。

此文件包含查询我的数据库的方法。因为我没有从这个文件中调用任何方法或对象,所以我没有注释它 - 认为它没有任何区别。

似乎包含 db_io.php 文件在 JSON 字符串中添加了一个字节顺序标记字符 (\ufeff)。

发送到客户端的完整字符串是

\ufeff{"Name":"Johnny"}

这个 db_io.php 文件似乎是用 BOM 编码的。更改其编码(使用记事本++)解决了这个问题。

一个简单的 include 指令竟然会搞乱 AJAX 调用,真是太神奇了。

【问题讨论】:

  • 你试过$.parseJSON(response_data)成功了吗?
  • 可能输出 [{"Name":"Johnny"}]
  • 从该错误看来,您正在尝试解析已经解析的对象。这真的是完整的代码吗?
  • 奇怪,尝试按照文森特建议的方式检查响应数据。我的猜测是 PHP 在 JSON 字符串之前输出了一些警告/通知或其他内容。
  • 选择POST请求可以查看AJAX调用的响应~

标签: php jquery ajax arrays json


【解决方案1】:

确保您的 PHP 脚本以 <?php 开头

更新 1:

我在本地主机上创建了两个文件 - index.html

<html>
<head>
<script src="//code.jquery.com/jquery-1.10.2.min.js"></script>
</head>
<body>

<script>
$.ajax({
    url: 'pass_array.php',
    method: 'POST',
    data: {test1: 'abc', test2: 'cde'}, //Random input data
    dataType: 'json',
    success: function(response_data)
    {
        console.log(response_data);
    },
    error: function(jqXHR, textStatus, errorThrown) 
    {
        console.log(arguments);
        console.log('Error: ' + errorThrown + ' ' + textStatus + ' ' + jqXHR);
    }
});
</script>
</body>
</html>

pass_array.php

<?php

header('Content-type: application/json; charset=utf-8');

echo json_encode(array("Name" => "Johnny"));

控制台中AJAX调用的结果是:

Object {Name: "Johnny"}

确保 url 正确访问正确的 php 文件。

您可以在 Chrome 的检查器中的“网络”标签下检查任何“XHR”请求 (AJAX)。

【讨论】:

  • 确实如此。除非我将 AJAX 调用更改为具有 JSON 数据,否则代码工作正常
  • 我的代码可以在本地主机上运行。我没有在我的 php 代码中使用header,而是复制了你的 javascript。你用的是什么浏览器?
  • Chrome 和 Firefox。我在两者中都得到了相同的错误。您是否让它与 JSON 数据类型一起使用?
  • 如果你在 Chrome 中打开开发者工具,点击“网络”,然后选择底部的“XHR”,你可以看到正在进行哪些 AJAX 调用。您可能需要刷新页面才能看到 AJAX 调用。
【解决方案2】:

尝试检查您的 ajax 函数是否被触发,以及是否有任何请求被发送到您的 php 代码。例如,您的 ajax 脚本中可能有一些语法,或者您没有提供 php 文件的 url。

【讨论】:

  • 是的,我已经调试过了。我也知道 ajax 成功代码永远不会运行,除非我删除 JSON 数据类型。
  • 如果可能,请张贴您的目录结构。
【解决方案3】:
Error: SyntaxError: Unexpected token

你的“token”变量有问题。你使用 CMS 还是框架?

试试

console.log(arguments);

另外,你可以试试发送

header('Content-type: application/json');

【讨论】:

  • 没有 CMS 或框架,只有 jQuery 和纯 PhP 5.4,带有 Notepad++,我的 Web 服务器是 WAMP - 也许这就是问题所在?
【解决方案4】:

修复它。

在我的 PhP 文件中,我有(只有一个!)行

include '../core/db_io.php';

我把那行注释掉了,效果很好。

此文件包含查询我的数据库的方法。因为我没有从这个文件中调用任何方法或对象,所以我没有注释它 - 认为它没有任何区别。

我仍然不明白 - 我没有以任何方式使用该文件 - 除了包含它。为什么要干涉?

感谢您的想法。和平!

【讨论】:

  • 另外值得一提 - 仅此一条线就在我和 4 小时的头撞墙之间。
  • 查看网络选项卡,包括该文件可能导致输出通知/警告/错误(或其他内容)。
  • 我取消了包含行的注释并检查了网络选项卡日志 - 没有显示错误。我看到 POST 请求,但它们都返回 200 OK。
  • 点击那里的请求并检查新打开的面板中的“响应”选项卡。 =]
  • 我相信您的db_io.php 文件可能使用 UTF 编码并带有 BOM。您可以使用notepad++之类的程序将其编码为UTF-8,无需BOM或十六进制编辑。
猜你喜欢
  • 2014-02-16
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
相关资源
最近更新 更多