如何修改mysqli的结果? (在结果中添加一行)

时间:2014-11-10 17:15:21

标签: php mysql mysqli phpmailer

我正在使用phpMailer向一定数量的用户发送简报。 在while-Loop中,我得到每个用户的电子邮件地址:

$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-result。

因此,如果我检查该选项,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   |

2 个答案:

答案 0 :(得分:2)

您不需要修改任何内容,如果您循环发送简报,可以这样做:

$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

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

答案 1 :(得分:2)

有很多方法可以做到这一点。但是,这就是您的查询的样子:

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

但是,我建议,创建一个处理数据的函数。 为您的输入调用一次,并在查询结果上多次调用它。