问题描述
|
我正在使用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);
}
});
});
});
我非常确定成功功能(不是错误一个)正在运行,因为即使删除了错误功能,我也会收到警报。另外,如果我删除该警报行,则不会收到任何警报。表单内容被替换为空的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\",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 \']是我的问题吗?我要从原型切换到那里,这不是问题,所以我在这里理所当然。如果是这样,是否有办法识别提交表单的页面?
[UPDATE]尝试在$ _SERVER [\'HTTP_REFERER \'] switch语句下添加\“ default \”方案无济于事,所以我想这不是问题。
解决方法
AJAX的问题在于,您将覆盖默认的Submit按钮操作,因此Submit按钮实际上不会提交数据,执行该操作的Javascript并查看Javascript代码,在调用PHP页面时将永远不会设置
$_POST[\'submit\']
:
var name = \'#\' + $(this).closest(\'form\').attr(\'name\');
...
data: $(name).serialize(),
仅在此处发送的POST信息是变量name
,尝试发送带有某些值的with5ѭ字段,您将看到不同的响应。
您还可以检查将ѭ6更改为die(\'empty submit\')
是否确实在发生。
,尝试添加dataType: \"text\"
选项和下面的完整回调以检查您的响应
complete: function(xhr,status) {
alert(xhr.responseText);
}