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

时间:2015-01-17 00:25:14

标签: php mysql while-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循环之外被遗忘了。有人能帮助我吗?

3 个答案:

答案 0 :(得分:1)

要解决您的问题,您需要将send mail函数放在循环中,并在函数中添加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)");
    $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);
}

答案 1 :(得分:1)

如果您使用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

如果你下载邮件程序包,你真的只需要class.phpmailer.php其余的没有必要:)

答案 2 :(得分:1)

目前,您的代码会在$mail_to循环的每次迭代中覆盖while中存储的电子邮件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);
}