带有正则表达式字符类的CDbCriteria参数

时间:2013-07-27 00:52:46

标签: php mysql regex yii

我正在尝试在Yii中使用REGEXP条件的CDbCriteria。我正在使用MySQL标记作为单词边界,[[:<:]][[:>:]],但这似乎与Yii冲突,因为我得到“无效参数编号:绑定变量数与标记数不匹配” 。我认为这是因为单词边界标记使用冒号,这也是用于绑定参数的冒号。有办法解决这个问题吗?

    $criteria = new CDbCriteria;
    $criteria->addCondition('col regexp "[[:<:]]:app[[:>:]]"');
    $criteria->params = array(':app'=>$app);
    $details = Post::model()->find($criteria);

1 个答案:

答案 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.'[[:>:]]');