【问题标题】:SQL LIKE % inside array数组内的 SQL LIKE %
【发布时间】:2012-03-14 00:52:04
【问题描述】:

我知道如何对单个值执行 SQL LIKE % 查询,如下所示:

SELECT * FROM users WHERE name LIKE %tom%;

但是如果我的 LIKE 的搜索词来自一个数组,我该怎么做呢?例如,假设我们有一个这样的数组:

$words = array("Tom", "Smith", "Larry");

如何执行我的 SQL LIKE % 来搜索我的数组中的单词,例如:

SELECT * FROM users WHERE name LIKE %[each_element_from_my_array]%

没有将整个查询放在 foreach 循环或其他东西中

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

谢谢

【问题讨论】:

标签: php mysql sql sql-like


【解决方案1】:
$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
    )
));

阅读这些东西:http://book.cakephp.org/1.3/en/view/1030/Complex-Find-Conditions

【讨论】:

  • 我的想法完全正确。很好的答案!只是在有一个空数组时需要小心,这会导致 SQL 错误......
  • 我认为OR 0 会很好...... ;)
  • 这会起作用,但是我如何在 cakePHP 的 find('all') 函数中做到这一点(见编辑)
  • 我知道这已经过时了,但让我感到震惊的是这将如何对 sql 注入开放 - 安全是一个热门话题 atm 认为我会提出它
【解决方案2】:

如果是标准 SQL,则为:

SELECT * FROM users WHERE name LIKE '%tom%' 
                       OR name LIKE '%smith%' 
                       OR name LIKE '%larry%';

由于您使用的是 MySQL,因此您可以使用 RLIKE (a.k.a. REGEXP)

SELECT * FROM users WHERE name RLIKE 'tom|smith|larry';

【讨论】:

  • RLIKE 对我来说恰好是一个绝对好的解决方案,谢谢!! ;)
  • 我的列 'name' 需要包裹在 'lower' 函数中,这是否会使查询在多个 'or's 和 'like's 上变慢?
【解决方案3】:

你不能。它必须是链式field like %..% or field like %..% or ...where ... in 子句只提取字符串匹配项,不支持通配符。

【讨论】:

    【解决方案4】:

    尝试使用REGEXP

    SELECT * FROM users where fieldName REGEXP 'Tom|Smith|Larry';
    

    【讨论】:

      【解决方案5】:

      我刚拿了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 DB说有问题!所以我不得不逃避$sql[] = 'name LIKE %'.$word.'%'的引用 现在它完美地工作了。

      【讨论】:

        【解决方案6】:

        块引用

        /** * 内爆一个多维值数组,当与“[]”块不同时对字符进行分组。 * @param array $array 要内爆的数组 * @return string 内爆数组 */ 函数 hoArray2SqlLike($array) { if ( !is_array( $array ) ) return $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 );
        

        }

        【讨论】:

          【解决方案7】:

          在这段代码中,我们无法在 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%';
          

          【讨论】:

            【解决方案8】:

            试试这个: 只需要多一行代码 :)

            $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%";
            

            【讨论】:

            • 请分享更多细节 - 这比现有答案更好吗?
            【解决方案9】:

            许多 SQL 系统允许您将其作为字符值推送。 CHAR(10) = 换行。因此,偶尔,您可以通过这种方式将单引号、双引号和其他东西推入 sql 字符串,而不是解决所有的转义编码,而不会出现太多其他编码问题。

            -只是一个提示。

            【讨论】:

            • 嗨,欢迎来到堆栈溢出。解释为什么这是问题的答案。
            • 请分享更多细节 - 这与给定问题有什么关系?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-06
            • 1970-01-01
            • 1970-01-01
            • 2010-12-18
            • 1970-01-01
            • 2011-08-10
            相关资源
            最近更新 更多