如何修改mysqli结果?(将一行添加到结果中)



我正在使用phpMailer向大量用户发送时事通讯。过了一段时间,我得到了每个用户的电子邮件地址:

$query = "...";
if ($result = mysqli_query($link, $query)) {
while ($row = mysqli_fetch_assoc($result)) {
... 
$mail->AddAddress($row['email']);
$newbody = str_replace("[NAME]",$row['name'],$body);
$mail->MsgHTML($newbody);
if(!$mail->send()) /* send Email */
{$_SESSION['logErrors'] .= $mail->ErrorInfo." (".$row['email'].")<br>";} else 
{$_SESSION['logSent'] .= $row['email']." - ".date("H:m:s")."<br>";}
$mail->ClearAddresses(); 
...
} // mysqli_fetch_assoc
} // mysqli_query

现在我想添加一个选项,如"发送一份通讯给我"。我认为,最好的方法是在这个mysqli结果中添加一个额外的(虚拟的、临时的)行,其中包含我的电子邮件

因此,如果我选中该选项,if语句将更改我的查询,并用第一个新的虚拟行修改结果,其中包含我的电子邮件地址。

有人能帮我吗?我不知道查询应该是什么样子。

MYSQL:                               MODIFIED RESULT:
| id | email | name | group |        | id | email    | name | group |  
|---------------------------|   -->  |------------------------------|
| 1  | foo@  | foo  | bar   |        | 1  | myemail@ | my   | my    |
| 2  | ..    | ..   | ..    |        | 2  | foo@     | foo  | bar   |

有很多方法可以做到这一点。然而,您的查询可能是这样的:

(select "1", "myemail", "my","my") union (<your_select_query>)

但是,我建议创建一个处理数据的函数。对输入调用一次,对查询结果调用多次。

您不需要修改任何内容,如果您以循环方式发送时事通讯,您可以这样做:

$query = "...";
if ($result = mysqli_query($link, $query)) {
   while ($row = mysqli_fetch_assoc($result)) {
     ... 
     $mail->AddAddress($row['email']);
     ...
   } // mysqli_fetch_assoc
   $mail->AddAddress('myemail@'); // here you add your email
} // mysqli_query

老实说,这不是发送时事通讯的最佳方式。现在,每个收到此电子邮件的人都会看到其他电子邮件的电子邮件地址,因此,如果您的用户之一是您的竞争对手,他将看到您所有客户/用户的消息。您应该单独发送电子邮件,或者使用AddBCC而不是AddAddress

编辑

你可以用以下方式来做:

<?php
$query = "...";
if ($result = mysqli_query($link, $query)) {
    $rows = [];
    $record = [];
    $record['name'] = 'Your name';
    $record['email'] = 'Your email';
    $rows[] = $record;
    while ($row = mysqli_fetch_assoc($result)) {
        $rows[] = $row;
    }
    foreach ($rows as $row) {
        //...
        $mail->AddAddress($row['email']);
        $newbody = str_replace("[NAME]", $row['name'], $body);
        $mail->MsgHTML($newbody);
        if (!$mail->send()) /* send Email */ {
            $_SESSION['logErrors'] .= $mail->ErrorInfo . " (" . $row['email']
                . ")<br>";
        } else {
            $_SESSION['logSent'] .= $row['email'] . " - " . date("H:m:s")
                . "<br>";
        }
        $mail->ClearAddresses();
        //...
    }

} // mysqli_query

所以,首先,您从数据库中获取所有结果(并将其添加为第一个记录数据),然后在循环中发送电子邮件。它可能也可以用其他方式完成,但不知道其余代码是什么,这可能是最好的方式。

最新更新