包括用户详细信息在我的数据库旁边的HTML


Including user details in my database alongside HTML

当用户在我的站点上注册时,我将发送给他们的电子邮件的详细信息(例如他们的电子邮件地址、姓名和电子邮件的内容)保存到我的数据库中。然后,一个脚本(每隔几秒运行一次)根据数据库中存储的详细信息发送电子邮件,然后删除该行,这样电子邮件就不会被多次处理。

我遇到的问题在于将用户的详细信息合并到电子邮件正文中。

下面是我可以放入数据库的HTML代码片段,没有任何问题:

<span style="font-size:1.5em; font-family:Arial">Welcome!</span><br>
<span style="font-size:1.2em">Hi! Lets get your new account set up!</span>

然而,我想更友好一些,而不是说"欢迎!",我希望能够说"欢迎,用户名!"所以,我试着这样做:

<span style="font-size:1.5em; font-family:Arial">Welcome, ' . $username . '!</span><br>
<span style="font-size:1.2em">Hi! Lets get your new account set up!</span>

我正在使用htmlspecialchars() PHP函数,但是上面的代码根本不会插入到数据库中。上面的代码位于变量$message中,然后在尝试将其插入数据库之前,对其使用htmlspecialchars()函数。

我试过把所有的'改成' in the '。美元的用户名。的一部分。这个将插入到数据库中,没有问题;然而,在用户收到的电子邮件中,而不是看到这样的内容:

,,欢迎Yorkie595 !
,,你好!让我们来设置你的新帐户吧!

…用户收到一封如下所示的电子邮件:

  美元的用户名。"!
,,你好!让我们来设置你的新帐户吧!

如果需要,下面是将新行插入数据库的SQL查询:

$query = mysql_query("INSERT INTO `mailtosend`
(`id`,`from_email`,`from_name`,`to_email`,`to_name`,`message`,`subject`,`message_nohtml`)
VALUES (NULL, 'emailtosendfrom@mail.com', 'Mail Name', '$email', '$fullname',
'$message', 'Activate your account', 'Activate your account')");

所以,我的问题:我如何将PHP变量,如$username到$message?

我没有足够的信息来调查为什么$message变量不能为您进行插值。

像这样的东西对我很有用:

<?php
$mysqli = new mysqli('host', 'user', 'password', 'database');
if ($mysqli->connect_errno) {
    echo 'Failed to connect to MySQL: (' . $mysqli->connect_errno . ') ' . $mysqli>connect_error;
}
$username = 'freddy';
$message = <<<EOT
<span style="font-size:1.5em; font-family:Arial">Welcome, $username!</span><br>
<span style="font-size:1.2em">Hi! Lets get your new account set up!</span>
EOT;
$message = htmlspecialchars($message);
$sql = <<<EOT
INSERT INTO `mailtosend`
    (`id`,`from_email`,`from_name`,`to_email`,`to_name`,`message`,`subject`,`message_nohtml`)
    VALUES (NULL, 'emailtosendfrom@mail.com', 'Mail Name', ?, ?,
    ?, 'Activate your account', 'Activate your account')
EOT;
if (!($stmt = $mysqli->prepare($sql))) {
     echo 'Prepare failed: (' . $mysqli->errno . ') ' . $mysqli->error;
}
if (!$stmt->bind_param('sss', $email, $fullname, $message)) {
    echo 'Binding parameters failed: (' . $stmt->errno . ') ' . $stmt->error;
}
if (!$stmt->execute()) {
    echo 'Execute failed: (' . $stmt->errno . ') ' . $stmt->error;
}
$stmt->close();
?>

(加上反sql注入措施的额外好处)

更新:我添加了mysql连接来完成图片。MySQLi连接在上面的代码中是必需的。

bind_param函数自动并最佳地转义准备好的语句输入字符串。bind_param安全,并将SQL语句中的?替换为您提供的变量。这里有一个关于"real_escape"和准备好的语句的答案。mysql_query正在走渡渡鸟的路,所以在我看来,最好使用mysqli或PDO。