4

我正在尝试使用 $.ajax via 尝试一个非常简单的请求并获得响应。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

4 回答 4

3

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);
    }
});
于 2013-07-11T10:09:59.290 回答
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>
于 2013-07-11T09:55:39.550 回答
0

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

希望这会帮助面临同样问题的人。

于 2016-05-03T06:53:50.167 回答
0

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

parseerror返回一个涉及最简单的 PHP 对象的对象,我感到完全莫名其妙:只有一个普通的字符串键和一个短字符串值。

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

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

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

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

有专家愿意发表评论吗?

于 2017-11-05T10:53:02.900 回答