Mysql中的数组在哪里?

Posted

技术标签:

【中文标题】Mysql中的数组在哪里?【英文标题】:Array in Mysql WHERE LIKE? 【发布时间】: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 子句的情况下提出问题,因此那里没有解决方案。请帮忙,提前谢谢。

【问题讨论】:

类似问题的好答案:***.com/questions/1127088/mysql-like-in @lamplightdev:REGEXP 是一个不错的选择,但不幸的是,这里的域包含. 字符,它们是正则表达式中的通配符。您可以逃脱它们,但是对于 IMO 如此微不足道的事情来说,工作量太大了。虽然可以考虑。 【参考方案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 字符串是不现代的、稳定的或安全的。所有新的答案都应该实施准备好的陈述,以便研究人员开始学习如何专业地编码。

以上是关于Mysql中的数组在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

我在哪里可以找到 XAMPP 中的 MySQL 日志文件

我在哪里可以找到 phpMyAdmin 中的 MySQL 日志?

这个 MySQL 存储过程中的语法错误在哪里?

MySQL 中的 FORCE INDEX - 我把它放在哪里?

DB::raw laravel 5.4 中的数组绑定在哪里

如果将数组用作 struct (C#) 中的元素,它存储在哪里?