- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个PHPMailer表单,并且正在使用.ajax使用此SO答案jquery-ajax-post-example-with-php
它是成功发送还是不发送,所以我知道Mailer和验证码正在工作。现在,如果我能因成功和失败而采取不同的行为,那将是很好的,但我并没有以某种方式正确地做到这一点。
首选行为
成功->重新加载屏幕并显示带有成功消息的引导程序模式
失败->重新加载屏幕并显示带有失败消息的引导模式
我有很多代码,请尽可能多地考虑模式,而PHPMailer实际上也正在发送。我遇到的问题应该在下面的代码中,但是如果您还有其他问题,请询问。试图使问题尽可能整洁
<script type="text/javascript">
$(document).ready(function() {
var request;
$("#contactForm").submit(function(event){
event.preventDefault();
// Abort any pending request
if (request) {
request.abort();
}
// setup some local variables
var $form = $(this);
// Let's select and cache all the fields
var $inputs = $form.find("input, select, button, textarea");
// Serialize the data in the form
var serializedData = $form.serialize();
// Let's disable the inputs for the duration of the Ajax request.
// Note: we disable elements AFTER the form data has been serialized.
// Disabled form elements will not be serialized.
$inputs.prop("disabled", true);
request = $.ajax({
url: "processLogin.php",
type: "post",
data: serializedData
});
// Callback handler that will be called on success
request.done(function (response, textStatus, jqXHR){
if (response == true ) {
top.location.reload();
// top.location.href="/";
// $('#successEmail').modal('show');
} else {
// top.location.reload();
$('#failEmail').modal('show');
}
});
// Callback handler that will be called on failure
request.fail(function (jqXHR, textStatus, errorThrown){
// Log the error to the console
// console.error(
// "The following error occurred: "+
// textStatus, errorThrown
// );
// top.location.reload();
});
// Callback handler that will be called regardless
// if the request failed or succeeded
request.always(function () {
// Reenable the inputs
$inputs.prop("disabled", false);
});
});
});
</script>
<?php
session_start();
?>
<?php
/**
* This example shows how to handle a simple contact form.
*/
$msg = '';
use PHPMailer\PHPMailer\PHPMailer;
require './mail/PHPMailer.php';
require './mail/Exception.php';
require './mail/SMTP.php';
require './mail/PHPMailerAutoload.php';
include_once $_SERVER['DOCUMENT_ROOT'] . '/securimage/securimage.php';
$securimage = new Securimage();
//Don't run this unless we're handling a form submission
if (array_key_exists('email', $_POST)) {
date_default_timezone_set('Etc/UTC');
//Create a new PHPMailer instance
$mail = new PHPMailer;
$mail->SMTPDebug = 0;
$mail->isSMTP();
$mail->Host = 'smtp.live.com';
$mail->SMTPAuth = true;
$mail->Username = 'email@outlook.com';
$mail->Password = 'password';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('email@outlook.com', 'Mailer');
$mail->addAddress('email@outlook.com', 'First Last');
$email = isset($_POST['email']) ? $_POST['email'] : null;
$name = isset($_POST['name']) ? $_POST['name'] : null;
$phone = isset($_POST['phone']) ? $_POST['phone'] : null;
$message = isset($_POST['message']) ? $_POST['message'] : null;
if ($mail->addReplyTo($_POST['email'], $_POST['name'])) {
$mail->Subject = 'Contact request';
$mail->isHTML(true);
$mail->Body = <<<EOT
<div style="width:100%">
<div><label style="color: #044F69; font-weight:bold">Email:</label> <span>{$_POST['email']}</span></div>
<div><label style="color: #044F69; font-weight:bold">Name:</label> <span>{$_POST['name']}</span></div>
<div><label style="color: #044F69; font-weight:bold">Phone:</label> <span>{$_POST['phone']}</span></div>
<div><label style="color: #044F69; font-weight:bold">Message:</label> <span>{$_POST['message']}</span></div>
</div>
EOT;
if ($securimage->check($_POST['captcha_code']) == false) {
// echo "<meta http-equiv='refresh' content='0'>";
exit;
}
//Send the message, check for errors
if (!$mail->send()) {
$msg = 'Sorry, something went wrong. Please try again later.';
} else {
header("Location: /");
exit;
}
} else {
$msg = 'Invalid email address, message ignored.';
}
}
?>
最佳答案
您选择了一个相对困难的示例进行学习。成功/失败后重新加载意味着您需要引入会话或cookie或URL参数以跟踪请求之间的状态。您需要正确处理几个运动部件。您必须有这样做的理由,但是如果您无需重新加载就可以脱身,这将简化事情,并且可能会带来更好的用户体验。我在以下两个选项中都包含了信息。
首先,PHP。您有几种可能的退出状态,具体取决于电子邮件是否已成功发送等,但它们的处理方式不一致。在一种情况下,它会进行重定向,在某些情况下,它会以静默方式退出。所有情况应保持一致;无论发生什么情况,对该PHP页面的请求均应生成一个响应,并且最好将该响应传递回调用Java脚本,以便它可以对发生的任何事情进行处理。
似乎您开始进行设置,但未完成设置-您准备了一个$msg
包含发生了什么的信息,但从未显示过,并且$msg
在一些退出案例中完全丢失了(特别是成功情况以及验证码失败的情况)。
除了您的$msg
外,我还将添加一个status
标志,以便JS可以轻松判断请求是否成功;由于您正在用JS阅读此响应,因此我将其设为JSON。
请注意,由于您想在成功/失败两种情况下都重新加载页面,严格来说,JSON响应并不是真正必要的,但我认为这是一个好习惯,并且将有助于开发过程中的调试。
为了确保每个退出条件都能生成标准响应,我不得不将实际的邮件发送代码嵌套在CAPTCHA测试中。该IMO有点混乱,我个人将进行重组,以returning early简化各种条件的测试,因此您最终不会进行3-4个嵌套测试。例如,不要将所有内容嵌套在array_key_exists('email', $_POST)
测试中,而是测试相反的内容(如果没有电子邮件值),并在失败时立即退出。
// Don't run this unless we're handling a form submission
if (!array_key_exists('email', $_POST)) {
// Generate response and bail out!
echo $some_response_or_whatever;
die();
}
$mail->send()
嵌套在CAPTCHA条件内;
$response
,其中包含用于验证码失败的相应消息;
$response
;
status
标志;
$response
添加到会话中,以便在页面重新加载后可用;
<?php
session_start();
// ... your code
//Don't run this unless we're handling a form submission
if (array_key_exists('email', $_POST)) {
// ... your code
if ($mail->addReplyTo($_POST['email'], $_POST['name'])) {
// ... your code
if ($securimage->check($_POST['captcha_code']) == false) {
// Generate a response in this failure case, including a message and a status flag
$response = [
'status'=> 1,
'msg' => 'CAPTCHA test failed!'
];
} else {
//Send the message, check for errors
if (!$mail->send()) {
// Generate a response in this failure case, including a message and a status flag
$response = [
'status'=> 1,
'msg' => 'Sorry, something went wrong. Please try again later.'
];
} else {
// Generate a response in the success case, including a message and a status flag
$response = [
'status'=> 0,
'msg' => 'Success!'
];
}
}
} else {
// Generate a response in this failure case, including a message and a status flag
$response = [
'status'=> 1,
'msg' => 'Invalid email address, message ignored.'
];
}
}
// Add the response to the session, so that it will be available after reload
$_SESSION['response'] = $response;
// Finally display the response as JSON so calling JS can see what happened
header('Content-Type: application/json');
echo json_encode($response);
?>
request.done(function (response, textStatus, jqXHR){
// You could test the response here, but since both success and failure
// should reload, there is no point.
window.location.reload();
// If you did want to test response and act on it, here's how to do that:
/*
if (response.status == 0) {
// Success! Do something successful, like show success modal
$('#successEmail').modal('show');
} else {
// Oh no, failure - notify the user
$('.message').html(response.msg);
}
*/
});
fail
情况下会发生什么。请注意,当请求失败(例如404或超时等)时,将触发
fail
回调,而不是在触发失败情况之一(如无效电子邮件)时触发。在这种情况下,我只会在前端生成一个味精,而无需重新加载:
request.fail(function (jqXHR, textStatus, errorThrown){
// Say you have a <div class="message"></div> somewhere, maybe under your form
$('.message').html('Error: ' + textStatus + ', ' + errorThrown)
});
$(document).ready( ...
内:
<script>
$(document).ready(function() {
var request;
// ... your code
<?php
// New PHP/JS to handle what happens when the page reloads
if (isset($_SESSION['response'])) {
if ($_SESSION['response']['status'] == 0) { ?>
// Success!
$('#successEmail').modal('show');
<?php } else { ?>
$('#failEmail').modal('show');
<?php }
// In both cases we need to clear the response so next reload does not
// fire a modal again
unset($_SESSION['response']);
} ?>
});
</script>
$_SESSION['response']['msg']
在模态中访问成功/失败消息的内容。
<script>
<?php if (isset($_SESSION['response'])) { ?>
// First add the message to the modal, assuming you have a
// <div class="message"></div> in your modal
$('#modal .message').html('<?php echo $_SESSION['response']['msg']; ?>');
// Now open the one modal to rule them all
$('#modal').modal('show');
<?php
unset($_SESSION['response']);
} ?>
</script>
Abort any pending request
是否确实在做您想要的事情。
request
已在文档准备就绪时声明,因此它始终存在,AFAICT?
关于javascript - 在PHPMailer上成功/失败的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47718523/
我在使用以下代码时遇到问题: function http_file_exists($url){ $f=fopen($url,"r"); if($f){ fclose($f); retu
我已经通过 Git 部署到 Azure 几个月了,没有出现重大问题,但现在我似乎遇到了一个无法克服的错误。 我创建了一个新的 Azure 网站,为正在开发的项目创建单独的预览链接。我在新站点上设置了
我已经通过flutter创建了一个App并完成了它,我想在flutter文档中阅读时进行部署。 我收到此错误: FAILURE: Build failed with an exception. * W
我在Windows 10中使用一些简单的Powershell代码遇到了这个奇怪的问题,我认为这可能是我做错了,但我不是Powershell的天才。 我有这个: $ix = [System.Net.Dn
我正在尝试使用 RapidJSON 解析从服务器接收到的数据。以下是收到的确切字符串: [ { "Node": "9478149a08f9", "Address": "172.17
我尝试为 ios 编译 OpenCV。我总是收到这些错误。我用不同版本的opencv试了一下,结果都是一样的。 我运行这个:python 平台/ios/build_framework.py ios_o
我在一台机器上做基本的发布/订阅,我的客户端是 StackExchange-Redis 的 C# 客户端,我在同一台机器上运行基于 Windows 的 Redis 服务器(服务器版本 2.8.4) 当
我有这段代码,但无法执行,请帮我解决这个问题 连接 connect_error) { die ("connection failed: " . $terhubung->connect_erro
我在 tomcat 上运行并由 maven 编译的 Web 应用程序给出了以下警告和错误。我可以在本地存储库中看到所有 JAR,但有人可以帮忙吗。 WARNING: Failed to scan JA
我正在 Windows 8 上使用 Android Studio 开发一个 android 应用程序,我正在使用一些 native 代码。突然间我无法编译我的 C 文件。当我运行 ndk-build
下面的代码对类和结构的成员进行序列化和反序列化。序列化工作正常,但我在尝试使用 oarch >> BOOST_SERIALIZATION_NVP(outObj); 反序列化时遇到了以下错误; 代码中是
如果我运行此命令“rspec ./spec/requests/api/v1/password_reset_request_spec.rb”,此文件中的所有测试都会通过。 但是,当我运行“rspec”时
我在尝试执行测试以使用 Protractor 上传文件时出错,我的代码是这个 it('it should be possible to upload a file', function() {
System.loadLibrary("nativefaceswap"); 当我运行我的应用程序时,我在 Android Studio 中发现了此类错误。在logcat中显示: java.lang.U
我希望有人能帮助我!使用任何方法或命令行的任何 SSL/HTTPS 调用均无效。 我在 Windows 10 中使用 Ubuntu Server 18.04 作为子系统。我的问题是昨天才开始出现的,因
通过删除这两个值将日期字段从 null=True 和 Blank=True 更改为 required 时,使用 db.alter 命令时遇到问题。 当以下行被注释掉时,迁移运行不会出现问题。
我第一次使用 Heroku 尝试创建应用程序(使用 SendGrid 的 Inbound Parse Webhook"和 Twilio SMS 通过电子邮件发送和接收 SMS 消息)。通过 Virtu
我正在将我的 swift 项目更新到 Xcode 7 上的 Swift 2.0。xcode 在构建项目时报告了以下错误: 命令/Applications/Xcode.app/Contents/Deve
在我的代码中,SSL 库函数 SSL_library_init() 没有按预期返回 1。我如何才能看到它返回了什么错误? 我在 SSL_library_init() 之后调用了 SSL_load_er
我正在尝试运行在以下链接中找到的答案: Asynchronously Load the Contents of a Div 但是当我这样做时,我会遇到我不太理解的错误。 我的代码: $(documen
我是一名优秀的程序员,十分优秀!