【问题标题】:Yii createCommand update part of string of multiple recordsYii createCommand 更新多条记录字符串的一部分
【发布时间】:2026-01-26 09:00:01
【问题描述】:

我正在使用 createCommand 替换多个记录字段中的部分字符串。 以下代码运行良好:

Yii::app()->db->createCommand("UPDATE table SET field=replace(field,'" . $old_string . "','" . $model->value . "') WHERE field LIKE '%" . $old_string . "%'")->execute();

(Yii 1.1)

但是,如何参数化它以便我可以使用 :oldString & :newString,而不是直接将变量链接到查询?

谢谢。

【问题讨论】:

    标签: php yii sqlite


    【解决方案1】:

    你可以使用绑定参数

    $query = "UPDATE table 
              SET field=replace(field, :old_string , :new_string) 
              WHERE field LIKE concat('%', :old_string2, '%')";
    
    $command = Yii::app()->db->createCommand($query);
    $command->bindParam(":old_string", $old_string, PDO::PARAM_STR);     
    $command->bindParam(":new_string", $model->value, PDO::PARAM_STR);     
    $command->bindParam(":old_string2", $old_string, PDO::PARAM_STR);     
    $command->execute();
    

    【讨论】:

      【解决方案2】:

      您只需在查询中将值替换为参数占位符并将实际值传递给execute()。唯一棘手的部分是LIKE 的参数,因为% 需要在参数值内,而不是查询:

      $sql = <<<'SQL'
          UPDATE table 
          SET field = replace(field, :old_string, :value) 
          WHERE field LIKE :searchable_old_string
      SQL;
      
      Yii::app()->db->createCommand($sql)->execute([
          'old_string' => $old_string,
          'value' => $model->value,
          'searchable_old_string' => "%$old_string%",
      ]);
      

      【讨论】: