You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从数据库获取模板文本并替换为其他表的动态变量?

解决数据库短信模板变量无法替换的问题

问题根源

从数据库读取的sms_template是纯字符串,PHP不会自动解析其中的变量标记(比如$amount),而硬编码的字符串是在PHP编译阶段完成变量替换的,因此需要手动实现变量替换逻辑。

解决方案:使用字符串替换(安全可控)

推荐用str_replace结合数组完成变量替换,既安全又容易维护。步骤如下:

  1. 确保数据库中的模板使用明确的占位符(比如{amount}、{year},或者保持$amount格式);
  2. 在循环中创建变量与对应值的映射数组;
  3. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 01:53:21