Php 数组内类似SQL的%

Php 数组内类似SQL的%,php,mysql,sql,sql-like,Php,Mysql,Sql,Sql Like,我知道如何对单个值执行类似SQL的%查询,例如: SELECT * FROM users WHERE name LIKE %tom%; 但是,如果我喜欢的搜索词来自数组,我该怎么做呢?例如,假设我们有这样一个数组: $words = array("Tom", "Smith", "Larry"); 如何执行SQL LIKE%在数组中搜索单词,如: SELECT * FROM users WHERE name LIKE %[each_element_from_my_array]% 不需要将整个

我知道如何对单个值执行类似SQL的%查询,例如:

SELECT * FROM users WHERE name LIKE %tom%;
但是,如果我喜欢的搜索词来自数组,我该怎么做呢?例如,假设我们有这样一个数组:

$words = array("Tom", "Smith", "Larry");
如何执行SQL LIKE%在数组中搜索单词,如:

SELECT * FROM users WHERE name LIKE %[each_element_from_my_array]%
不需要将整个查询放在foreach循环或其他东西中

编辑:我忘了提到我在cakePHP中在cakePHP find('all')方法的条件下执行此操作,因此这使事情有点复杂


谢谢

你不能。它必须是一个链接的
字段,如%..%或%..%或…
。A
其中。。。in
子句只提取字符串匹配,不支持通配符

$sql = array('0'); // Stop errors when $words is empty

foreach($words as $word){
    $sql[] = 'name LIKE %'.$word.'%'
}

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql);

编辑:CakePHP的代码:

foreach($words as $word){
    $sql[] = array('Model.name LIKE' => '%'.$word.'%');
}

$this->Model->find('all', array(
    'conditions' => array(
        'OR' => $sql
    )
));

请仔细阅读以下内容:

对于标准SQL,应该是:

SELECT * FROM users WHERE name LIKE '%tom%' 
                       OR name LIKE '%smith%' 
                       OR name LIKE '%larry%';
因为您使用的是MySQL,所以可以使用

试用


我刚取了472084的密码

$sql = array('0'); // Stop errors when $words is empty

foreach($words as $word){
    $sql[] = 'name LIKE %'.$word.'%'
}

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql);
对于我自己,我不得不修改它,因为它返回了一个错误SQL。 我把它贴给那些想读这篇文章的人

foreach($words as $word){
    $sql[] = 'name LIKE \'%'.$word.'%\'';
}

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql);
他们之间的区别是关于报价,我的mysql数据库说有一个问题!因此,我不得不从
$sql[]='name LIKE%'.$word.%'
现在它的工作非常完美

大宗报价

/** *内爆多维值数组,在与“[]”块不同时对字符进行分组。 *@param array$array要内爆的数组 *@return string内爆数组 */ 函数hoArray2SqlLike($array) { 如果(!is_array($array))返回$array

$values  = array();
$strings = array();

foreach ( $array as $value )
{
    foreach ( str_split( $value ) as $key => $char )
    {
        if ( ! is_array( $values[ $key ] ) )
        {
            if ( isset( $values[ $key ] ) )
            {
                if ( $values[ $key ] != $char )
                {
                    $values[ $key ]     = array( $values[ $key ] );
                    $values[ $key ][]   = $char;
                }
            }
            else
                $values[ $key ] = $char;
        }
        elseif ( ! array_search( $char , $values[ $key ] ) )
            $values[ $key ][] = $char;
    }
}

foreach ( $values as $value )
{
    if ( is_array( $value ) )
        $value = '['.implode( '', $value ).']';

    $strings[] = $value;
}

return implode( '', $strings );

}

在这段代码中,我们无法在sql查询中获得双引号

$sql = array('0'); // Stop errors when $words is empty

foreach($words as $word){
    $sql[] = 'name LIKE %'.$word.'%'
}

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql);

SELECT * FROM person where name like %"Tom"% OR name like %"Smith"% OR name like %"Larry"%;
// error in double quotes and % is out side of Double quotes .
也可以使用逗号分隔值:-

$name = array(Tom, Smith, Larry);

$sql="SELECT * FROM person";

    extract($_POST);
    if ($name!=NULL){
    $exp_arr= array_map('trim', explode(",",$name));
    echo var_export($exp_arr);
    //die;
        foreach($exp_arr as $val){
        $arr = "'%{$val}%'";
        $new_arr[] = 'name like '.$arr;
        }

      $new_arr = implode(" OR ", $new_arr);
      echo $sql.=" where ".$new_arr;
    }
        else {$sql.="";}
像这样回显sql查询:-

SELECT * FROM person where name like '%Tom%' OR name like '%Smith%' OR name like '%Larry%';

许多SQL系统允许您将其作为字符值推送。字符(10)=换行符。因此,有时候,您可以通过这种方式将单引号、双引号和其他内容推送到sql字符串中,而不必解决所有转义编码问题

-只是一个提示。

试试这个: 只需要一行额外的代码:)


我的想法完全正确。回答得好!当有一个空数组会导致SQL错误时,只需要小心……我认为
或0
就可以了……;)这是可行的,但我如何在cakePHP的find('all')函数中做到这一点(请参见编辑)我知道这很旧,但我突然想到这将是如何向sql注入开放的-安全性是一个热门话题,atm认为我会提出它,就像对我来说是一个绝对伟大的解决方案,谢谢!!;)我的列“name”需要包装在“lower”函数中,它是否会使查询在多个“or”和“like”上变慢?您的问题对标记至少有
5票。我可以请求你作为一个顾问吗?嗨,欢迎来到stack overflow。解释为什么这是问题的答案。请分享更多细节-这与给定问题有什么关系?请分享更多细节-这比现有答案更好吗?
$name = array(Tom, Smith, Larry);

$sql="SELECT * FROM person";

    extract($_POST);
    if ($name!=NULL){
    $exp_arr= array_map('trim', explode(",",$name));
    echo var_export($exp_arr);
    //die;
        foreach($exp_arr as $val){
        $arr = "'%{$val}%'";
        $new_arr[] = 'name like '.$arr;
        }

      $new_arr = implode(" OR ", $new_arr);
      echo $sql.=" where ".$new_arr;
    }
        else {$sql.="";}
SELECT * FROM person where name like '%Tom%' OR name like '%Smith%' OR name like '%Larry%';
$words = array("Tom", "Smith", "Larry"); 

$words = implode("%' OR `name` LIKE '%", $words);
// result -> Tom% OR `name` LIKE %Smith% OR `name` LIKE %Larray

$menus = "SELECT * FROM `users` WHERE `name` LIKE '%" . $words . "%'";
// result -> "... WHERE `name` LIKE %Tom% OR `name` LIKE %Smith% OR `name` LIKE %Larray%";