【问题标题】:How do you combine inserting mass values with prepared statements in php如何在 php 中将插入质量值与准备好的语句结合起来
【发布时间】:2019-04-07 07:41:39
【问题描述】:

在下面提出的旧问题中,最佳答案描述了如何加快 MySQL 插入过程。由于这是一个老问题,我很好奇如何使用准备好的语句来做到这一点。我将 MySQL 与 innoDB 一起使用。对于不想检查链接的人,我将在此处粘贴答案中的示例。

这里我将介绍 3 种插入数据的方法,从慢速到 快:

如果要插入很多行,以下内容会非常慢:

INSERT INTO mytable (id,name) VALUES (1,'Wouter');
INSERT INTO mytable (id,name) VALUES (2,'Wouter');
INSERT INTO mytable (id,name) VALUES (3,'Wouter');

这已经快很多了:

INSERT INTO mytable (id, name) VALUES
  (1, 'Wouter'),
  (2, 'Wouter'),
  (3, 'Wouter');

这通常是最快的:

拥有如下所示的 CSV 文件:

1,Wouter
2,Wouter
3,Wouter

然后运行类似的东西

LOAD DATA FROM INFILE 'c:/temp.csv' INTO TABLE mytable

old question

这显然是一个旧答案。我想知道如何以一种尽可能快地插入的方式使用准备好的语句来做到这一点,但让我们一次一步。首先,我想知道如何使用准备好的语句来做到这一点。任何可以给出的例子将不胜感激。我将使用您可能需要的任何额外信息回复或编辑此问题。

我正在使用 mysqli_ *为 Rick James 的问题编辑。

我将尽我所能,对如何做到这一点做出有根据的猜测。如果我错了,请纠正我。

我想我可以转换

INSERT INTO mytable (id, name) VALUES
  (1, 'Wouter'),
  (2, 'Wouter'),
  (3, 'Wouter');

进入

$bindParamsToBuild = '($myArray[key], ?,?),'
for (i = 0; i < count($myArray); i++)
{
 if (i === count($myArray))
 {
  $bindParamsToBuild += '($myArray[key], ?,?);';
 }
 else
 {
  $bindParamsToBuild += '($myArray[key], ?,?),';
 }
}
"INSERT INTO mytable (id, name) VALUES".$bindParamsToBuild;

【问题讨论】:

标签: php mysql prepared-statement server-side web-development-server


【解决方案1】:

你使用的是 PDO 还是 mysqli?

如果使用 mysqli,请在列表中的每个项目上分别使用 real_escape_string()。这有点乏味,但可以通过逐步构建插入字符串来简化。我建议不要将超过 100 个项目放入单个 INSERT

https://stackoverflow.com/a/780046/1766831 是一个很好的细节讨论。 (但一定要使用mysqli_*,而不是mysql_*。)

计划 A:按照其中一些链接中的讨论构建查询。使用real_escape_string 和PHP 字符串操作而不是“准备”。

B 计划:构建一个带有很多问号的字符串。同时,使用要放入这些问号的值构建一个数组。然后执行一次“准备”以完成多行 INSERT 语句。

【讨论】:

  • 我正在使用 mysqli_ 但是你没有解释如何将它放入我上面问的准备好的语句中。
猜你喜欢
  • 2010-10-14
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多