使用 PDO 准备好的语句插入多行

2024-04-01

我想知道是否可以使用一个准备好的语句插入多行。 下面是我通常如何将一行插入数据库的示例:

$params=array();
$params[':val1']="val1";
$params[':val2']="val2";
$params[':val3']="val3";
$sql="INSERT INTO table VALUES (col1,col2,col3) VALUES (:val1,:val2,:val3)";
$stmt=DB::getInstance()->prepare($sql);
$stmt->execute($params);

我想要插入的值将来自一个数组,例如: $values[0]['val1']; $values[0]['val2']; $values[0]['val3']; $values[1]['val1']; $values[2]['val2'];

etc.

这段代码可能必须一次插入几百行,我考虑过创建一个循环来创建数百个参数,然后在 sql 语句中附加每行的额外插入,但我认为必须有更好的方法。最好的方法是什么?


首先要说的是,你can插入多行仅归功于one INSERT query

INSERT INTO Table (col1, col2, col3) 
VALUES ('abc', 'def', 'ghi'),
       ('abc', 'def', 'ghi'),
       ('abc', 'def', 'ghi'),
       ('abc', 'def', 'ghi'),
       ('abc', 'def', 'ghi')
       -- and so on...

一旦了解了这一点,您就可以使用 PDO 获得良好的解决方案(例如)。
你必须记住你想要一个完整的prepare and execute过程(出于安全性的考虑,您必须单独传递每个参数)。

假设您要插入的行结构如下:

$rows = array(
              array('abc', 'def', 'ghi'), // row 1 to insert
              array('abc', 'def', 'ghi'), // row 2 to insert
              array('abc', 'def', 'ghi')  // row 3 to insert
              // and so on ...
);

您的目标是将此结果作为准备好的查询:

INSERT INTO Table (col1, col2, col3) 
VALUES (?, ?, ?),
       (?, ?, ?),
       (?, ?, ?)

与其对应的execute:

PDOStatement::execute(array('abc', 'def', 'ghi', 'abc', 'def', 'ghi', 'abc', 'def', 'ghi'));


好吧,你only现在必须这样做:

$rows = array(
              array('abc', 'def', 'ghi'),
              array('abc', 'def', 'ghi'),
              array('abc', 'def', 'ghi')
);

$row_length = count($rows[0]);
$nb_rows = count($rows);
$length = $nb_rows * $row_length;

/* Fill in chunks with '?' and separate them by group of $row_length */
$args = implode(',', array_map(
                                function($el) { return '('.implode(',', $el).')'; },
                                array_chunk(array_fill(0, $length, '?'), $row_length)
                            ));

$params = array();
foreach($rows as $row)
{
   foreach($row as $value)
   {
      $params[] = $value;
   }
}

$query = "INSERT INTO Table (col1, col2, col3) VALUES ".$args;
$stmt = DB::getInstance()->prepare($query);
$stmt->execute($params);

还有……就是这样!

这样,每个参数都会被单独处理,这就是您想要的(安全性,安全性,安全性!),并且所有这些参数都以一种动态的方式,只有一个INSERT query


如果要插入的行太多(请参阅this http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_max_allowed_packet), 你应该execute逐个

$rows = array(
              array('abc', 'def', 'ghi'), // row 1 to insert
              array('abc', 'def', 'ghi'), // row 2 to insert
              array('abc', 'def', 'ghi')  // row 3 to insert
              // and so on ...
);

$args = array_fill(0, count($rows[0]), '?');

$query = "INSERT INTO Table (col1, col2, col3) VALUES (".implode(',', $args).")";
$stmt = $pdo->prepare($query);

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

使用 PDO 准备好的语句插入多行 的相关文章

  • 知道何时调用 persist

    我正在使用 Doctrine 2 作为我的 ORM 一切进展顺利 但我一直想知道EntityManager persist 方法 这 持久实体 https www doctrine project org projects doctrine
  • php递归合并

    我需要以某种不同的方式合并一些数组 我使用 array merge recursive 然而 有一些事情我需要改变 但我不知道如何改变 这是来自 php net 的引用 但是 如果数组具有相同的数字键 则后面的值 不会覆盖原始值 但会追加
  • 删除、截断或删除以清理 MySQL 中的表

    我正在尝试清理表格 但没有摆脱表格的实际结构 我有一个id自动递增的列 我不需要保留ID号 但我确实需要它来保持其自动递增的特性 我发现了删除和截断 但我担心其中之一会完全删除整个表 从而使未来的插入命令变得无用 如何从表中删除所有记录以便
  • 'numpy.float64'对象没有属性'translate'在Python中将值插入Mysql

    import dataset db dataset connect table db 当我尝试向 Mysql 表中插入一些值时 发生了此错误 我插入表中的示例值 print Buy ticker price date OType OSize
  • PHP 中的抽象类是什么?

    PHP 中的抽象类是什么 如何使用 抽象类是至少包含一个抽象方法的类 该方法中没有任何实际代码 只有名称和参数 并且已被标记为 抽象 这样做的目的是提供一种模板来继承并强制继承类实现抽象方法 因此 抽象类是介于常规类和纯接口之间的东西 此外
  • 无法显示由 Fine-uploader 上传到 Amazon s3 的图像

    我现在尝试设置fineuploader s3以显示在aws服务器上成功上传的文件的图像 如示例页面上所做的那样 http fineuploader com s3 demo http fineuploader com s3 demo 我 仍然
  • 根据类别 woocommerce 更改同一产品的默认变体值

    我正在研究一种根据其所属类别显示同一产品的默认变体值的方法 例如 我出售一张带有蓝色和红色选项的卡 当用户进入 一 类别时 我希望默认值为蓝色 如果他属于第二类 则该值将为红色 我发现了一个钩子woocommerce product def
  • 使用来自另一个的 SELECT 更新表,但字段为 SUM(someField)

    基本上我有这样的事情 UPDATE Table SET Table col1 other table col1 FROM Table INNER JOIN other table ON Table id other table id 问题是
  • 如何在 WordPress/WooCommerce 3+ 中向评论表单添加自定义字段

    我正在尝试在产品评论中添加 电话 字段 WooCommerce 3 针对未注册用户 来宾 电话号码只能由管理员在管理面板中看到 电话字段需要填写 Required 我尝试了这段代码 但这不起作用 function true phone nu
  • 无法在 PHPUnit 中使用数据提供程序运行单个测试

    使用命令行运行测试时遇到问题 如果我像这样运行 phpunit phpunit no configuration filter testAdd DataTest DataProviderTest php 效果很好 但是我们使用正则表达式来准
  • PHP:展平数组-最快的方法? [复制]

    这个问题在这里已经有答案了 是否有任何快速方法可以在不运行 foreach 循环的情况下展平数组并选择子键 在本例中为 键 和 值 或者 foreach 始终是最快的方法 Array 0 gt Array key gt string val
  • 在 PHP 中使用数组来比较用户名/密码

    我有以下 php 脚本 其中有一个用户名和密码 Username user1 Password pass1 if isset POST submitform Clean up the input values foreach POST as
  • PHP多图像文件上传并存储到文件夹和数据库

    我正在建立一个网站 向夜间狂欢者展示大城市夜总会场所和活动的列表 我正在尝试构建一个后端页面 管理员可以在其中添加俱乐部并输入信息 例如机构名称 位置 相对价格等 当然还有俱乐部的一些图像 每个俱乐部必须至少有一张图像 即主图像 可以有额外
  • 如何检查一个值是否已经存在以避免重复?

    我有一个 URL 表 但我不想要任何重复的 URL 如何使用 PHP MySQL 检查给定 URL 是否已在表中 如果您不想重复 可以执行以下操作 添加唯一性约束 use REPLACE http dev mysql com doc ref
  • 连接 3 三张表

    我有这个图表应该可以解释我的情况 我需要一些关于连接 3 个表的帮助 我不知道如何做这种事情 因此 我可以通过执行以下操作来经历一段检索记录的 while 循环 img src alt Album AlbumID 使用内部联接 http w
  • 您可以使用 MySQL 查询来完整创建数据库的副本吗

    我有一个包含 5 个表的 MySQL 数据库的实时版本和一个测试版本 我不断使用 phpMyAdmin 将实时版本中的每个表复制到测试版本 有谁有mysql查询语句来制作数据库的完整副本吗 查询字符串需要考虑结构 数据 自动增量值以及与需要
  • 使用 html5 分块上传文件

    我正在尝试使用 html5 的文件 API 分块上传文件 然后在服务器端用 php 重新组装它 我正在上传视频 但是当我在服务器端合并文件时 大小增加了 并且它变成了无效文件 请注意 以下 html5 代码仅适用于 chrome 浏览器 在
  • PHP 相当于朋友或内部

    php 中是否有相当于 朋友 或 内部 的东西 如果没有 是否有任何模式可以遵循来实现这种行为 Edit 抱歉 但标准 Php 不是我想要的 我正在寻找类似于马戏团长所做的事情 我有一些类在后端进行 C 风格的系统调用 并且杂耍已经开始变得
  • 使用“AND”表达式构建动态 SQL,而不混淆嵌套条件?

    总的来说 我对 php 和编码相当陌生 我有一系列条件需要测试它们是否已设置 它们是 option1 option2 option3 if isset option1 if isset option2 if isset option3 qu
  • mod_rewrite, .htaccess 连接mysql数据库

    我希望 htaccess 文件中的 mod rewrite 链接到 mysql 数据库以向我提供映射信息 具体来说 我使用单个代码库来托管多个站点 因此 如果用户请求图像 例如 http www example com images car

随机推荐

  • apache POI 中的自动换行(Excel)

    我有一个java程序 它将标头和数据作为输入并生成一个excel文件 然而 有时当标题值很长且列数较多时 我的 Excel 工作表往往会变得不必要的宽 由于标题的原因 我必须向右向下滚动才能看到尾部列的内容 有没有一种方法可以解决这个问题
  • 将 div 链接到 HTML 中不同页面上的特定部分

    嘿 我有一个新的困境 我有 3 个 div 就像 3 个盒子一样 每个 div 中都有一个图像和一些写入的文本 我希望当我单击任何框中的任意位置时 它会转到另一页 例如如果我在主页上 然后单击框 它将转到网站中的 service html
  • 使用带有秘密的 github 操作来构建/部署 React 应用程序

    我正在尝试使用带有秘密的 github 操作来完成构建 部署我的使用 Firebase 目前仅身份验证模块 的 React 应用程序 对于本地开发 我将 env 文件与 webpack 和 dotenv webpack 库一起使用 在本地机
  • 如何使用 python 将 .mp3 文件转换为频率和振幅数组?

    我想设计一个神经网络 训练后将 mp3 文件作为输入 然后根据训练 以 1 10 的等级来决定音乐的好坏 但为此 我需要将音频文件转换为波长 频率 振幅和定义音乐所需的所有其他参数的数组 然后使用这些数组作为神经网络的输入 我应该如何解决这
  • 基于多列删除数据框之间的交集

    我有这两个数据框 df test dimension1 id dimension2 id dimension3 id dimension4 id dimension5 id 0 1 1 1 1 1 1 1177314888 23819878
  • 如何提供一种易于使用的高对比度替代柔和的配色方案?

    如何确保网站的颜色主题提供符合以下要求的高对比度替代方案WCAG 2 最低对比度要求 https webaim org articles contrast sc143除非用户想要或需要更高的对比度 否则更喜欢柔和的低对比度主题 我尝试定义一
  • 如何从 Flask 应用程序中的 MySQL 查询返回数据?

    我有以下代码 import flask as fk import MySQLdb import JSONEncoder class SpecializedJSONEncoder JSONEncoder def default o if is
  • Docker 与 Symfony 4 - 无法看到文件更改

    我正在为 Symfony 4 应用程序的开发环境开发 docker 映像 我正在构建它alpine php fpm and nginx 我已经配置了一个应用程序 但即使对于简单的 hello world 应用程序 性能也不是很好 700ms
  • Indy TCP - 循环读取数据

    TCP 服务器每 8 毫秒连续发送一次数据帧 我想编写一个能够接收这些数据帧的客户端 Indy 9 中是否有任何程序可以知道缓冲区中是否有可用数据 我当前的程序如下 我正在使用线程 procedure TThreadRead Execute
  • Numpy 用全零填充 4D 单位

    我有一个 4D numpy 数组 但每个元素都是可变大小的 3D 体积 本质上它是一个 3D 体积的 numpy 列表 所以 numpy 数组的形状是 Pdb batch x shape 3 并取元素i在那个列表中 它看起来像这样 Pdb
  • 错误 main.lua:23:尝试索引 upvalue 'Menu' (布尔值)

    我正在尝试用 lua 和 love2d 制作一个主菜单 这是我第一次这样做 遗憾的是没有关于此事的教程 所以我自己尝试了一下 我一直遇到这个错误 我不知道如何解决它 请帮助 完整错误消息 错误main lua 23 尝试索引upvalue
  • 如何使用递归查询向后遍历分层树结构

    我使用 PostgreSQL 9 1 来查询分层树结构数据 其中包含与节点连接的边 或元素 这些数据实际上是针对流网络的 但我已将问题抽象为简单的数据类型 考虑这个例子tree桌子 每条边都有长度和面积属性 用于确定网络中的一些有用的度量
  • 哪个 Java 库可用于通过 WebDAV 访问数据?

    这就是问题 哪个库可以帮助我在 Java 程序中访问通过 WebDAV 提供的数据 首选开源 我创建了一个非常易于使用的 java webdav 客户端 http sardine googlecode com http sardine go
  • “将脚本放在底部”正确吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 提高网站性能的最佳实践http developer yahoo com performance rules html http developer y
  • 如何在创建后更改 InsetDrawable 插入值

    我有一个InsetDrawable已定义 我只是希望能够在运行时调整插图的值 而无需重新分配另一个可绘制对象 这可能吗 或者唯一的方法是重新创建 InsetDrawable 这是不可能的 因为其 API 不是公开的 我遇到了和你一样的问题
  • JS Fetch API 不适用于具有授权属性的 ASP.NET Core 2 控制器

    我在客户端有以下代码 fetch music index headers Content Type application json then response gt if response ok throw response return
  • HTMLPurifier 破坏图像

    我试图根据 WYSIWYG CK 编辑器 的用户输入运行 HTMLPurifier 但图像损坏 未过滤的输入 img alt laugh src lib ckeditor plugins smiley images teeth smile
  • Sqlalchemy:当字符串位于左侧且列位于右侧时,使用 PSQL 的“~”运算符

    我知道 WHERE column regexp 这是 sqlalchemy 吗 where column op regexp 但我怎样才能创造这个呢 WHERE string column 正则表达式存储在数据库中 您需要创建一个liter
  • PhpSerial:没有可用的 stty——似乎无法让它工作

    我正在开发一个项目 涉及使用 Raspberry Pi 上的 UART 引脚读取和写入串行板 然而 我已经碰壁了 任何时候我尝试使用PhpSerial我总是收到错误 致命错误 没有可用的 stty 无法运行 在 var www PHP Se
  • 使用 PDO 准备好的语句插入多行

    我想知道是否可以使用一个准备好的语句插入多行 下面是我通常如何将一行插入数据库的示例 params array params val1 val1 params val2 val2 params val3 val3 sql INSERT IN