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中的数组在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
我在哪里可以找到 phpMyAdmin 中的 MySQL 日志?