PHP编写的语句,其中动态WHERE子句在(…;)子句中使用
我在PHP脚本中遇到IN()子句的问题,我在POST请求中从另一个页面接收数据,如下所示:PHP编写的语句,其中动态WHERE子句在(…;)子句中使用,php,sql,Php,Sql,我在PHP脚本中遇到IN()子句的问题,我在POST请求中从另一个页面接收数据,如下所示: if( isset($_POST['mycountry'])){ if($_POST['mycountry']) $where[] = 'pays in ( :pays )'; }; $\u POST['mycountry']:包含用户选择的国家/地区(用户可以选择零个或多个国家/地区) 如果用户选择country/countries,我会将相关列和值(countries)添加到
if( isset($_POST['mycountry'])){
if($_POST['mycountry']) $where[] = 'pays in ( :pays )';
};
$\u POST['mycountry']:包含用户选择的国家/地区(用户可以选择零个或多个国家/地区)
如果用户选择country/countries,我会将相关列和值(countries)添加到IN子句中
if(isset($_POST['mycountry'])){
$tags = implode(', ', $_POST['mycountry']);
$stmt->bindParam(':pays', $tags, PDO::PARAM_BOOL);
}
当用户选择零或仅一个国家时,它工作正常,一旦用户选择多个国家,它将不返回任何内容
有什么想法吗?我确实知道,在oracle中,不能将数组绑定到单个变量。我认为PDO也是如此 您需要做的是运行for-each循环,创建一个一对一绑定,并用生成的新一对一绑定替换原始绑定。
(当然,还要更新绑定数组,使其具有您生成的键值对)PDO参数不能绑定任意字符串来构造SQL,它们为准备好的语句中的变量值提供1:1的替换。因此,传递单个占位符
:pays
将导致所有逗号分隔标记的单个字符串值一起发送到查询中。链接问题中提出了一些备选解决方案。该问题适用于一个选定项目,而不是当用户选择多个项目时!!正确的。因为当只选择一个时,MySQL最终看到的查询是WHERE pays IN('1')
——这是有效的并返回结果。但是当选择了倍数时,MySQL会看到WHERE pays IN('1,2,3,4,5')
Note,这是一个带有数字和逗号的字符串值,而不是一个逗号分隔的值列表。查询在语法上不是无效的,但永远不会与您的行匹配。你不能做你想做的事。请参阅链接问题中的高分答案。正如您所说,在哪里支付in('1,2,3,4,5'),但PDO为什么在in子句中添加'?为什么不在哪里付费(1,2,3,4,5)?除非启用了emulate prepares,否则PDO不会直接引用它,但关键是它将它作为单个字符串参数传递给MYSQL prepared语句。如前所述,占位符不用于动态构造SQL。它们指向插入单个值的位置