0

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

$_GET["places"]包含这样的内容:

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

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

我发现在IN ('madrid','lisbon','london')引号$_GET["places"](有没有办法将所有值$_GET["places"]作为单独的字符串输入,中间有逗号?

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

4

3 回答 3

0

小心 IN,在大多数情况下它需要全表扫描,这会扼杀 mysql 性能..

您应该使用 EXPLAIN 检查查询,它会看到它。

于 2013-08-05T11:54:21.927 回答
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()语法错误。

于 2013-08-05T11:37:29.327 回答
-1

尝试

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

请注意,这不会转义可能在 $places 中的任何引号。

如果 $_GET["places"] 是一个字符串,您可以尝试:

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

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

于 2013-08-05T11:34:43.043 回答