
PHP - 将 PDO 与 IN 子句数组结合使用
PDO 允许您执行包含带有值数组的 IN 子句的 SQL 语句。虽然此方法适用于字符串连接 (implode()),但在使用占位符时可能会导致问题。
识别问题
以下代码使用占位符,不会返回所有预期的项目:
1 2 3 4 5 | $in_array = array (1, 2, 3);
$in_values = implode( ',' , $in_array );
$my_result = $wbdb ->prepare( "SELECT * FROM my_table WHERE my_value IN (:in_values)" );
$my_result ->execute( array ( ':in_values' => $in_values ));
$my_results = $my_result ->fetchAll();
|
登录后复制
此代码仅返回 my_value 等于的项目$in_array 中的第一个元素 (1),而不是其他元素(2 和 3)。
位置占位符的解决方案
PDO 需要动态创建带有占位符的字符串并将其插入到查询中,同时像往常一样绑定数组值。对于位置占位符,此解决方案有效:
1 2 3 4 5 | $in = str_repeat ( '?,' , count ( $in_array ) - 1) . '?' ;
$sql = "SELECT * FROM my_table WHERE my_value IN ($in)" ;
$stm = $db ->prepare( $sql );
$stm ->execute( $in_array );
$data = $stm ->fetchAll();
|
登录后复制
命名占位符解决方案
命名占位符的方法涉及创建一系列占位符(例如:id0、 :id1, :id2) 并将值收集到键值数组中。下面是一个示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $ids = [1,2,3];
$in = "" ;
$i = 0;
foreach ( $ids as $item )
{
$key = ":id" . $i ++;
$in .= ( $in ? "," : "" ) . $key ;
$in_params [ $key ] = $item ;
}
$sql = "SELECT * FROM table WHERE foo=:foo AND id IN ($in) AND bar=:bar" ;
$stm = $db ->prepare( $sql );
$stm ->execute( array_merge ([ "foo" => "foo" , "bar" => "bar" ], $in_params ));
$data = $stm ->fetchAll();
|
登录后复制
通过遵循这些解决方案,您可以成功地将 PDO 与包含值数组的 IN 子句结合使用。
以上是如何在 PHP 中正确使用 PDO 与 IN 子句和数组?的详细内容。更多信息请关注PHP中文网其他相关文章!