致命错误:无法重新声明PHPMailerAutoload()

时间:2015-08-07 20:21:57

标签: php phpmailer

我正在使用PHPMailer从本地主机发送电子邮件。

我编写了一个函数,该函数应该向选择接收它们的注册用户发送电子邮件。 (即订阅电子报等)

function email_users($subject, $body) {
    include('core/db/db_connection.php');
    $sql = "SELECT email, first_name FROM `_users` WHERE allow_email = 1";
    $query = mysqli_query($dbCon, $sql);
    while (($row = mysqli_fetch_assoc($query)) !== false) {
        $body = "Hello ". $row['first_name'] . ", <br><br>" . $body;
        email($row['email'], $subject, $body);
    }
}

调用函数的代码:

if (isset($_GET['success']) === true && empty($_GET['success']) === true) {
        ?>
            <h3 class="email_success">Emails have been sent</h2>
            <a href="admin.php" class="email_success_a">Go back to the admin page</a>
        <?php 
        } else {
            if (empty($_POST) === false) {
                if (empty($_POST['subject']) === true) {
                    $errors[] = 'A message subject is required.';
                }
                if (empty($_POST['body']) === true) {
                    $errors[] = 'A body message is required.';
                }
                if (empty($errors) === false) {
                    echo output_errors($errors);
                } else {
                    email_users($_POST['subject'], $_POST['body']);
                    header('Location: email_users.php?success');
                    exit();
                }
            }
// generate email form otherwise

我知道为什么会收到此错误?

  

致命错误:无法重新声明PHPMailerAutoload()

我还想指出,即使出现此错误,该功能仍然有效并且正在发送电子邮件......

编辑:根据要求,请参阅以下使用PHPMailer的函数:

function email($user, $subject, $body) {
    require 'phpmailer/PHPMailerAutoload.php';
    $mail = new PHPMailer;

 /* $mail -> Host,username,password and other misc stuff
    $mail->Subject = $subject;
    $mail->Body    = $body;
    $mail->AltBody = $body; etc */
}

2 个答案:

答案 0 :(得分:3)

如果您使用

  

要求'phpmailer / PHPMailerAutoload.php';

在你的函数中,但你调用该函数2次,它将重新声明该类。只需使用require_once()代替。

require_once('phpmailer/PHPMailerAutoload.php');

答案 1 :(得分:1)

经过大量测试后,我发现的解决方案是将标题重定向添加到函数中并将其从调用代码中删除:

function email_users($subject, $body) {
    include('core/db/db_connection.php');
    $sql = "SELECT email, first_name FROM `_users` WHERE allow_email = 1";
    $query = mysqli_query($dbCon, $sql);
    while (($row = mysqli_fetch_assoc($query)) !== false) {
        $body = "Hello ". $row['first_name'] . ", <br><br>" . $body;
        email($row['email'], $subject, $body);
        header('Location: email_users.php?success');
    }
}

另外,正如honerlawd所指出的那样,需要require_once才能使其正常工作,否则它只会向数据库中找到的第一个帐户发送一封电子邮件。如果没有重定向到email_users.php?success,这将导致无限循环,无论我是否调用require_once或require。

这是正确的做法还是暂时凌乱的修复?