Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 类似MySQL的字符串数组_Php_Yii - Fatal编程技术网

Php 类似MySQL的字符串数组

Php 类似MySQL的字符串数组,php,yii,Php,Yii,我有一大堆单词 $terms = array('bars', 'bar', 'fun'); 我试图找到包含每个单词的所有记录 TableName::model()->findAll('name LIKE :name, array(':name'=>implode(',', $terms))); 不确定查找数组中所有内容的正确方法。您可以在findAll中使用CDbCriteria类进行此类查询,如下所示 $terms = array('bars', 'bar', 'fun');

我有一大堆单词

$terms = array('bars', 'bar', 'fun');
我试图找到包含每个单词的所有记录

TableName::model()->findAll('name LIKE :name, array(':name'=>implode(',', $terms)));

不确定查找数组中所有内容的正确方法。

您可以在
findAll
中使用
CDbCriteria
类进行此类查询,如下所示

$terms = array('bars', 'bar', 'fun');
$criteria = new CDbCriteria 
$criteria->compare('name',$terms,true,"AND",true);

TableName::model()->findAll($criteria);
有关详细信息,请参阅文档

是否适合您的具体情况。但是,由于(读取源代码)的实现,它将不适用于部分搜索,即像“%ADF%”这样的
。为此,您可以在数组中循环并使用
compare
添加每个元素:

$c1=new CDbCriteria;

foreach($terms as $txt){ 
    $c1->compare('name',$txt,true,'OR');
}

TableName::model()->findAll($c1);

但是,如果您遇到需要为另一个组添加另一个条件的情况,则由于
compare
创建查询的方式,结果可能不符合预期,即您可能最终

WHERE ((((type=1) OR (name LIKE '%ABC%')) OR (name LIKE '%RET%')) OR (name LIKE '%Anything else%'))
要避免这种情况,您有两种选择:

  • 始终确保首先显示您的“阵列条件”
  • 专门为数组值创建另一个criteria对象,并使用
    CDbCriteria::merge()

  • 专门为数组值创建另一个条件对象,并使用
    CDbCriteria::addCondition()
    将此条件手动添加到另一个对象中:

  • 使用(2)



    参考:

    hmm这是否也会像绑定参数那样在注入时清理数据?是的,这就是为什么第三个参数($escape)设置为true(默认情况下),它将转义您的输入,它在docs@Manquer你是说第五个参数。
    compare
    的第三个参数是
    partialMatch
    @topher是的,你是对的,我错误地在docs addSearchCondition中看到了前面的函数,其中escape是第三个@曼克尔发生在我们所有人身上。多亏了托弗,这才是我真正需要的,我唯一担心的是这些女伴被消毒了?
    $c1=new CDbCriteria; // original criteria
    $c2=new CDbCriteria; // criteria for handling our search values
    
    foreach($terms as $txt){ 
        $c2->compare('name',$txt,true,'OR');
    }
    
    $c1->mergeWith($c2); // Merge $c2 into $c1
    
    $c1=new CDbCriteria; // original criteria
    $c2=new CDbCriteria; // criteria for handling our search values
    
    foreach($terms as $txt){ 
        $c2->compare('name',$txt,true,'OR');
    }
    
    $c1->addCondition($c->condition); // Merge $c2 into $c1
    $c1->params+=$c2->params; // Add the params for $c2 into $c1