如何将插入质量值与php中的预准备语句结合在一起

时间:2018-11-03 06:49:01

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

在最上面的答案下面的老问题中,描述了如何加快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;

1 个答案:

答案 0 :(得分:0)

您使用的是PDO还是mysqli?

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

https://stackoverflow.com/a/780046/1766831是有关细节的很好的讨论。 (但请务必使用mysqli_*,而不要使用mysql_*。)

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

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