2

再会,

我的脚本有问题。我正在做的是:

我想向用户发送电子邮件。对于不同类型的邮件有不同的模板,例如用于注册确认的一种设计,一种用于最近新闻的设计等。所以,我所做的是,我创建了一个表格并将每个设计存储在名为 content 的列中,其中包含完整的 HTML 代码。

为此,我的数据库设计非常简单:

ID    |    type    |    content

1     |   signup   |    <html> ... <body> .. content of email ... </body></html>

所以,上面是我的数据库。ID 为 1 的字段 现在,当有人注册时,我正试图向他发送一封电子邮件,其内容是从上表中获取的。内容字段下的文本如下:

<html>
.
.
<body>
Good Day,

You have successfully created your account.
Please activate your account now by clicking below:

<a href="activate.php?md5=$md5&code=$code">ACTIVATE</a>

</body>
</html>

在上面的代码中,如果你检查了激活链接,我使用了 PHP 变量 $md5 和 $code,认为它们对应的值会打印在实际的电子邮件中。但它们按原样打印,如$md5$code

嗯,我做了很少的研究,从几个论坛,我知道了,

第一个:虽然我们将 HTML 模板的内容与这些 PHP 变量一起添加到数据库中,但它们已成为该数据库列本身的值,不再被视为 PHP 变量。

第二:有人声称他已经使用eval()函数使其工作。我可以使用 eval,因为从安全的角度来看,我没有从用户那里获取任何价值,而是从数据库中获取任何价值。我试过了,但仍然没有。

下面是我用 eval() 尝试过的代码:

$md5    =   $row['md5'];  // These variables values I'm expecting to come in template content
$code   =   $row['activ_code'];  // These variables values I'm expecting to come in template content

ob_start();
eval("\$template_content = \"$template_content\";");
$message    =   $template_content;
ob_end_clean();

有人可以帮我解决这个问题吗?我不想将完整的模板 (HTML) 放在使用邮件功能的同一页面上。它使代码看起来很丑,而不是保持简短和整洁。

请帮忙!

4

4 回答 4

3

使用 str_replace http://php.net/manual/en/function.str-replace.php并将这些变量替换为标签,例如 %MD5%。您仍然可以使用 $code,但它只是不可读,并且可能导致错误的文本被替换(考虑一个字符串“this was $co Developed”)

混合 str_replace (混合 $search , 混合 $replace , 混合 $subject [, int &$count ] ) 此函数返回一个字符串或一个数组,其中主题中所有出现的搜索替换为给定的替换值。

然后,

$template_content = '<a href="activate.php?md5=%MD5%&code=%CODE%">ACTIVATE</a>';
$template_content = str_replace("%MD5%", $md5, $template_content);
$template_content = str_replace("%CODE%", $code, $template_content);

str_replace 也接受数组作为参数,所以这可能是一个更好的

$placeholders = array("%MD5%", "%CODE%");
$values = array($md5, $code);
$template_content = str_replace($placeholders, $values, $template_content);

eval 是一种潜在的危险,通常是矫枉过正

于 2013-07-30T10:09:08.233 回答
1

你可以试试这样的东西。

$md5    =   $row['md5'];  // These variables values I'm expecting to come in template content
$code   =   $row['activ_code'];  // These variables values I'm expecting to come in template content

$message = str_replace( array('$md5','$code'), array($row['md5'], $row['activ_code']),  $template_content);

当然,让需要替换的字段看起来像这样而不是像变量名那样使用 $xx 可能更有意义和可读性。

$template_content = '..... {md5code}..... {activecode}...';
$message = str_replace( array('{md5code}','{activecode}'), array($row['md5'], $row['activ_code']),  $template_content);

只是一个建议。

于 2013-07-30T10:19:46.070 回答
1

您的问题是您正在评估的文本中的双引号。

为了让它工作,你必须逃避它们:

eval("\$template_content = \"" . addslashes($template_content) . "\";");
$message = $template_content;

然后它会工作得很好。

这是一个完整的工作示例:

$template_content = '<html>
.
.
<body>
Good Day,

You have successfully created your account.
Please activate your account now by clicking below:

<a href="activate.php?md5=$md5&code=$code">ACTIVATE</a>

</body>
</html>';


$md5    =   "HEREGOESMD5";
$code   =   "CodeCodeCodeCode";

eval("\$template_content = \"" . addslashes($template_content) . "\";");
$message = $template_content;

echo $message;
于 2013-07-30T10:24:36.027 回答
0
<php
echo '<a href="activate.php?md5='.$md5.'&code='.$code.'">ACTIVATE</a>';
?>
于 2013-07-30T10:14:29.133 回答