3

Yii で CDbCriteria をREGEXP条件付きで使用しようとしています。単語境界に MySQL マーカーを使用していますが、[[:<:]][[:>:]]無効なパラメーター番号: バインドされた変数の数がトークンの数と一致しない」というメッセージが表示されるため、これは 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 に答える