如何让 php 在循环外回显值?

How do I get php to echo value outside of loop?

我希望能够在电子邮件中加入此人的姓名。但是我不知道如何在循环外保留值。另外,我想知道如果有多个结果,这是否有效。

这里是 php:

// WHO HAS BEEN A MEMBER FOR ONE YEAR
function joinDateFilter(){
    $query = mysql_query("SELECT * FROM user WHERE date_joined = DATE_SUB(curdate(), INTERVAL 1 YEAR)");
    $mail_to = "";
    while ($row = mysql_fetch_array($query)){
        echo $row['name']." - ".$row['email']."\n";
        $mail_to = $row['email'].", ";
        $name = $row['name'];
    }
    if (!empty($mail_to)){
        sendEmail($mail_to);
    }
}

// SEND EMAIL
function sendEmail($mail_to) {
    $from    = "webmaster@mydomain.com";
    $message = "Happy Anniversary!";
    $headers = 'From: '.$from."\r\n" .
    'Reply-To:'.$_POST['email']."\r\n" .
    "Content-Type: text/html; charset=iso-8859-1\n".
    'X-Mailer: PHP/' . phpversion();
    mail($mail_to, "Congratulations ".$name."!", $message, $headers);
}

在上面的示例中,邮件从不读取他们的名字,因为在 while 循环之外似乎忘记了该值。有人可以帮助我吗?

要解决您的问题,您需要将发送邮件函数放在循环中,并在函数中添加一个名称参数,因为您在函数内部使用它。

这样的事情可能会成功:

// WHO HAS BEEN A MEMBER FOR ONE YEAR
function joinDateFilter(){
    $query = mysql_query("SELECT * FROM user WHERE date_joined = DATE_SUB(curdate(), INTERVAL 1 YEAR)");
    $mail_to = "";
    $name = "";
    while ($row = mysql_fetch_array($query)){
        echo $row['name']." - ".$row['email']."\n";
        $mail_to = $row['email'].", ";
        $name = $row['name'];
      if (!empty($mail_to) and !empty($name)){
        sendEmail($mail_to, $name);
      }
   }
}

// SEND EMAIL
function sendEmail($mail_to, $name) {
    $from    = "webmaster@mydomain.com";
    $message = "Happy Anniversary!";
    $headers = 'From: '.$from."\r\n" .
    'Reply-To:'.$_POST['email']."\r\n" .
    "Content-Type: text/html; charset=iso-8859-1\n".
    'X-Mailer: PHP/' . phpversion();
    mail($mail_to, "Congratulations ".$name."!", $message, $headers);
}

这应该有效:

<?php

    // WHO HAS BEEN A MEMBER FOR ONE YEAR
    function joinDateFilter(){
        $query = mysql_query("SELECT * FROM user WHERE date_joined = DATE_SUB(curdate(), INTERVAL 1 YEAR)");
        $mail_to = "";
        while ($row = mysql_fetch_array($query)){
            echo $row['name']." - ".$row['email']."\n";
            $mail_to = $row['email'].", ";
            $name = $row['name'];
            if (!empty($mail_to)){
                sendEmail($mail_to, $name);
            }
        }

    }

    // SEND EMAIL
    function sendEmail($mail_to, $name) {
        $from    = "webmaster@mydomain.com";
        $message = "Happy Anniversary!";
        $headers = 'From: '.$from."\r\n" .
        'Reply-To:'.$_POST['email']."\r\n" .
        "Content-Type: text/html; charset=iso-8859-1\n".
        'X-Mailer: PHP/' . phpversion();
        mail($mail_to, "Congratulations ".$name."!", $message, $headers);
    }

?>

请记住,邮件功能有时会出现问题。 Google 关于那个问题。可以用来替代邮件功能的是 SwiftMailer

如果您使用 phpmailer,您可以这样做:

function joinDateFilter(){

    require_once("class.phpmailer.php");

    $mail           = new PHPMailer();
    $mail->From     = "webmaster@mydomain.com";
    $mail->Subject  = "Congratulations";
    $mail->Body     = "Happy Anniversary!";
    $query = mysql_query("SELECT * FROM user WHERE date_joined = DATE_SUB(curdate(), INTERVAL 1 YEAR)");
    while ($row = mysql_fetch_array($query)){
        $mail->AddBCC($row['email'],$row['name']);
    }
    $mail->Send();
    $mail->ClearAddresses();
}

或者如果你想拥有不同的主题,你可以这样做...

function joinDateFilter(){

    require_once("class.phpmailer.php");

    $mail           = new PHPMailer();
    $mail->From     = "webmaster@mydomain.com";
    $mail->Body     = "Happy Anniversary!";
    $query = mysql_query("SELECT * FROM user WHERE date_joined = DATE_SUB(curdate(), INTERVAL 1 YEAR)");
    while ($row = mysql_fetch_array($query)){
        $mail->Subject  = "Congratulations " . $row['name'];
        $mail->AddAddress($row['email'],$row['name']);
        $mail->Send();
        $mail->ClearAddresses();
    }
}

无论如何,你保存了 1 个函数,它对 :D

并且添加附件或发送 html 电子邮件和诸如此类的东西也非常容易。如何做大多数事情都可以用谷歌搜索。所以你可能需要一个小 tutorial.

如果你下载 mailer pac,你真的只需要 class.phpmailer.php 其余的都不需要 :)

目前,您的代码会在 while 循环的每次迭代中覆盖存储在 $mail_to 中的电子邮件 ID。因此,它将只有最后一个用户的电子邮件 ID。并且您需要每个用户的名称(存储在 $name 中并在函数中使用)。只要找到用户,您就需要发送电子邮件。试试这个:

// WHO HAS BEEN A MEMBER FOR ONE YEAR
function joinDateFilter(){
    $query = mysql_query("SELECT * FROM user WHERE date_joined = DATE_SUB(curdate(), INTERVAL 1 YEAR)");
    while ($row = mysql_fetch_array($query)){
        echo $row['name']." - ".$row['email']."\n";
        $mail_to = $row['email'];
        $name = $row['name'];
        if (!empty($mail_to))
            sendEmail($mail_to, $name);
    }
}

// SEND EMAIL
function sendEmail($mail_to, $name) {
    $from    = "webmaster@mydomain.com";
    $message = "Happy Anniversary!";
    $headers = 'From: '.$from."\r\n" .
    'Reply-To:'.$_POST['email']."\r\n" .
    "Content-Type: text/html; charset=iso-8859-1\n".
    'X-Mailer: PHP/' . phpversion();
    mail($mail_to, "Congratulations ".$name."!", $message, $headers);
}