当前位置: 首页 > 面试题库 >

PHP-将PDO与IN子句数组一起使用

柳英豪
2023-03-14
问题内容

我正在使用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();

上面的代码工作得很好,但是我的问题是为什么不能:

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

如果查询中还有其他占位符,则可以使用以下方法(代码取自我的PDO教程):

您可以使用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 = "";
foreach ($ids as $i => $item)
{
    $key = ":id".$i;
    $in .= "$key,";
    $in_params[$key] = $item; // collecting values into key-value array
}
$in = rtrim($in,","); // :id0,:id1,:id2

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

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



 类似资料:
  • 问题内容: 我的代码: 始终显示为1的计数,但是当我跳过参数化并仅将变量本身添加到其位置时,我得到了准确的计数。这里发生了什么? 问题答案: 您不能像这样为IN子句绑定参数。$ myArray字符串将仅计为一个值,例如执行以下操作: 即使有三个以逗号分隔的值,数据库也会将它们作为一个字符串值读取。 您需要以惯用的方式手动将IN列表插入查询中。 不幸的是没有其他办法。至少现在(是。

  • 我正在为一个项目使用JDBI / Dropwizard,希望运行一些简单的查询。我有这样一个疑问: 我在方法中绑定变量,如下所示: 但是,运行时出现以下错误: 我将作为字符串类型的 传递,所以我有点困惑这里发生了什么。有谁JDBI的正确方法?

  • 问题内容: 我可以在oracle数据库中使用公用表表达式进行更新吗? 我在尝试时遇到错误: 问题答案: 由于仅是一个 标量值, 您可以做 在这种情况下,Oracle首先 计算平均值 (例如),然后执行 更新 。

  • 问题内容: 我正在尝试在数据库中查询产品ID数组中包含“ product_id”的记录。 该数组是多重选择输入()的发布结果,如下所示: 我想将该数组传递给SQL语句的“ IN”子句,例如: …但这是行不通的(错误:)。 一些帖子建议使用此函数以适合SQL的方式格式化数组: 如 … 这将导致以下查询: …以及此错误: 我究竟做错了什么? 任何帮助是极大的赞赏!如果需要,我可以澄清这个问题:) 问题

  • 问题内容: 我的条款之一是: 和是可能是的输入参数。 如果它们都为null,则基本上需要忽略和返回所有记录。 如果是,但是是,那么我需要返回DateCreated不大于(包括)的所有记录。 如果是,但是是,那么我需要返回所有记录,其中DateCreated不得早于(包括)直到今天的日期。 DateCreated不是null或有时是null字段。 到目前为止,我的子句无法完全按照我的要求运行。 问题

  • 问题内容: 使用,为什么它对(原始类型)和数组显示不同的列表大小? a)对于数组,每当我执行以下程序时,列表大小= 1 b)但是,如果我从数组类型更改为array(如),则列表大小为4,我认为这是正确的。 PS :使用(包装类)数组,则结果很好,但是我不确定为什么在原始数组中列表大小为1。请解释。 问题答案: 由于Java泛型而无法保存原始值(请参阅类似的问题)。因此,当您调用Arrays 时,将