Php 如何正确地将会话变量发送到电子邮件?

Php 如何正确地将会话变量发送到电子邮件?,php,html,css,Php,Html,Css,我正在处理一个项目,在该项目中,我发送存储在会话变量$\u session['favorites']中的信息 我使用了print\r函数print\r($\u SESSION,true),它的输出如下 Array ( [favourites] => Array ( [0] => Array ( [item_id] => 3 ) [1] =&

我正在处理一个项目,在该项目中,我发送存储在会话变量
$\u session['favorites']
中的信息

我使用了print\r函数
print\r($\u SESSION,true)
,它的输出如下

Array
(
    [favourites] => Array
        (
            [0] => Array
                (
 [item_id] => 3
                )

            [1] => Array
                (
                    [item_id] => 11
                )

        )

)
相反,我实现了一个带有while循环的foreach来显示内容并将其存储在变量
$email\u message
中。代码的问题在于,由于
$email\u message
是一个变量,因此它在
的while循环中被覆盖和回显

我的主要目标是通过电子邮件发送会话变量中的所有信息

这是phpmailer代码,包括上面提到的
foreach
while循环

<?php
        use PHPMailer\PHPMailer\PHPMailer;
        foreach($_SESSION["favourites"] as $key => $value)
        {  
            $id = $value['item_id'];

            $sql= "SELECT * FROM menu WHERE id = '$id'";
            $result=mysqli_query($conn, $sql);
            $resultcheck=mysqli_num_rows($result);
            while($row=mysqli_fetch_assoc($result))
            {  
                $email_message = ($row['id']). ($row['name']). ($row['price']).'<br>';
            }
            echo $email_message;
        }
                   
        if(isset($_POST['fullname']) && isset($_POST['email']))
        {
            $name = $_POST['fullname'];
            $email = $_POST['email'];
            $subject = 'My favourite\'s list as of '. date("Y/m/d");

            //Calling the PHPMailer 'functions' 
            require_once "vendor\phpmailer\phpmailer\src\PHPMailer.php";
            require_once "vendor\phpmailer\phpmailer\src\SMTP.php";
            require_once "vendor\phpmailer\phpmailer\src\Exception.php";

            $mail = new PHPMailer();

            //SMTP Settings
            //$mail -> SMTPDebug = 3;
            $mail -> isSMTP();
            $mail -> Host = "smtp.gmail.com";
            $mail -> SMTPAuth = true;
            $mail -> Username = "cis1045sem2a2021@gmail.com";
            $mail -> Password = 'universityofmalta';
            $mail -> Port = 587; 
            $mail -> SMTPSecure = "tls"; 

            //Email Settings
            $mail -> isHTML(true);
            $mail -> setFrom($email, $name);
            $mail -> addAddress("cis1045sem2a2021@gmail.com");
            $mail -> Subject = $subject;
            $mail -> Body = $email_message;

            if ($mail->send()) {
                echo "Email is sent!";
            } else {
                echo "Something is wrong: <br><br>" . $mail->ErrorInfo;
            }
        }
       
?>
更改此选项:

 $email_message .= ($row['id']). ($row['name']). ($row['price']).'<br>';
$email\u message=($row['id'])。($row['name'])。($row['price'])。
为此:

 $email_message = ($row['id']). ($row['name']). ($row['price']).'<br>';
$email\u message.=($row['id'])。($row['name'])。($row['price'])。

El_Vanja就是这么说的。

如果我理解正确,问题就在这里:

$email_message .= ($row['id']). ($row['name']). ($row['price']).'<br>';


顺便说一句,援助也来自马耳他;)

警告:您完全可以使用参数化的预处理语句,而不是手动生成查询。它们由或提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行。因此,不是覆盖,而是附加到变量?我相信您熟悉字符串连接。或者,您可以构建一个用于电子邮件内容的行数组,然后用新行将其内爆。请共享更多详细信息-您尝试了哪些方法来解决此问题?发送一封与CSS相关的电子邮件又是怎样的呢?我做了@El_Vanja所说的和下面的回答。我基本上是通过在foreach循环之前使用“.=”和初始化的$email消息附加到$email消息。工作起来很有魅力。干杯@Combinu
 $email_message = ($row['id']). ($row['name']). ($row['price']).'<br>';
$email_message .= ($row['id']). ($row['name']). ($row['price']).'<br>';
$email_message .= ($row['id']). ($row['name']). ($row['price']).PHP_EOL;