存储在MySQL中的PHP变量无法解析

时间:2013-07-30 10:07:27

标签: php mysql variables

美好的一天,

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

我想向用户发送电子邮件。不同类型的邮件有不同的模板,例如一个用于SignUp确认的设计,一个用于最近的新闻等。 所以,我做的是,我创建了一个表,并将每个设计存储在名为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

好吧,我做了很少的研究,在很少的论坛上,我知道了,

第1步:虽然我们将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 个答案:

答案 0 :(得分:3)

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

  

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

然后,

$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是一种潜在的危险,通常是一种过度杀伤

答案 1 :(得分: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);

只是一个建议。

答案 2 :(得分: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;

答案 3 :(得分:0)

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