具有正则表达式字符类的CDbWriter参数


CDbCriteria parameters with regex character classes

我正试图在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.'[[:>:]]');