我正在使用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']开关语句下添加“默认”方案无效,所以我猜这不是问题。
答案 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);
}