Загрузить динамические c значения в msg HTML в теле phpmailer из базы данных - PullRequest
0 голосов
/ 26 мая 2020

Я здесь пытаюсь вставить и отправить количество заказов через SMTP phpmailer. Я использую foreach для разделения данных заказа на пару значений ключа и вставки в базу данных.

можно увидеть здесь: here

после успешного выполнения я хочу отправить владельцу письмо с деталями заказа, которые были только что вставлены. Просто для теста я выбрал productid в качестве детали заказа.

Вот только что пришедшее письмо. here

Проблема

Я ищу, что база данных вставила 2 productid (26,27), но в почте я получил только productid (26) Мне нужен динамик c производимая вставка в тело письма. Я использую while l oop, но считаю, что цель не может достигнуть или выполнить. Буду признателен, если кто-нибудь распечатает, где я ошибаюсь.

PHP:

$shown = false;
        foreach($_SESSION["shopping_cart"] as $number => $val)
            {
                       // prepare and bind
                        $stmt = $conn->prepare("INSERT INTO purchase(guest_code,productid,quantity,date_purchase) VALUES (?, ?, ?, ?)");
                        $stmt->bind_param("siis",$_SESSION['CODE'],$val['product_id'],$val['product_quantity'],$current_date_time); //inserting mutiple value in db successful.

                        if($stmt->execute())
                        {
                            if(!$shown) //show msg or dedirect only once
                            {      

                                    $sql= mysqli_query($conn,"select productid from purchase where guest_code='".$_SESSION['CODE']."'"); //fetch only productid for test
                                    while ($row = mysqli_fetch_array($sql)) 
                                    {
                                          $productid = $row['productid'];
                                          $message = "<tr><td style='text-align:center;'><strong>".$productid."</td></tr>";
                                          $mail->msgHTML($message); //trying to load multiple productid in $message 
                                    }    

                                        $mail->Subject = 'New Order Arrived!';
                                        if(!$mail->send()) 
                                        {
                                          $mail_error = 'error: ' . $mail->ErrorInfo;
                                          exit();
                                        } 
                                        else {
                                               //if mail sent then
                                                unset($_SESSION["shopping_cart"]); //distroy all the values in the cart
                                                //header('location:../checkout.php?er=false');
                                        }


                                $shown = true;

                            }


                        }else
                        {

                            if(!$shown) //show msg only once
                            {
                                echo 'ERROR: while placing your order. Please contact restaurant owner.';
                                $shown = true;
                            }
                        }


            }

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Решение, которое я нашел.

Итак, проблема, с которой я столкнулся раньше, заключалась в вызове функции sendmail() внутри foreach() и, кроме того, чтобы показать сообщение только один раз, когда я использовал условие if, которое не позволяло $row['productid'] отображать только один productID и, как результат, восстанавливать почту с productID взамен.

Вместо этого мне нужно сделать что-то вроде этого :

if(!empty($_SESSION["shopping_cart"]) && $_SESSION["shopping_cart"]!=='')
{
 $shown = 0;
 foreach($_SESSION["shopping_cart"] as $number => $val)
            {


                        // prepare and bind
                        $stmt = $conn->prepare("INSERT INTO purchase(guest_code,productid,quantity,date_purchase) VALUES (?, ?, ?, ?)");
                        $stmt->bind_param("siis",$_SESSION['CODE'],$val['product_id'],$val['product_quantity'],$current_date_time); //inserting mutiple value in db successful.

                        if($stmt->execute())
                        {

                                $body .=  '<p><b>Product ID:</b>&nbsp;&nbsp;&nbsp;'.$val['product_id'].'</p>';   
                                $body .= '<p><b>Discussion Name:</b>&nbsp;&nbsp;&nbsp;'.$val['product_quantity'].'</p>'; 
                                echo 'success';     

                        }else
                        {

                            if($shown==0) //show msg only once
                            {
                                echo 'ERROR: while placing your order. Please contact restaurant owner.';
                                header('location:../checkout.php?er=true');
                                $shown = 1;
                            }
                        }


            }

      $mail->msgHTML($body);
      $mail->Subject = 'New Order Arrived!';
      $mail->send();


}

Вывод почты:

here

0 голосов
/ 26 мая 2020

Каждый раз, когда вы вызываете $mail->msgHTML($message);, он заменяет все содержимое Body; он не добавляет к нему . Я ожидал, что вы сделаете что-то вроде:

$mail->Body = '<p>Your order</p><table>';
while ($row = mysqli_fetch_array($sql)) {
    $productid = $row['productid'];
    $mail->Body .= "<tr><td style='text-align:center;'><strong>".$productid."</td></tr>";
}
$mail->Body .= '</table>';
...