Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP编写的语句,其中动态WHERE子句在(…;)子句中使用_Php_Sql - Fatal编程技术网

PHP编写的语句,其中动态WHERE子句在(…;)子句中使用

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)添加到

我在PHP脚本中遇到IN()子句的问题,我在POST请求中从另一个页面接收数据,如下所示:

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。它们指向插入单个值的位置