【问题标题】:Detect if a PHP exception occurred and output flash message based off that exception检测是否发生 PHP 异常并根据该异常输出 flash 消息
【发布时间】:2019-12-18 21:52:46
【问题描述】:

我正在使用 Swiftmailer 发送电子邮件,我目前有一个 try/catch 块来查看基于 Swift_RfcComplianceException 的电子邮件地址是否有效。我目前捕捉到错误并在屏幕上输出 $e->getMessage() 错误。在电子邮件的表单提交中,如果电子邮件发送成功,我设置了一个变量来吐出成功消息。

问题:如何根据我的 Swiftmail 文件是否捕获到异常,使用相同的 flash 消息区域输出错误消息。以及如何使这发生在同一页面上?我没有使用 AJAX,而是使用 Page Post Back。现在我得到的只是一个带有文本的白屏,我希望错误消息是提交表单的位置。谢谢。

HTML

<?php if(isset($_SESSION['message'])):?>
            <div id="success-alert" class="alert alert-success text-center">
                <?php
                    echo $_SESSION['message'];
                    unset($_SESSION['message']);
                ?>
            </div>

        <?php elseif(isset($_SESSION['email_error'])) :?>
            <div id="success-alert" class="alert alert-success text-center">
                <?php
                    echo $_SESSION['email_error'];
                    unset($_SESSION['email_error']);
                ?>
            </div>
        <?php endif; ?>

Swiftmailer

try {
    // Create a message
    $message = (new Swift_Message($_POST['subject']))
        ->setFrom('ME@YOU.COM')
        ->setTo($finalEmailList) //Array of email address
        ->setBody($_POST['message'], 'text/html')
        ->setReplyTo('you@me.com');
} catch (Swift_RfcComplianceException $e) {
    print($e->getMessage());
}

PHP

if (isset($_POST['submit_email'])) {
        require_once 'views/Swiftmail.php';
        $_SESSION['message']= "Email Sent Successfully";
        $_SESSION['email_error'] = "Invalid Email Address Entered";
}

【问题讨论】:

  • 究竟是什么阻止了您以同样的方式设置消息?
  • 如果一封电子邮件成功通过,则会出现成功消息,因此它会重定向回同一页面,然后会吐出一条消息。如果电子邮件发送失败,异常会停止表单提交,并且基本上会死在异常捕获块上,只是吐出错误消息,而不继续返回提交表单的同一页面
  • 在异常块中回显所需的元素..?
  • @Laif,你的意思是上面的 html div(错误)?
  • "异常停止表单提交" 不,它没有。那时表格已经提交。 catch 之后的所有事情仍然会发生(除非你在 catch 中明确地 dieexit,你上面的代码没有显示你在做什么)。所以只需在catch 中设置您的错误消息。

标签: php html swiftmailer


【解决方案1】:

您只需从“主要”PHP 代码中移动错误消息设置行...

session_start();
if (isset($_POST['submit_email'])) {
    require_once 'views/Swiftmail.php';
}

到您的 Swiftmail.php 文件...

try {
    // Create a message
    $message = (new Swift_Message($_POST['subject']))
        ->setFrom('ME@YOU.COM')
        ->setTo($finalEmailList) //Array of email address
        ->setBody($_POST['message'], 'text/html')
        ->setReplyTo('you@me.com');
    $_SESSION['message']= "Email Sent Successfully";
} catch (Swift_RfcComplianceException $e) {
    $_SESSION['email_error'] = "Invalid Email Address Entered";
}

仅供参考,大多数现代 PHP 框架都内置了 Flash 消息组件。

【讨论】:

  • 所以在我的“主 PHP”中,我是否只删除 2 $_SESSION['message'] 和 $_SESSION['email_error'] 但保留 if (isset($_POST['submit_email'] )) { require_once 'views/Swiftmail.php'; } 在主要?
  • 现在我收到此错误:“未定义变量:第 54 行的消息”,即这一行:“$result = $mailer->send($message);”
  • 嗯,这不在您上面的代码中,听起来像是一个不同的问题/问题。但是您似乎需要备份并学习一些基本的调试技能。 “未定义的变量”错误正是他们所说的;您正在尝试使用尚未定义的变量(至少不在您尝试使用它的 scope 内)。有关此类错误的问题几乎总是作为this 的重复而关闭。
  • 不客气。请注意对我上述评论的修改。
猜你喜欢
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
相关资源
最近更新 更多