jQuery - $ .ajax成功回调数据为空

时间:2011-04-14 01:44:37

标签: php jquery ajax

我正在使用jQuery $ .ajax将简单的联系表单发布到php脚本。我正在尝试评估响应并基于此,要么用“谢谢”消息替换整个表单,要么用问题填充“错误”div。成功回调被调用,所以(我认为)没有错误,但数据仍然是空的。

jQuery代码:

$(document).ready(function() {
    $("input[type='submit']").click(function(event) {
        event.preventDefault();
        var name = '#' + $(this).closest('form').attr('name');
        $.ajax({
        url: "ajax/index1.php",
        type: "POST",
        data: $(name).serialize(),
        success: function(data) {
            alert(data);
            if (data == 'yes') {
                $('#error').html(data);
            } else {
                $(name).html(data);
            }
        },
        error: function(jqXHR, textStatus, errorThrown) {
            alert(textStatus);
        }
        });
    });
});

我很确定Success函数(不是错误1)正在运行,因为即使我删除了错误函数,我也会收到警报。此外,如果我删除该警报线,我不会收到任何警报。并且表单内容将被替换为空div,因此看起来它运行顺畅。

另外,如果我将“alert(data)”替换为“alert('hello')”确实显示。所以数据是空的!

如果我尝试直接发布表单(没有jQuery),我会从php页面得到回复 - “请输入你的名字。请输入你的电子邮件。请输入你的公司。”或者“谢谢!您的邮件已经提交。”

一切都在同一个领域。

为何数据为空?在过去的6个小时里,我无法理解这一点。

我没有设置任何全局ajax设置。在发布之前,我还尝试使用JSON,就像其中一个答案和相同的结果 - 空响应一样。我也试过xml。

index1.php有大量与网站上其他表单相关的代码。它的要点:

if (!isset($_POST['submit'])) exit();
if (isset($_POST['submit'])) {
    switch (basename($_SERVER['HTTP_REFERER'])) {
//define required fields, fields to e-mail in the form, success message, form div id...
    }
}
if (is_array($required)) {
    $errors = array();
    foreach ($required as $req) {
        $error = '';
        if (empty($_POST[$req])) {
            switch ($req) {
//adjust error message based on name of field...
                    default: $error = 'Please enter your ' . $req . '.';
            }
            $errors[] = $error;
        }
    }
}
    if (empty($errors) && is_array($fields)) {
        //decide to which e-mail address to send everything based on the form input
       $headers = "From: ...";
       $subject = "Inquiry";
    $body = "The following information was submitted:\n\n";
    foreach ($fields as $a => $b) {
        if (is_array($_POST[$a])) {
            $body .= sprintf("%s: %s\n", $b, stripslashes(implode(', ', $_POST[$a])));
        } else {
            $body .= sprintf("%s: %s\n", $b, stripslashes($_POST[$a]));
        }
    }
    $send = mail($to, $subject, $body, $headers);
    if (!$send) $msg = 'We encountered an error sending your message, please go back and try again. If the problem persists, please call us.';
}
$error = 'no';
if (is_array($msg)) {
    $msg = implode(' ', $msg);
    $error = 'yes';
}
header('Content-type: text/html');
echo $error . ' ' . $msg;
}

我显然要将最终文本更改为可以实际解析的内容,但此时我只是想在成功回调中显示一些内容。

一想法 - $ _SERVER ['HTTP_REFERER']可能是我的问题吗?我正在从原型转换,这不是问题,所以我认为这是理所当然的。如果有,有办法确定提交表单的页面吗?

[更新]尝试在$ _SERVER ['HTTP_REFERER']开关语句下添加“默认”方案无效,所以我猜这不是问题。

2 个答案:

答案 0 :(得分:2)

您的 AJAX 的问题在于您要覆盖默认的提交按钮操作,因此提交按钮并不真正提交数据, Javascript < / em>这样做并查看 Javascript 代码,调用 PHP 页面时永远不会设置$_POST['submit']

var name = '#' + $(this).closest('form').attr('name');
    ...
    data: $(name).serialize(),

此处发送的唯一 POST 信息是变量name,尝试发送带有某个值的submit字段,您会看到不同的响应。

您还可以检查这是否真的发生了exit()更改die('empty submit')

答案 1 :(得分:0)

尝试添加dataType: "text"选项和下面的完整回调以检查您的回复

complete: function(xhr, status) {

        alert(xhr.responseText);    
}