jQuery AJAX返回200状态,但是出现了神秘的语法错误

3

当我使用jQuery AJAX时,返回状态码为200。但是,我也从某个地方得到了语法错误。我像这样发布到PHP:

function submit_order(orderInformation) {
    $.ajax({
        type: 'post',
        url: 'queries/submit_order.php?<?=time();?>',
        data: 'orderInformation=' + JSON.stringify(orderInformation),
        dataType: 'json',
        success: function (returnedData) {
            console.log(returnedData);
            $('#content_container').fadeOut(340, function () {
                var new_content = $('#content_container').clone(false);
                $('#content_container').remove();
                new_content.css('display', 'none');
                new_content.children().remove();

                new_content.appendTo('body');
                $('#content_container').vkTemplate('templates/confirm_template.tmpl?<?=time()?>', returnedData, function (el, data, context) {
                console.log('success'); 

                    $('#content_container').fadeIn(340);
                });
            });
        },
      error: function (xhr, ajaxOptions, thrownError) {
        console.log(xhr.status);
        console.log(thrownError);
      }
    });
}

我的PHP代码非常简单:

$order_information = json_decode($json_str, true);

//go through the array and make an email out of it
//add a few elements to the array
//send the email

//send back a json string with the added elements
echo json_encode($order_information);

然而我收到了这个:

错误截图

而且奇怪的是,如果我从console.log(JSON.stringify(orderInformation))中复制并粘贴JSON字符串到PHP页面中:

$json_str = '{"sector_0":{"file":[],"sector_info":{"sector_label":"NIO","purchase_order":"test","proof":false},"lines":{"line_0":{"description":"test","quantity":"2","productId":"1","addressId":"20","shipViaId":"1","notes":false}}}} ';

一切都能正常运行。这个错误是什么?错误中出现的<是从哪里来的呢?

谢谢。


6
200 不是错误,而是来自 Web 服务器的正常响应。 - Codeguy007
你尝试在浏览器中打开queries/submit_order.php?<?=time();?>或者用Firebug检查服务器返回的内容了吗?看起来你有一个语法错误或其他问题,服务器返回了HTML。 - E_p
@Codeguy007 那么为什么将其打印到日志中会在“error”回调上触发?谢谢! - 1252748
1
<?=time();?> 绝对不起作用,因为您无法在客户端运行php。 - Codeguy007
1
你检查了服务器返回的内容吗?原始响应。 - E_p
显示剩余12条评论
3个回答

4
这里是您的错误处理程序,它被触发并记录以下信息:
  • xhr.status (200)
  • thrownError (语法错误)
请注意,使用dataType: json$.ajax即使服务器返回200 OK但响应无效JSON时,也会触发错误处理程序。语法错误不在您的JavaScript代码中,而在JSON中。找出<来自哪里,并确保您的PHP脚本发送有效的JSON。
提示:打开控制台并查看网络选项卡;所有XHR都将与头和正文一起记录在那里。

非常感谢。我发现语法错误来自于PHP打印出 <br /> <b>Warning</b>: Invalid argument supplied for foreach() in <b>/public_html/bch/queries/submit_order.php</b> on line <b>54</b><br />因此是由于 < 导致的。但是我不明白 foreach 循环有什么问题,它的代码是这样的 foreach ( $order_information as $sector_index => &$sector_value ){ - 1252748
这是一个 PHP 问题 :) 您可以将其发布为另一个问题或忍者编辑您的问题。 PS:$order_information 很可能不是一个数组。 - Salman A
PHP在字符串中添加了斜杠:/ stripslashes 可以解决这个问题。它是否总是这样做?感谢您的帮助! - 1252748

3

200 - 是服务器的一个良好响应 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

您的响应中存在语法错误,服务器返回的json无效。

由于您的PHP代码看起来没问题,可能有其他原因。可能是语法错误或框架返回的JSON被包裹在HTML中......

使用适当的工具查看服务器返回了什么内容(例如:火狐浏览器上的firebug或者谷歌浏览器上的开发人员工具)

在您的图像上可以看到0:"<",这意味着返回字符串以<开头,即返回的是HTML。

看起来您使用的是Chrome浏览器。请转到Chrome浏览器上的“网络”选项卡,您应该能够看到所请求的原始响应。

所以这是一个PHP错误:

$sector_index不可迭代,请使用var_dump查看它是什么?


现在检查一下是否在你的 $sector_index 中。由于 PHP 不知道如何迭代它。 - E_p
PHP 由于某种原因在接收到 JSON 字符串时添加了反斜杠。我不知道它是否总是这样做,但 stripslashes 似乎已经解决了这个问题。感谢您的指导 :) - 1252748

-2

看起来 <?=time()?> 没有被处理。 在发布之前提醒 URL 进行验证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接