我使用PDO来执行一个包含IN子句的语句,该子句使用数组作为其值:

$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();
$my_results = $my_result->fetchAll();

The above code works perfectly fine, but my question is why this doesn't:
 $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不擅长这种事情.您需要动态创建一个带有占位符的字符串,并将其插入查询中,同时以通常的方式绑定数组值.使用位置占位符时,情况如下:

$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();

如果查询中有其他占位符,可以使用以下方法(代码取自my PDO tutorial):

您可以使用array_merge()函数将所有变量联接到单个数组中,以数组的形式添加其他变量,并按照它们在查询中出现的顺序进行添加:

$arr = [1,2,3];
$in  = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE foo=? AND column IN ($in) AND bar=? AND baz=?";
$stm = $db->prepare($sql);
$params = array_merge([$foo], $arr, [$bar, $baz]);
$stm->execute($params);
$data = $stm->fetchAll();

在使用命名占位符的情况下,代码会稍微复杂一些,因为必须创建一系列命名占位符,例如:id0,:id1,:id2.所以代码应该是:

// other parameters that are going into query
$params = ["foo" => "foo", "bar" => "bar"];

$ids = [1,2,3];
$in = "";
$i = 0; // we are using an external counter 
        // because the actual array keys could be dangerous
foreach ($ids as $item)
{
    $key = ":id".$i++;
    $in .= ($in ? "," : "") . $key; // :id0,:id1,:id2
    $in_params[$key] = $item; // collecting values into a key-value array
}

$sql = "SELECT * FROM table WHERE foo=:foo AND id IN ($in) AND bar=:bar";
$stm = $db->prepare($sql);
$stm->execute(array_merge($params,$in_params)); // just merge two arrays
$data = $stm->fetchAll();

幸运的是,对于命名占位符,我们不必遵循严格的顺序,因此我们可以按任何顺序合并array.

Php相关问答推荐

我的docker—compose lamp stack在软件更新后不工作:Containerconfig错误'''

允许Laravel路由指定`withTrashed`,尽管有显式的模型绑定

LaravelEloquent 的地方条件父/子与第三模型多对多

Mysqli_stmt::Execute():结果字段元数据中存在过早的EOF

PHP原始数据读取引发max_input_vars错误

Laravel Livewire如何在数组值上使用IF、ELSE条件

根据产品类型显示或隐藏WooCommerce管理产品自定义字段

如何在UML类图中可视化变量引用数组

带Redhat php curl的http_code 0

PHP -流加密启用服务器切断字节

在WooCommerce管理中为订单项目添加自定义字段价格值

从WooCommerce订单项目获取Dokan卖家详细信息

如何使用 PHP 创建简化的 twig 替换?

如何判断php中wordpress路径之外的文件夹是否存在?

如何正确判断 PHP 是否已正确配置为使用 DOMDocument?

我的功能以舒适的方式显示数组 struct

为WooCommerce中的Guest用户保存唯一的客户代码到订单中

PHP使用三元运算符进行null合并(再次)

批量作业(job)提交错误无法处理所有文档,uris 似乎正确?

同一页面上多个组件的 Livewire 分页问题