我可以将数组绑定到 PDO 查询中的 IN() 条件吗?

2023-12-11

我很好奇是否可以使用 PDO 将值数组绑定到占位符。这里的用例是尝试传递一个值数组以与IN()健康)状况。

我希望能够做这样的事情:

<?php
$ids=array(1,2,3,7,8,9);
$db = new PDO(...);
$stmt = $db->prepare(
    'SELECT *
     FROM table
     WHERE id IN(:an_array)'
);
$stmt->bindParam('an_array',$ids);
$stmt->execute();
?>

并让 PDO 绑定并引用数组中的所有值。

目前我正在做:

<?php
$ids = array(1,2,3,7,8,9);
$db = new PDO(...);
foreach($ids as &$val)
    $val=$db->quote($val); //iterate through array and quote
$in = implode(',',$ids); //create comma separated list
$stmt = $db->prepare(
    'SELECT *
     FROM table
     WHERE id IN('.$in.')'
);
$stmt->execute();
?>

这当然可以完成这项工作,但只是想知道我是否缺少内置解决方案?


Answer recommended by PHP Collective

您必须手动构建占位符列表,为每个数组成员添加一个占位符。

<?php
$ids     = [1, 2, 3, 7, 8, 9];
$inQuery = str_repeat('?,', count($arr) - 1) . '?'; // gets ?,?,?,?,?,?

$stmt = $db->prepare("SELECT * FROM table WHERE id IN($inQuery)");
$stmt->execute($ids);
$data = $stmt->fetchAll();

Given $inQuery不接受任何输入并完全由常量值构造(?,部分),在查询中添加这样的变量是安全的。

如果查询中有其他占位符,您可以使用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=?";
$stmt = $db->prepare($sql);
$params = array_merge([$foo], $arr, [$bar, $baz]);
$stmt->execute($params);
$data = $stmt->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";
$stmt = $db->prepare($sql);
$stmt->execute(array_merge($params, $in_params)); // just merge two arrays
$data = $stmt->fetchAll();

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以将数组绑定到 PDO 查询中的 IN() 条件吗? 的相关文章

  • Java 数组操作

    我有一个名为 resize 的函数 它接受源数组 并将大小调整为新的宽度和高度 我认为我正在使用的方法效率低下 我听说有更好的方法可以做到这一点 无论如何 当scale是一个int时 下面的代码有效 然而 还有第二个函数称为 half 它使
  • 如何在 PHP 中进行静态代码分析? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有PHP源文件的静态分析工具 二进制文件本身可以检查语法错误 但我正在寻找功能更多的东西 例如 未使用的变量赋值 未先初始化就分配到的
  • $_COOKIE[] 设置后似乎没有反映更改

    我不记得过去使用 Cookie 时遇到过很多问题 但我在尝试时遇到了一些意想不到的结果 我在本地主机上运行 因此我的域设置 这将产生以下输出 Cookie Set Cookie equals 457718770 shou
  • php 验证整数[重复]

    这个问题在这里已经有答案了 我想知道为什么这不起作用 echo gettype GET id returns string if is int GET id echo Integer 如何验证从 GET POST 传递的数据是否为整数 Ca
  • mPDF 临时文件不可使用 Yii 写入

    我尝试打印 PDF 格式的证书 但是当我将代码推送到暂存阶段时 它说 Temporary files directory var www protected vendor mpdf mpdf src Config tmp is not wr
  • c中的数组名到底是什么?

    我很难理解 C 中数组名称的类型和使用 这可能看起来很长 但请耐心等待 我理解以下声明声明a属于类型int i e 整数数组 int a 30 While a还指向数组的第一个元素以及诸如此类的东西 a 2 是有效的 因此 使得a看起来像一
  • JavaScript 对输入的循环创建一个对象数组

    我正在尝试循环 div 中的输入元素 以创建对象数组 div div
  • 如何重定向(标头位置)到 html 文件?

    所以我正在 php 中运行一个注册 登录系统 包括 MySQL 出于测试目的 成功登录后 我将用户重定向到 index php 该文件声明用户已登录 并为他提供注销选项 同时 我制作了一个计划使用的实际 html 页面 因此我只是添加了 i
  • 使用 PHP DOMDocument 更改标签属性值

    我想用 PHP DOMDocument 更改标签属性的值 例如 假设我们有这行 HTML a href http foo bar Click here a 我将上面的代码加载到 PHP 中 如下所示 dom new domDocument
  • 使用 php 和 sendmail 发送有关测试 docker 容器的电子邮件

    我用的是ubuntu 16 04 我有一个 测试 docker docker compose 容器运行 php 5 6 和 apache 2 4 在生产平台 没有docker 上 邮件是通过sendmail发送的 如何在docker容器上发
  • Zend Framework 2 在视图中显示视图

    我有两个模块管理和登录 我想在管理视图 index html 中显示登录视图 login phtml 我在管理模块indexAction控制器中有以下内容 public function indexAction login new Logi
  • laravel 5:找不到类“输入”

    In my routes php我有的文件 Route get function return view login Route get index function return view index Route get register
  • 捕获动态表中 HTML 元素的值

    我有从数据库生成的以下动态表
  • PDO::PARAM_FLOAT 不存在,为什么?

    我想知道为什么 PDO PARAM FLOAT 不存在以及什么可以替代它 没有 可能是由于隐含的舍入问题 只需使用PDO PARAM STR并使用将浮点数转换为字符串strval float or string float
  • php循环中的ajax在按钮单击时执行操作

    所以我有一个 php 循环 我使用 jquery 滑动切换来隐藏 显示带有 sql 结果的表 目前该表仅使用 php 加载 但由于发生了很多事情 导致了一些加载问题 我需要使用滑动切换 btn 来触发 ajax 因此它仅在按下按钮时请求当前
  • PHP 对象创建和内存使用

    一个基本的虚拟类 class foo var bar 0 function foo function boo echo memory get usage echo n foo new foo echo memory get usage ec
  • 下载表格 - 选择文件合并到 Zip 中

    我希望创建一个表单 用户可以从手册列表中进行选择 总共10个 他们可能只想下载 3 份小册子 或 6 份 或 1 份 或 9 份小册子 但想法是他们选择所需的小册子 然后用脚本组合一个包含所需小册子的 zip 文件 任何人都可以提出任何建议
  • cakephp 3.0 如何使用值而不是 id 填充选择字段

    我一直在寻找以前的答案 但我找到的答案与旧的 cakephp 版本有关 我有两个表 杂志 和 问题 其中存在关系 问题 属于 杂志 问题表如下所示 public function initialize array config this g
  • PHP 内置函数复杂性(isAnagramOfPalindrome 函数)

    我在过去的两个小时里一直在谷歌搜索 但找不到 php 内置函数时间和空间复杂度的列表 我有回文字谜 https stackoverflow com questions 4628386 what is the best algorithm t
  • Julia:将数组数组转换为二维数组

    我有一个数组d包含一个浮点数组 julia gt d 99 element Array Array Float64 1 1 我正在尝试将其转换为二维数组 并且我成功地实现了我的目标 data Array Float64 length d l

随机推荐

  • 如何编写自定义 servlet 上下文 init 方法

    我希望在 servlet 上下文初始化阶段使用 servletContext setAttributes 设置一些应用程序范围的变量 我怎样才能实现这一点 实施javax servlet SevletContextListener当java
  • 的原始用途? [关闭]

    Closed 这个问题是无关 目前不接受答案 我很好奇这样做的初衷
  • spring security 5.1 oauth 2,如何向用户身份验证uri添加附加参数

    我正在尝试集成外部 oauth 2 身份验证服务器和资源服务器 它们的配置需要一些额外的自定义参数 state 应该是 uuid TimeStamp accessType 并且 clientSecret 应该使用所有先前参数的组合作为数据进
  • 根据用户选择/提示检索 JSON 数据

    我试图让用户做出选择 并根据该选择深入研究 JSON 数据并显示所选信息 最终 我想在 html 中创建一个下拉选择 并在 Javascript 中创建一个事件监听器 然后进行检索 var userOcean prompt Will you
  • 同时访问变量

    我需要从多个回调 事件处理程序 中增加全局变量 这些回调可能会同时触发 我需要担心同时访问该变量吗 有没有像 C 中的 Interlocked Increment 类似的东西 JavaScript 中有 Interlocked Increm
  • 如何发送 HL7 ACK 消息作为 TCP 响应?

    我通过 TCP 连接接收 HL7 消息 这些消息始终是 ADT 类型 我使用 Kestrel 来监听这些消息 并使用 NHAPI 包来处理它们 我拿了David Fowler 的 Kestrel 示例代码设置 TCP 侦听器 所以基于这个示
  • 使用 Ajax 将 Javascript 变量传递给 PHP

    我目前正在开发一个使用 Ajax 的现有脚本 这是我以前从未使用过的 我在 javascript 文件中设置了一个变量 它从页面上的输入字段获取其值 我需要使用 Ajax 将其发布到我的 PHP 页面 但我不知道从哪里开始 我不确定您需要看
  • 不带控制器后缀的控制器

    根据我的设计要求 我想从控制器中排除后缀 Controller 并将其替换为 Resource 这样 FundsController 将成为 FundsResource 问题是 当我更改替换术语 控制器 时 我无法通过基于约定或属性路由路由
  • 寻找一个javascript解决方案来重新排序div

    我在页面中有一些div显示相同类型的不同内容 例如优惠 现在优惠有结束时间 还有发布时间 如果用户想按结束时间或发布时间排序 则应重新排序 我正在寻找一个可以做到这一点的javascript解决方案 Ext JS或JQuery下的任何特定库
  • 即使刷新页面后如何记住表单中的输入数据?

    为了使表单记住用户之前的输入或当前的输入 即使在他 她刷新页面后 该怎么做 我应该做什么 div class row div
  • 如何让 Eclipse 显示我的类中的 javadoc,而不在 jar 中包含源代码

    我正在构建 jar 我想在没有源的情况下打包它们 但我希望在 eclipse 中为开发人员提供 javadoc JAR 的用户可以在使用 JAR 的 Java 项目的 Java 构建路径属性中将 Javadoc 位置 存档内的 URL 文件
  • 使用 Facebook Graph API 上传照片时出现异常

    我想在应用程序的默认相册中将用户的照片上传到 Facebook 此处的发布对此进行了描述 http developers facebook com docs reference api photo 该方法已在这里得到解答 如何使用 Face
  • 在ReactJs中,如何使用扩展创建子组件

    在下面的代码片段中 我使用扩展来创建组件 这是行不通的 但是如果我使用 React createClass 效果很好 您能否让我知道下面的代码片段中有什么问题 import React from react class App extend
  • 从 ifconfig 中提取网络信息的算法(ubuntu)

    我正在尝试解析来自 ifconfig ubuntu 的信息 通常 我会将这样的数据块拆分为单词 然后搜索子字符串以获得我想要的内容 例如 给定line inet addr 192 168 98 157 Bcast 192 168 98 25
  • 使用反射设置私有静态最终字段

    基于使用 Java 反射更改私有静态最终字段 我尝试设置一个私有静态最终字段 我知道这非常糟糕 但这个问题与代码质量无关 它与 Java 反射有关 import java lang reflect Field import java lan
  • 检查 Android 中 Typeface 对象的族

    是否可以检查哪些家庭TypefaceAndroid API 8 中正在使用对象吗 我正在像这样在 Paint 对象上创建字体 Simplified code the user actually selects the family and
  • javax.cache 按引用存储与按值存储

    我是java缓存的新手 我尝试理解两者之间的区别按值存储 vs 通过引用存储 我在 java cache 文档中引用了下面的段落 在条目存储在缓存中以及从缓存返回时再次复制条目的目的是允许应用程序继续改变键和值的状态 而不会对缓存保存的条目
  • SASS @for循环输出CSS作为一个代码块? [复制]

    这个问题在这里已经有答案了 我有以下 for 循环 for i from 1 through columns tile i noMargin margin 0 其输出为 threeColForm tile1 noMargin margin
  • 在Java中逐字母合并两个字符串?

    Given two strings A and B create a bigger string made of the first char of A the first char of B the second char of A th
  • 我可以将数组绑定到 PDO 查询中的 IN() 条件吗?

    我很好奇是否可以使用 PDO 将值数组绑定到占位符 这里的用例是尝试传递一个值数组以与IN 健康 状况 我希望能够做这样的事情 并让 PDO 绑定并引用数组中的所有值 目前我正在做