使用$ .ajax从json_encode接收响应时获取parseerror

时间:2013-07-11 09:54:22

标签: php jquery ajax json

我正在尝试使用$ .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文本得到警告。 任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:3)

ajax电话中移除以下代码并尝试:

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

jQuery.parseJSON(data)不需要,因为Content-Typejson中通过以下代码进行设置和编码:

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 :(得分: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>

答案 2 :(得分:0)

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

希望这能帮助遇到同样问题的人。

答案 3 :(得分:0)

我刚刚发现了一些关于PHP json_encode和JS AJAX parseerror的绝对疯狂的事情。如果它能帮助一个人证明我在这里包括它。

我完全无法理解parseerror s返回一个涉及最简单的PHP对象的对象:只是一个普通的字符串键和一个短字符串值。

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

我个人认为这是一个错误......我很惊讶于2017年找到它。我不知道为什么一个领先的“£”可能会产生这种效果,并且(自然地)想知道其他角色(领先或其他) )可以产生parseerror

的效果

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

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

任何专家都在评论?