如何从数据库获取模板文本并替换为其他表的动态变量?
解决数据库短信模板变量无法替换的问题
问题根源
从数据库读取的sms_template是纯字符串,PHP不会自动解析其中的变量标记(比如$amount),而硬编码的字符串是在PHP编译阶段完成变量替换的,因此需要手动实现变量替换逻辑。
解决方案:使用字符串替换(安全可控)
推荐用str_replace结合数组完成变量替换,既安全又容易维护。步骤如下:
- 确保数据库中的模板使用明确的占位符(比如
{amount}、{year},或者保持$amount格式); - 在循环中创建变量与对应值的映射数组;
- 用
str_replace批量替换模板中的占位符。
修改后的代码示例
public function customer_bill_reminder() { if($this->session->userdata('role') == "ADMIN" || $this->session->userdata('role') == "SUPER ADMIN") { $from = $this->input->post('from'); $to = $this->input->post('to'); $result = $this->MAILModel->customer_sms_reminder($from,$to); // 获取数据库中的短信模板(假设$result2返回单条模板,循环后取最后一条) $smsTemplate = ''; foreach($result2 as $row) { $smsTemplate = @$row->sms_template; } foreach($result as $row) { $phone_number = @$row->mobile; $year = @$row->bill_period; $control_number = @$row->control_number; $amount = @$row->bill_amount; // 定义变量替换映射 $replacements = [ '{amount}' => $amount, '{year}' => $year, '{control_number}' => $control_number ]; // 执行替换生成最终短信内容 $message = str_replace(array_keys($replacements), array_values($replacements), $smsTemplate); echo $message; $this->NotificationModel->send_sms($phone_number,$message); } } }
可选方案(不推荐,存在安全风险)
如果坚持使用$amount这种PHP变量格式的模板,可以用eval实现,但必须确保模板内容完全可信,避免注入风险:
// 仅作示例,不建议在生产环境使用 extract([ 'amount' => $amount, 'year' => $year, 'control_number' => $control_number ]); ob_start(); eval('?>'.$smsTemplate.'<?php '); $message = ob_get_clean();
内容的提问来源于stack exchange,提问作者Andy Pale
相关产品推荐
相关产品推荐

