【发布时间】:2011-08-11 06:12:32
【问题描述】:
我是一名 WordPress 设计师,我为我的一个主题开发了一个联系表单,该表单已通过 jQuery 进行验证。
请检查下面的代码,然后阅读下面的说明。
$('.submitemail') .click(function() {
//VALIDATION CODE GOES HERE
if ( /*VALIDATED SUCCESSFULLY*/ ) {
$.ajax({
type: 'POST',
url: templatePath+'/lib/scripts/sendEmail.php',
data: 'visitorname=' + visitorname + '&visitoremail=' + visitoremail + '&visitormessage=' + visitormessage,
success: function(contactResults) {
//SUCCESS CODE
}
});
}
});
注意事项:
- sendEmail.php 是一个使用 PHPmailer 类发送电子邮件的正确脚本。
- templatePath 变量具有完整模板路径的值,如下所示:http://somedomain.com/wp-content/themes/themename
- 上面的jQuery代码位于lib/scripts/jfunctions.js(与php脚本相同的目录)
- 整个过程(ajax 和 php)在许多服务器上都按预期完美运行,(我在两台服务器上测试,我的主题用户在其他服务器上测试)。
问题:
在某些服务器中,成功处理程序不会触发,而对 sendEmail.php 的 ajax 调用实际上已成功传递并处理 php 脚本并发送电子邮件。
当我用firebug检查为什么没有触发成功处理程序时,firebug显示“未找到404错误”,这就像一个误报。
可能的原因:
我认为某些服务器已配置为阻止此类 ajax 调用。
这个奇怪问题的原因可能是什么?如何解决?
提前致谢。
@nowk:sendEmail.php 代码是:
<?php
// Code for loading WordPress environment goes here //
$themeName_optionTree = get_option('option_tree');
$name = trim($_POST['visitorname']);
$email = $_POST['visitoremail'];
$message = $_POST['visitormessage'];
$site_owners_email = $themeName_optionTree['owner_email'];
$site_owners_name = $themeName_optionTree['owner_name'];
$email_subject = $themeName_optionTree['email_subject'];
$success_message = '<p class="success-box">' . $themeName_optionTree['success_message'] . '</p>';
if (strlen($name) < 2) {
$error['name'] = 1;
}
if (!preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $email)) {
$error['email'] = 1;
}
if (strlen($message) < 2) {
$error['message'] = 1;
}
if (!$error) {
require_once('PHPMailer_v5.1/class.phpmailer.php');
$mail = new PHPMailer(true);
try {
$mail->From = $email;
$mail->FromName = $name;
$mail->Subject = $email_subject;
$mail->AddAddress($site_owners_email, $site_owners_name);
$mail->Body = $message;
$mail->Send();
echo $success_message;
} catch (phpmailerException $e) {
echo '<p class="warning-box">' . $e->errorMessage() . '</p>';
} catch (Exception $e) {
echo '<p class="warning-box">' . $e->getMessage() . '</p>';
}
}
?>
请注意,即使ajax返回404,上面的代码也能完美执行,很奇怪啊!。
【问题讨论】:
-
你能添加接收这个ajax请求的文件的代码吗?
-
AJAX 调用应始终具有响应正文。当请求结束但没有收到数据时,一些浏览器会感到困惑。只需在最后回显“OK”或“ERROR”或其他内容。任何事物。也便于调试。
-
Rudie 完全正确 - 如果我只返回某种数据,过去我可以避免无数问题。最糟糕的是,我知道许多插件和库依赖于返回的数据而不是响应代码(例如,malsup 的表单插件)。如果您不想返回结构化 XML/JSON,请始终返回至少一个字符。另外 - 我们有没有机会在某个 URL 上看到这一点?
-
@Rudie,@Lev,谢谢。实际上,您可以在 $mail->Send(); 之后看到一条响应消息有 echo $success_message;它被返回,但它没有显示出来,因为 ajax 的成功处理程序在 404 错误后失败。如果这不是你的意思,请告诉我。
-
@mobi 你说得对!我看到 $success_message 不是空的。使用 Firebug 或 Chrome Inspector(或其他开发工具),你能看到整个响应吗?必须有一个 HTTP 代码和标头以及(可能)一个正文。即使有(服务器)错误。与我们分享? =)
标签: php jquery ajax wordpress http-status-code-404