电子邮件

时间:2017-04-20 16:51:28

标签: php email foreach

生成电子邮件时,我很难让foreach循环正常运行。我已经搜索了答案,并且我找到了将foreach循环插入电子邮件的说明,但没有关于循环无效的说明。

我正在尝试在下订单后将订单收据通过电子邮件发送给客户,电子邮件中的所有内容都会在项目列表之外发送。

我会尝试尽可能多地包含我的逻辑: 下订单后,购物车项目数组将被序列化,然后存储在数据库中。在支付处理器返回支付成功后,我在网站上显示用户可以打印的收据页面。订单项从数据库中检索如下:

$stmt = $dbh->prepare("SELECT * FROM *table* WHERE orderID = :q0")
$stmt->bindValue(":q0",$orderNum)
$stmt->execute();
foreach($stmt as $row) {
    $items = unserialize($row['order_contents']);
}

此时,如果我回显$ items,我会看到订单中的一系列项目。到现在为止还挺好。

现在因为我正在使用PDO,查询中的foreach循环并不是我想通过的方法。相反,我已经初始化了一个变量来保存foreach循环中的项目:

foreach($items as $prod_id => $value) {
    $q .= $prod_id . ',';
}
$q = substr($q, 0, -1);

这将数组存储在一个变量中,我现在可以在PDO语句中用于下一个查询:

$stmt2 = $dbh->prepare("SELECT * FROM *productTable* WHERE prod_ID IN ($q)");
$stmt2->execute();
foreach($stmt2 as $row) {
$itemName = htmlentities(strip_tags($row['prod_name']));
$id = htmlentities(strip_tags($row['prod_ID']));
$qty = htmlentities(strip_tags($items[$prod_id]['quantity']));
$price = $items[$prod_id]['price'];
echo "
    <tr>
        <td>".$qty."</td>
        <td>".$itemName."</a></td>
        <td>".$price."</td>                        
    </tr>";
} // THIS CODE WORKS. I can see each item from the order as a new row in the table

再次,到目前为止一切顺利。我可以运行一个foreach循环来将项目回显到页面,并且它们都显示正确的项目名称以及我从该示例中遗漏的表格中的其他信息。

跳到文件的末尾,我有以下脚本无效,我无法弄清楚原因。电子邮件发送成功,但foreach循环中的所有产品均未显示在电子邮件中。

$to = 'user@email.com'
$subject = 'Your order receipt for order '.$orderNum
$headers = 'From: orders@website.com'."\r\n".
           'Reply-To: orders@website.com'."\r\n".
           'Content-Type: text/html; charset=UTF-8'."\r\n".
           'X-Mailer: PHP/'.phpversion();
$message =  '<html><body>';
$message .= '<h2>Thanks for your purchase!</h2><br>';
$message .= '<p>Here are the details of your order number '.$orderRef.':<br><table>';
$message .= '
<tr style="width: 100%;">
    <th scope="col" style="width: 20%;">Quantity:</th>
    <th scope="col" style="width: 60%;">Name:</th>
    <th scope="col" style="width: 20%;">Price:</th>
</tr>
';
foreach ($stmt2 as $row) {
    $message .= "
    <tr>
        <td>".$qty."</td>
        <td>".$itemName."</td>
        <td>".$price."</td>                        
    </tr>"; //THIS CODE DOESN'T WORK, Even though it's using the same variables as the loop from above. 
}
$message .= '</table><br>';
$message .= 'If you have any questions about your order, please call us at <b>XXX-XXX-XXXX</b>';
$message .= '</body></html>';
mail($to, $subject, $message, $headers);

电子邮件发送,我看到foreach循环之前和之后的所有内容,但我没有看到生成的实际项目。在电子邮件代码之后,我可以将变量回显到页面并且它们都正确显示,因此仍然声明变量。

可能相关或不相关的其他信息: 我正在尝试使用Ubuntu 14.04在新映像的VPS上执行此代码。 我刚刚在星期一安装了SSL证书 我最近在我的VPS上安装了UFW。 SMTP,IMAP和UTP端口未被阻止。 PHP版本5.5.9-1ubuntu4.21

以下是电子邮件输出的屏幕截图:screen capture of email

编辑: 变量已在第一个foreach($ stmt2 as $ row)语句之后定义。我添加了额外的代码来反映这一点。

3 个答案:

答案 0 :(得分:1)

$stmt2不是数组,它是一个生成器。除此之外,这允许只根据需要将行加载到内存中,而不是需要一次将整个内容读入内存。

问题是,你不能foreach两次。您需要将其转换为实际数组。我还没有通过$itemdata = iterator_to_array($stmt2)测试,但是在第一个$itemdata[] = $row内只有foreach才能引用$itemdata数组稍后。

答案 1 :(得分:0)

我认为问题出在foreach循环中。

foreach ($stmt2 as $row) {
    $message .= "
    <tr>
        <td>".$qty."</td> // $qty is undefined! You should use $row['qty'] or $row->qty
        <td>".$itemName."</td> // $itemName is not defined
        <td>".$price."</td> // $price is not defined
    </tr>";
}

我希望它有所帮助。

答案 2 :(得分:0)

我最终解决的解决方案是在电子邮件代码中再次添加SQL查询:

$message .= '<p>Here are the details of your order number '.$orderRef.':<br>
<table>';
$message .= '
<tr style="width: 100%;">
    <th scope="col" style="width: 20%;">Quantity:</th>
    <th scope="col" style="width: 60%;">Name:</th>
    <th scope="col" style="width: 20%;">Price:</th>
</tr>
';
$stmt2 = $dbh->prepare("
SELECT * FROM products WHERE prod_ID IN ($q) ORDER BY prod_id ASC
");
$stmt2->execute();
while ($row = $stmt2->fetch(PDO::FETCH_ASSOC)) {
    $itemName = htmlentities(strip_tags($row['prod_name']));
    $id = htmlentities(strip_tags($row['prod_ID']));
    $qty = htmlentities(strip_tags($items[$prod_id]['quantity']));
    $price = $items[$prod_id]['price'];

    $message .= "
    <tr>
        <td>".$qty."</td>
        <td>".$itemName."</td>
        <td>".$price."</td>                        
    </tr>";
    }
$message .= '</table><br>';

然后是代码的其余部分。它现在似乎工作,我的测试电子邮件显示测试订单中的两个项目。

谢谢大家的建议。