【问题标题】:Can not bind parameter to CDbCommand无法将参数绑定到 CDbCommand
【发布时间】:2013-05-19 14:14:48
【问题描述】:

说,我将遵循避免 sql 注入的良好做法。所以这不好:

      $query="SELECT id,tag  FROM tbl_tags WHERE tag LIKE '%".$tag."%' ORDER BY creation_time DESC LIMIT 0,10 ";

我必须使用参数绑定:

     $query="SELECT id,tag  FROM tbl_tags WHERE tag LIKE :tag ORDER BY creation_time DESC LIMIT 0,10 ";
     $command =Yii::app()->db->createCommand($query);
 $command->bindParam(":tag", "%{$tag}%", PDO::PARAM_STR);
     $models = $command->queryAll();

但这会产生:致命错误:无法通过引用传递参数 2

如何绑定这个面向 LIKE 的参数?

【问题讨论】:

    标签: sql database pdo yii dbcommand


    【解决方案1】:

    尝试使用查询生成器。因此,您的查询将如下所示:

    Yii::app()->db->createCommand()
        ->select('id, tag')
        ->from('tbl_tags')
        ->where('tag like :tag', array(':tag' => "%{$tag}%"))
        ->order('creation_time desc')
        ->limit('0, 10')
        ->queryAll()
    

    如果您正在寻找一种好的做法,那就更好了。

    P.S.:从 iPhone 回复,请原谅错别字。

    【讨论】:

      【解决方案2】:

      通过阅读此功能的手册页或通过谷歌搜索错误消息。

      两者都会告诉你必须使用 bindValue()。

      【讨论】:

      • yii 的文档记录很差。我仍然不知道 bindParam() 和 bindValue() 之间有什么区别。然而问题解决了,通过稍微改变参数: $tag='%$tag%';然后我可以使用 bindParam()。
      • 不是yii,是PDO,在PHP手册中有完美记录
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多