Php 使用MySQL“;在;长字符串子句

Php 使用MySQL“;在;长字符串子句,php,mysql,orm,Php,Mysql,Orm,我正在使用一个应用程序,该应用程序需要对数据库进行where查询,以返回包含“t1.address_city”(数据库中的一列)的行,该行等于数组中的任何位置。我知道我应该使用infrade()将其转换为一个大字符串,但这不会返回任何行-大概是因为它正在查找与大字符串匹配的行(当然,这不仅仅是一个城市,而是一个列表)。代码: $\u GET[“places”]包含如下内容: [“马德里”、“里斯本”、“伦敦”、“巴黎”、“纽约”] 当数组名$places放入where子句(如('$places'

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

$\u GET[“places”]
包含如下内容:

[“马德里”、“里斯本”、“伦敦”、“巴黎”、“纽约”]

当数组名$places放入where子句(如('$places')中的
)时,我没有得到任何行。按照这里其他类似问题的建议,我内爆了数组,使其看起来像
“马德里、里斯本、伦敦、巴黎、纽约”
,然后在(“$implodedplaces”)中使用内爆变量
,但如前所述,它找不到任何行

我发现在引号中分别输入每个地名(
in('madrid'、'lisbon'、'london')
)效果很好,但是我当然需要in子句来使用
$\u GET[“places”]
,因为这是由用户操作的。是否有任何方法可以将
$\u GET[“places”]
中的所有值作为单独的字符串输入,中间带逗号

感谢任何帮助-如果我的解释不好,请随时提问。

试试看

$implodedplaces = implode("','", $places);
请注意,这不会转义$places中的任何引号

如果$\u GET[“places”]是一个字符串,您可以尝试:

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

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

您需要记住,您需要执行以下操作:

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

此外,您还需要检查
count($\u GET[“places”])
,因为如果它为空,您的查询将有
IN()
,这是一个语法错误。

请注意IN,在大多数情况下,它需要完整的表扫描,这会降低mysql的性能


您应该用EXPLAIN it查看查询。

听起来您所要做的就是将任何嵌入的单引号字符对折,用双引号替换单引号,然后扔掉方括号?Mysql在(“马德里”、“里斯本”、“伦敦”)中也接受所以你只需要去掉那些方括号。不仅仅是方括号。。。这是一个数组。请注意在MYSQL中使用双引号括住字符串。如果是在ANSI模式下,双引号用于引用列和表名。不确定为什么这对我不起作用,因为它与上面的解决方案有些类似,但它给了我一个服务器错误。我正在使用其他人的服务器,因此我无法访问错误日志,以确定是否是我所做的某件事导致了错误,但我将尝试找出原因。非常感谢您的帮助,谢谢Frits。您需要用任何适用的函数替换
mysql*\u real\u escape\u string
。像
mysqli\u real\u escape\u string
如果你使用
mysqli
。结合WHERE
t1.address\u city In(“$places.”)和
,这非常有效。我没有经常使用内爆/爆炸,所以我不会想到它-doh!如果你在
中使用
a In(“b”,“c”,“d”)
as:
a=“b或a=“c”或a=“d”
在in子句中传递的参数越多,mysql优化器将从范围扫描切换到完整表扫描的更改就越高。因为你的查询没有那么选择性