我正在使用一个应用程序,该应用程序需要对数据库进行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"]
中输入所有值作为单独的字符串,其间有逗号?
任何帮助表示赞赏 - 如果我的解释不是很好,请随时提问。
答案 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"])));
但这确实假设您在地名中找不到引号和括号。