将用户详细信息与HTML一起包含在我的数据库中

时间:2014-05-30 21:11:35

标签: php mysql sql

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

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

下面是我可以放入数据库的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()函数。

我试图将“。$ username。”部分中的所有“to”更改为。将毫无问题地插入到数据库中;但是在用户收到的电子邮件中,看到这样的事情:

欢迎Yorkie595!
嗨!我们来设置你的新帐户吧!

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

欢迎“。$ username。”!
嗨!我们来设置你的新帐户吧!

如果您需要它,这里是将新行插入数据库的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')");

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

1 个答案:

答案 0 :(得分:0)

我没有足够的信息来调查为什么$ message var没有为您插值。

这样的事情对我有用:

<?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注入措施的附加好处。)

更新:我添加了MySQLi连接以完成图片。上面的代码需要MySQLi连接。

bind_param自动运行,并以最佳方式转义预准备语句输入字符串。 bind_param使用您提供的变量保护并替换SQL语句中的?这是关于“real_escape”与准备好的陈述的答案。 mysql_query正在走向渡渡鸟的道路,所以在我看来最好使用mysqli或PDO。