3

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

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

1 回答 1

4

PHP 不会替换字符串内的占位符,即引号内的占位符。如:

$criteria->addCondition('col = :app'); // param can be replaced
$criteria->addCondition('col = ":app"'); // param can't be replaced

因此我们需要使用 mysql 的CONCAT()函数来实际生成正则表达式的字符串,而不是自己提供字符串,如下所示:

$criteria->addCondition('col regexp CONCAT("[[:<:]]", :app, "[[:>:]]")');

或者,绑定整个正则表达式本身:

$criteria->addCondition('col regexp :regexp');
$criteria->params = array(':regexp'=>'[[:<:]]'.$app.'[[:>:]]');
于 2013-07-27T02:59:44.027 回答