使用 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 准备好的语句插入多行 的相关文章

随机推荐

  • 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