【问题标题】:Array in Mysql WHERE LIKE?Mysql中的数组在哪里?
【发布时间】:2012-03-15 04:00:55
【问题描述】:

我需要选择数组列表。 $array_name 包含:

Array ( [0] => gum.cn [1] => lol.com. [2] => ns1.blar.com [3] => test.com [4] => web.cn. )

print_r($array_name);

  $string = implode(',',$array_name);


    $tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE '%{$string}%'";
    $result1 = mysql_query($tank); 
      while ($jwp = mysql_fetch_array($result1)) 
      {     
      echo $jwp['url']; 
      echo "<br>"; 
      }

为什么上述方法不起作用?我搜索其他示例,问题是在不使用 LIKE 子句的情况下提出问题,因此那里没有解决方案。请帮忙,提前谢谢。

【问题讨论】:

  • @lamplightdev:REGEXP 是一个不错的选择,但不幸的是,这里的域包含. 字符,它们是正则表达式中的通配符。您可以逃脱它们,但是对于 IMO 如此微不足道的事情来说,工作量太大了。虽然可以考虑。

标签: php mysql arrays


【解决方案1】:

它不会起作用,因为它会尝试将(例如)'gum.cn' 的数据库值与 '%gum.cn,lol.com,.....%' 匹配,这永远不会真的。

宁可这样做:

foreach ($array_name as $string) {
    $tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE '%{$string}%'";
    $result1 = mysql_query($tank); 
    echo $jwp['url']; 
    echo "<br>"; 
}

希望对您有所帮助。

【讨论】:

  • 循环运行查询?这不是一个好习惯,也不能回答 OP 的问题 :)
  • OP 的问题是解释为什么它不起作用,我在响应的顶部做了。
  • 当你变得更有经验时,你就会知道我今天所说的(在循环中运行查询)是正确的:)
  • 我试试这个 ralfe 但它不起作用。我没有错误,也没有输出。无论如何,问题已经解决了。感谢您的帮助:)
【解决方案2】:

它不起作用,因为您的查询将扩展为:

SELECT url FROM `PHP`.`db` WHERE url LIKE '%gum.cn,lol.com.,ns1.blar.com...%'

您必须稍微修改一下您的查询:

$query_parts = array();
foreach ($array_name as $val) {
    $query_parts[] = "'%".mysql_real_escape_string($val)."%'";
}

$string = implode(' OR url LIKE ', $query_parts);

$tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE {$string}";

【讨论】:

  • 嘿,非常感谢。现在可以了,但我不明白这一点,$string = implode(' OR url LIKE ', $query_parts); 为什么需要删除 ' OR url LIKE ' 包括空格?我希望你能解释一下并感谢你的时间。
  • @sg552:它不会删除它,它会添加它。将查询转储到屏幕上,您可能会明白。
  • 经过这么长时间我认为implode() 假设要从数组中删除逗号或空格。我得到的输出为:%gum.cn%' OR url LIKE '%lol.com.%' OR url LIKE '%blar.com%' OR url LIKE '%test.com%' OR url LIKE '%web.cn.% 如果我理解正确,MySQL 将$string 变量解释为一个长字符串,如果我有 1000 个域,那么 1 个查询中将执行 1000 个域?正确的?感谢您的宝贵时间。
【解决方案3】:

因为它会生成无效的 SQL(好吧,技术上是有效的,它只是不会按照你的想法去做)

SELECT url FROM `PHP`.`db` WHERE url LIKE '%a,b,c,d,%'

您要么必须附加多个 LIKE 语句。除非您正在执行精确的字符串匹配查询,否则 Implode 不适用于此任务。即使这样,您也需要调整代码。

【讨论】:

  • 顺便说一句,这是完全有效的 SQL。
  • 有效的 SQL,但不适用于他想要做的事情。
【解决方案4】:

使用 IN 子句,但确保值被引用和转义:

//TODO: escape $array_name values

$string = implode("','",$array_name); //ensure quoted values

$tank = "SELECT url FROM `PHP`.`db` WHERE url IN ('$string')";

【讨论】:

    【解决方案5】:

    /** * 内爆一个多维值数组,当与“[]”块不同时对字符进行分组。 * @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 );
    

    }

    【讨论】:

      【解决方案6】:

      /* 数组中的数据 */

      $array_name = array("gum.cn","lol.com","ns1.blar.com","test.com","web.cn");
      

      /* 用分隔符(空格)将数组元素连接成一个字符串“” */

      echo $string = implode(" ", $array_name); 
      // output: gum.cn lol.com ns1.blar.com test.com web.cn
      

      /* 将分隔符(空格)“”替换为“%' OR '%” */

      echo $string = str_replace(" ", "%' OR '%", $string);
      // output: gum.cn%' OR '%lol.com%' OR '%ns1.blar.com%' OR '%test.com%' OR '%web.cn
      

      /* 插入查询sql */

      $tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE 
      

      '%$string%'

      ";

      【讨论】:

        【解决方案7】:

        我知道这个问题很老,但我希望这对其他人有用。

        我们可以使用REGEXP 而不是LIKE 例如:

        $string = implode('|',$array_name);
        $tank = "SELECT url FROM `PHP`.`db` WHERE url REGEXP '".$string."'";
        

        【讨论】:

        • 将变量直接插入 sql 字符串是不现代的、稳定的或安全的。所有新的答案都应该实施准备好的陈述,以便研究人员开始学习如何专业地编码。
        猜你喜欢
        • 2014-01-23
        • 2014-02-02
        • 1970-01-01
        • 2012-04-01
        • 2013-07-30
        • 2020-10-06
        • 2011-06-01
        • 2015-05-14
        • 1970-01-01
        相关资源
        最近更新 更多