【问题标题】:how to search and combine data extract from mysql to send in php如何搜索和组合从mysql中提取的数据以在php中发送
【发布时间】:2016-09-04 18:30:43
【问题描述】:

我有一个 mysql 数据库,其中存储了一个表,其中包含一些关于人员信息的列

  • object1 (p.k)
  • 用户名
  • 电子邮件
  • 服务
  • 已发送

使用 phpmailer 的 php 代码,我可以连接到数据库,从 sql 查询中提取我需要的信息,并通过 foreach 函数为每个人发送电子邮件,正确发送每封电子邮件后,“已发送”列的数据会更新从 0 到 1... 一切正常,但有可能有些人对多个自己的“object1”有相同的“电子邮件”,在这种情况下,每一行都会向他们发送一封电子邮件...

例如,如果一个人拥有电子邮件 aa@aa.it 有 30 个“object1”,他将收到 30 封不同的电子邮件。

如何将工作与来自查询的数据结合起来,并且与一封电子邮件相关联的所有这些 object1 是否仅在一封电子邮件中发送,并将所有主题列为内容?

我认为我需要用 if/else 指令完成脚本,但我不知道如何管理它。

下面的脚本部分:

   <?
 $mail = new PHPMailer;

    $result = mysqli_query($mysql, 'SELECT * FROM db WHERE service LIKE \'%something%\' AND sent = 0 ORDER BY object1 LIMIT 0 , 30');

    foreach ($result as $row) { 

        $mail->addAddress($row['email'], $row['object1']);

        /* i use it to use an external .html file to send email and replace vairables in it */

        $message = file_get_contents('template/temaplate.html');

        $message = str_replace('%email%', $row['email'], $message);
        $message = str_replace('%object1%', $row['object1'], $message);


        //Set the message
        $mail->MsgHTML($message);
        $mail->AltBody = strip_tags($message);


        if (!$mail->send()) {
            echo "Mailer Error (" . str_replace("@", "&#64;", $row["email"]) . ') ' . $mail->ErrorInfo .;
            break; //Abandon sending
        } else {
            echo "Message sent to :" . $row['object1'] . ' (' . str_replace("@", "&#64;", $row['email']) .;

            //Mark it as sent in the DB
            mysqli_query(
                $mysql,
                "UPDATE db SET sent = true WHERE object1 = '" .
                mysqli_real_escape_string($mysql, $row['object1']) . "'"
            );
        }
        // Clear all addresses and attachments for next loop
        $mail->clearAddresses();
        $mail->clearAttachments();
    }
?>

我希望能正确解释我的需求,并为此向您寻求一些帮助和建议。

【问题讨论】:

标签: php mysql email foreach phpmailer


【解决方案1】:

您可以通过电子邮件订购,而不是按 object1 排序,这样具有相同电子邮件的行将一起出现。

$prev_email = null;
foreach ($result as $row) {
    if ($row['email'] === $prev_email) {
        // skip, but may print some warning etc.
        // or check other conditions about object1
        continue;
    }
    ....
    $prev_email = $row['email'];
}

这样,每封电子邮件只会收到一条消息。但是,如果您关心在这些电子邮件中使用哪个 object1,则可能需要微调逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-05
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多