使用带有长字符串的MySQL“in”子句

时间:2013-08-05 11:30:00

标签: php mysql orm

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

$_GET["places"]包含以下内容:

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

当数组名称$ places被放入像IN ('$places')这样的where子句时,我没有得到任何行。根据此处其他类似问题的建议,我将数组内爆,使其看起来像"madrid, lisbon, london, paris, new york",然后使用像IN ('$implodedplaces')这样的内爆变量,但如前所述,它没有找到任何行。

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

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

3 个答案:

答案 0 :(得分: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(),这是语法错误。

答案 1 :(得分:0)

注意IN,在大多数情况下它需要全表扫描,这会杀死mysql的性能。

您应该使用EXPLAIN检查查询。

答案 2 :(得分:-1)

尝试

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

请注意,这不会转义$ place中的任何引号。

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

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

但这确实假设您在地名中找不到引号和括号。