我正试图在Yii中使用带有REGEXP
条件的CDbWriter。我使用MySQL标记词边界,即[[:<:]]
和[[:>:]]
,但这似乎与Yii冲突,因为我得到了"无效参数编号:绑定变量的数量与令牌的数量不匹配"。我认为这是因为单词边界标记使用了冒号,这也是用于绑定参数的冒号。有办法绕过这个吗?
$criteria = new CDbCriteria;
$criteria->addCondition('col regexp "[[:<:]]:app[[:>:]]"');
$criteria->params = array(':app'=>$app);
$details = Post::model()->find($criteria);
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.'[[:>:]]');