【问题标题】:Getting parseerror while receiving response from json_encode using $.ajax使用 $.ajax 接收来自 json_encode 的响应时出现 parseerror
【发布时间】:2013-07-09 13:07:09
【问题描述】:

我正在尝试通过 $.ajax 尝试一个非常简单的请求并获得响应。 json。我已经尝试了很多从 php 文件中返回一个简单的文本短语。 我的 js 部分代码是这样调用 beemailer.php 来获得响应的。

$.ajax({
        type: 'POST',
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        url: 'beemailer.php',
        data: {
            'name': data_name,
            'email': data_email,
            'message': data_message,
            'subject': data_subject
        },
        success: function (data) {
            var output = jQuery.parseJSON(data);
            console.log(output);
            alert(output);
        },
        error: function (error, x, y) {
            console.log(error);
            alert(x, y);

        }
        )
};

而beemailer.php是这样的:

<?php
    $to = "ashish_sharma307@hotmail.com";
    $subject = $_POST['subject'];
    $message =$_POST['message'];
    $headers = "From:".$_POST['name']."(".$_POST['email'].")";
    mail($to,$subject,$message,$headers);
    $response = "The mail has been sent. Thank You the valid mail.";
     header("Content-Type: application/json; charset=utf-8", true);
     echo json_encode($response);
?>

我现在需要的只是让 $response 文本得到警报。 任何帮助将不胜感激。

【问题讨论】:

    标签: php jquery ajax json


    【解决方案1】:

    因为你说过dataType: "json",jQuery 会在调用你的success 函数之前为你解析JSON,所以你传递给parseJSON 的已经是一个对象图,而不是一个字符串。取消那个电话,而不是使用output,直接使用data

    但是,您从 PHP 返回的不是有效的 JSON 文档,它只是一个 JSON 片段(字符串)。 JSON 文档 必须始终具有顶级对象或数组 (more)。所以你需要将该字符串包装在一个对象或一个数组中。

    另外,请注意您错误地使用了contentType 选项。这定义了您发送的类型,而不是您期望接收的类型。

    例如:

    $response = "The mail has been sent. Thank You the valid mail.";
    header("Content-Type: application/json; charset=utf-8", true);
    echo json_encode(array(message => $response));
    

    ...然后在您的 success 函数中:

    success: function(data) {
        alert(data.message);
    }
    

    请注意我在 PHP (message) 中使用的密钥如何成为客户端上生成的反序列化 JSON 中的密钥。

    这个完整的例子有效:

    PHP (test.php):

    <?php
        $response = 'This is a test message. You sent: ' . $_POST['param'];
        header('Content-Type: application/json; charset=utf8', true);
        echo json_encode(array(message => $response));
    ?>
    

    HTML 和脚本:

    <!doctype html>
    <html>
    <head>
    <title>Test Page</title>
    <meta charset="UTF-8">
    </head>
    <body>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
    <script>
    $.ajax({
        type:    'POST',
        url:     'test.php',
        data:    {param: 'Test param'},
        success: function(data) {
            alert(data.message);
        }
    });
    </script>
    </html>
    

    在下面的评论中你说:

    您能否解释一下...关于为什么我在返回文本时没有收到文本作为响应。

    您返回的是 JSON,它是对象图的文本表示。

    如果你愿意,你当然可以只返回文本。为此,不要涉及 JSON。这是一个示例,但它不能解决您在消息之前获得无关 HTML 输出的问题,这是您的 PHP 中发生的事情:

    PHP (test.php):

    <?php
        header('Content-Type: text/plain; charset=utf-8', true);
        $response = 'This is a test message. You sent: ' . $_POST['param'];
        echo $response;
    ?>
    

    HTML 和脚本:

    <!doctype html>
    <html>
    <head>
    <title>Test Page</title>
    <meta charset="UTF-8">
    </head>
    <body>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
    <script>
    $.ajax({
        type:    'POST',
        url:     'test.php',
        data:    {param: 'Test param'},
        success: function(data) {
            alert(data);
        }
    });
    </script>
    </html>
    

    【讨论】:

    • @accssharma:您是否看到有关您的 PHP 输出无效 JSON 文档的信息?我刚刚进行了编辑,以便为您提供更多指导。
    • 不,我还没有,但一直在研究这个特殊问题。即使将响应包装在数组中,它仍然无法正常工作。
    • 我在做 header("Content-Type: application/json; charset=utf-8", true);这部分正确吗?
    • @accssharma:对我来说很合适。 (如果你有这个,你实际上不需要 jQuery 上的 dataType: "JSON",它会看到 Content-Type。我只是说它是无害的。)
    • @accssharma:我刚刚注意到您在ajax 调用中传递了contentType 选项,这几乎可以肯定是不正确的,所以我已经提到了这一点。我还发布了一个完整的有效示例。
    【解决方案2】:

    ajax 调用中删除以下代码并尝试:

    contentType: "application/json; charset=utf-8",
    

    jQuery.parseJSON(data) 不需要,因为Content-Type 已通过以下代码在json 中设置和编码:

    header("Content-Type: application/json; charset=utf-8", true);
    echo json_encode($response);
    

    使用测试数据更新代码:

    JS

    $.ajax({
        type: 'POST',
        dataType: "json",
        url  : 'beemailer.php',
        data: {name: 'rai', email: 'rai@test.com', message: 'Test message', subject: 'Test subject'},
        success : function(data) {
            console.log(data);
            alert(data);
        },
        error: function(error, x, y)
        {
            console.log(error);
            alert(x, y);
        }
    });
    

    PHP (beemailer.php)

    <?php
    $to = "ashish_sharma307@hotmail.com";
    $subject = $_POST['subject'];
    $message = $_POST['message'];
    $headers = "From:" . $_POST['name'] . "(" . $_POST['email'] . ")";
    mail($to, $subject, $message, $headers);
    $response = "The mail has been sent. Thank You the valid mail.";
    header("Content-Type: application/json; charset=utf-8", true);
    echo json_encode($response);
    ?>
    

    对象示例:

    $result = array();
    $result['status'] = 'success';
    $result['message'] = 'The mail has been sent. Thank You the valid mail.';
    header("Content-Type: application/json; charset=utf-8", true);
    echo json_encode($result);
    

    JS 访问对象:

    $.ajax({
        type: 'POST',
        dataType: "json",
        url  : 'beemailer.php',
        data: {name: 'rai', email: 'rai@test.com', message: 'Test message', subject: 'Test subject'},
        success : function(data) {
            alert('status: ' + data.status + '\nmessage: ' + data.message);
        },
        error: function(error, x, y)
        {
            console.log(error);
            alert(x, y);
        }
    });
    

    【讨论】:

    • 试过了,但即使在数组包装中得到响应后,也会收到未定义的数据警报。连同以下回应。 ......... 1 0.0002 680008 {main}( ) ..\beemailer.php:0 {"消息":"邮件已发送。谢谢您的有效邮件。"}
    • 这意味着你的beemailer.php文件中有错误,可能是因为mail function
    • 我刚刚评论了 mail() 函数并返回了一个简单的文本作为响应,但仍然无法正常工作。
    • 我已经更新了答案,试试Updated code with test data:
    • 感谢 manoj,在尝试了不同的技术之后,使用您建议的上述代码,一切都很好,但我们需要在对象包装中返回 $response 让我们说一个数组为 $array = array($回复);回声 json_encode($array);并以 alert(output[0]) 的形式成功提醒数据。对于我的特殊情况,我开始知道我可以使用 dataType: 'text' 并以我和你返回的方式返回响应。
    【解决方案3】:

    您的服务器可能已返回通知/警告。请在某个时候禁用您的错误报告以进行测试。 error_reporting(0),这在 php 5.4 中对我有用。

    希望这对面临同样问题的人有所帮助。

    【讨论】:

      【解决方案4】:

      我刚刚发现了一些关于 PHP json_encode 和 JS AJAX parseerror 的疯狂之处。如果它对一个人有帮助,那么我将其包括在此处是合理的。

      parseerrors 返回一个涉及最简单的 PHP 对象的对象:只有一个普通的字符串键和一个短字符串值。

      当我在我的代码中添加开发日志消息时,我通常会在消息的开头添加一个“£”,只是为了有时更容易找到它们。无意中我在这条消息的开头放了一个“£”以返回给 JS AJAX 处理......它是 THIS 导致parseerror

      我个人认为这是一个错误......并且很惊讶在 2017 年发现它。我不知道为什么前导“£”可能会产生这种效果,并且(自然地)想知道其他字符(前导或其他字符)是否) 可能会导致parseerror

      我刚刚对此进行了搜索,发现一个人提到了英镑符号 here (2011) 的问题。

      当您向mysqli 提交 SQL 语句时,您必须将它们通过转义函数...这种经验让我想知道从 PHP 到 JS AJAX 处理程序的字符串是否可能不需要转义函数... ?

      有专家愿意发表评论吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        • 1970-01-01
        • 2017-05-20
        • 1970-01-01
        • 2020-05-13
        相关资源
        最近更新 更多