我正在尝试在Yii中使用REGEXP
条件的CDbCriteria。我正在使用MySQL标记作为单词边界,[[:<:]]
和[[:>:]]
,但这似乎与Yii冲突,因为我得到“无效参数编号:绑定变量数与标记数不匹配” 。我认为这是因为单词边界标记使用冒号,这也是用于绑定参数的冒号。有办法解决这个问题吗?
$criteria = new CDbCriteria;
$criteria->addCondition('col regexp "[[:<:]]:app[[:>:]]"');
$criteria->params = array(':app'=>$app);
$details = Post::model()->find($criteria);
答案 0 :(得分:4)
PHP不会替换字符串中的占位符,即在引号内。如:
$criteria->addCondition('col = :app'); // param can be replaced
$criteria->addCondition('col = ":app"'); // param can't be replaced
因此我们需要使用mysql的CONCAT()函数来实际生成regexp的字符串,而不是自己提供字符串,如下所示:
$criteria->addCondition('col regexp CONCAT("[[:<:]]", :app, "[[:>:]]")');
或者,绑定整个正则表达式本身:
$criteria->addCondition('col regexp :regexp');
$criteria->params = array(':regexp'=>'[[:<:]]'.$app.'[[:>:]]');