我有一个mysql ' Client -email '表,其中包含一个客户端ID和分配给这些的电子邮件地址,每个客户端可以有几个分配的电子邮件;并且client-email表不断更新和添加,所以我没有一个client_ids的集合列表。
'client-emails'
client_id | email
============
27 | email1@client27domain
27 | email2@client27domain
42 | email1@client42domain
42 | email2@client42domain
42 | email3@client42domain
46 | email1@client46domain
我有一个电子邮件PHP脚本,每天晚上使用cron作业向这些客户端发送电子邮件。这工作得很好,但现在我们需要个性化每个client_id的这些电子邮件,所以我需要拆分每个客户端电子邮件的每个客户端组,当电子邮件发送它知道哪组逗号分隔的电子邮件有在每个client_id的"to"字段,并在电子邮件正文中的一个变量拉客户端ID。
To: $clientEmails
and within the message there'll be a "Your ID is: $clientId".
i.e.,
To: email1@client27domain,email2@client27domain
And in the message will be:
Your ID is: 27
不确定这是否是一个正确的开始,但我一直在下面的查询中使用GROUP_CONCAT:
$sql = "SELECT client_id, GROUP_CONCAT(email) AS emails FROM portal_client_report_emails GROUP BY client_id ORDER BY client_id ASC";
和做的事情:
$grouped = array();
foreach ($rows as $item) {
$grouped[$item['client_id']][] = $item;
}
转储文件:
array (
27 =>
array (
0 =>
array (
'client_id' => '27',
'emails' => 'email1@client27domain,email2@client27domain',
),
),
42 =>
array (
0 =>
array (
'client_id' => '42',
'emails' => 'email1@client42domain,email2@client42domain,email3@client42domain',
),
),
46 =>
array (
0 =>
array (
'client_id' => '46',
'emails' => 'email1@client46domain',
),
),
)
我是否能够通过该数组循环告诉我的$to变量在我的mail()发送一个单独的电子邮件为每个client_id他们的每个内爆电子邮件?
对于我的邮件测试,我目前只是使用一个基本的mail()函数:
$to = (needs to emails per respective client ID);
$subject = "Client Details";
$message = "Your Client ID: " . $clientID;
mail($to,$subject,$msg);
我可以得到$to变量的帮助来做我需要的事情吗?谢谢!
更新:下面只抓取每个client_id的第一个电子邮件地址。
"SELECT client_id,email...";
$data = array();
while($row = mysqli_fetch_array($rows)){
$data[$row['client_id']][] = $row['email'];
}
不要使用group_concat。它接受多个记录并将其折叠成单个值。它对结果字符串也有长度限制,并且会静默地截断超过限制的任何内容,从而留下丢失的数据和可能损坏的"最终"数据。
使用常规查询:
SELECT id, email ...
则使用循环:
$data = array();
while($row = ... fetch ...) {
$data[$row['id']][] = $row['email'];
}
这将给你一个漂亮的二维数组的id和电子邮件地址,而不必撤销任何连接或其他-你只是开始使用地址,不需要进一步的处理:
foreach($data as $id => $addresses) {
foreach($addresses as $addr) {
send("Hi, $addr, your id is $id");
}
}