在str_replace中的数据库内执行PHP

在str_replace中的数据库内执行PHP,php,mysql,Php,Mysql,我正在尝试构建一个系统,客户机可以在构建电子邮件模板(也存储在数据库中)时使用方形标记中的短代码,然后用一行PHP代码替换该模板。例如,[order\u date]将替换为日期(“l jS F Y”,strotime($OrderDate)),其中OrderDate已在代码的后面定义 为此,我构建了一个新的数据库表,其中包含两个字段—SubOriginal和SubReplacement。在上面的示例中,[order_date]将位于子原始字段中,日期(“l jS F Y”,strotime($O

我正在尝试构建一个系统,客户机可以在构建电子邮件模板(也存储在数据库中)时使用方形标记中的短代码,然后用一行PHP代码替换该模板。例如,
[order\u date]
将替换为
日期(“l jS F Y”,strotime($OrderDate))
,其中
OrderDate
已在代码的后面定义

为此,我构建了一个新的数据库表,其中包含两个字段—
SubOriginal
SubReplacement
。在上面的示例中,
[order_date]
将位于
子原始
字段中,
日期(“l jS F Y”,strotime($OrderDate))
将位于
子替换
字段中

然后,在给用户发送电子邮件时,我有以下代码:

 // Set fields (StackOverflow example - data from a previous db query)
 $OrderDate = $row['OrderDate'];

 // Get customer order confirmation template
 $sql = "SELECT DeliveryTemplateSubject, DeliveryTemplateContent FROM delivery_templates WHERE DeliveryTemplateTemplate='1'";
 $set = $link->query($sql);
 $row = $set->fetch_row();
 $MessageBody = nl2br($row[1]);

 // Make template substitutions
 $sqlsub = "SELECT * FROM templates_subs";
 $setsub = $link->query($sqlsub);
 while($rowsub = $setsub->fetch_array(MYSQLI_ASSOC))
 {
  $replacement = $rowsub['SubReplacement'];
  $MessageBody = str_replace($rowsub['SubOriginal'], $replacement, $MessageBody);
 }

 // Email customer
 $subject = $row[0];
 mail($CustomerEmail, $subject, $MessageBody);

然而,替换的代码都是以美元符号开头的原始PHP代码


我哪里出错了?

如果你在数据库中存储
date(“l jS F Y”,strotime($OrderDate))
就像那样,你就需要开始使用它,为了安全起见,应该避免使用它。我建议将存在的回调函数的名称存入数据库,以便运行。例如,
[order\u date]
可以通过一个解决方案运行函数
shortcode\u order\u date()
。您甚至可能需要查看“然而,所有替换项都是以美元符号开头的原始PHP代码。”-请发布一个示例。@Paul Spiegel在原始帖子中使用我的示例,如果模板显示“您在[order_date]订购”,则电子邮件显示为“您在$OrderDate订购”,而我希望它这样说“您于2018年1月5日(星期五)订购”。@Scuzzy拥有一个名为(您的示例)“shortcode_order_date”的PHP函数,这首先否定了通过数据库执行此操作的意义,这样我的客户就可以添加新的shortcode(以及相关的PHP)无需编辑PHP代码。不过,您给了我一个想法,即使用一个函数并将短代码的名称传递给它,我想我还需要先将每个短代码放入一个数组中,以便函数可以引用它。但是,如果不使用Eval,我如何将字符串转换为执行的PHP代码位?Eval将是打开的尝试将字符串解码为组件以尝试调用