2013-08-05 32 views
0

我正在使用一个应用程序,它需要对数据库执行where查询以返回具有“t1.address_city”(数据库中的一列)的行等于数组中的任何位置。我知道我应该使用implode()将它变成一个大字符串,但这不会返回任何行 - 大概是因为它正在寻找与大字符串匹配的行(当然这不仅仅是一个城市,它是一个列表)。代码:使用带有长字符串的MySQL“in”子句

$_GET["places"]包含这样的事情:

["madrid", "lisbon", "london", "paris", "new york"]

当数组名,$地方,放入WHERE子句像IN ('$places'),我没有得到任何行。按照这里的其他类似问题的建议,我将阵列击碎,使其看起来像"madrid, lisbon, london, paris, new york",然后使用像IN ('$implodedplaces')这样的内部变量,但如前所述,它找不到任何行。

我发现输入每个地名的引号(IN ('madrid','lisbon','london'))单独工作完美,但当然我需要IN子句使用$_GET["places"],因为这是由用户操纵的。有没有办法在$_GET["places"]中输入所有的值作为逗号分隔的字符串?

任何帮助表示赞赏 - 如果我的解释不是很好,请随时提问。

+1

听起来像所有你想做的事情是把所有嵌入的单引号字符加倍,用双引号代替单引号,并丢弃方括号? –

+0

Mysql也接受IN(“madrid”,“lisbon”,“london”),所以你只需要删除那些方括号。 –

+0

它不只是方括号......它是一个数组。 –

回答

-1

尝试

$implodedplaces = implode("','", $places); 

请注意,这并不逃避,可能是在$地方的任何报价。

如果$ _GET [“地方”]是一个字符串,你可以尝试:

$implodedplaces = str_replace('"', "'", str_replace('[',"'", str_replace(']',"'",$_GET["places"]))); 

这确实有这样的假设但是,你不会找到你的地名报价和括号。

+0

结合使用WHERE't1.address_city IN('“。$ places。''))”)',这个工作非常完美,我没有经常使用内爆/爆炸,所以它没有穿过我的脑海 - doh! – jbirch

+0

由于它无法解决SQL注入问题,所以我低估了这个问题 – Halcyon

0

你需要记住,你需要做的转义:

$in = []; 
foreach ($_GET["places"] as $place) { 
    $in[] = mysql*_real_escape_string($place); 
} 
$in = '"' . implode('", "', $in) . '"'; 
$query = "select * from t where f IN (" . $in . ")"; 

此外,您需要检查count($_GET["places"]),因为如果它是空的,你的查询将有IN()这是一个语法错误。

+0

请注意在MYSQL中使用双引号括住字符串,如果它在ANSI模式下,双引号用于引用列名和表名 – noz

+0

不知道为什么这不起作用我因为它有点类似于上面的解决方案,但它给了我一个服务器错误。我正在使用别人的服务器,因此我无法访问错误日志以查明是否是我所做的事情,但我会尝试找出答案。谢谢你的帮助,感谢Frits。 – jbirch

+0

你需要用任何适用的函数替换mysql * _real_escape_string'。像'mysqli_real_escape_string'一样,如果你使用'mysqli'。 – Halcyon

0

小心在,在大多数情况下,它需要全表扫描,这杀死了MySQL的性能..

您应该检查与解释它看到它的查询。

+0

如果您使用'IN'如'a IN(“b”,“c”,“d”)作为:'a =“b”或a =“c”或a =“d”' – Halcyon

+0

您在IN子句中传递的参数越高,mysql优化器将从范围扫描切换到全表扫描。因为你的查询不太具有选择性 –