Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP一次性在SQL中运行多个insert查询?_Php_Mysql_Mysqli - Fatal编程技术网

如何使用PHP一次性在SQL中运行多个insert查询?

如何使用PHP一次性在SQL中运行多个insert查询?,php,mysql,mysqli,Php,Mysql,Mysqli,我想运行mysql查询来插入来自自定义html表单的数据。 在这里,我必须插入多组数据,一些数据到一个表中,另一些数据到另一个表中。目前,我使用简单的方法,使用jquery ajax将数据发送到php页面,并一个接一个地运行多个mysqli\u query()函数。但是我想当有大量的用户时,就会出现与速度有关的问题。那么,谁能给我一个更好的方法来做同样的事情呢 数据库中有5个表,每个表都有7到10列,每次都需要获取不同的数据集 我只想在上一个insert查询成功完成时运行每个查询。 这就是为什么

我想运行mysql查询来插入来自自定义html表单的数据。 在这里,我必须插入多组数据,一些数据到一个表中,另一些数据到另一个表中。目前,我使用简单的方法,使用jquery ajax将数据发送到php页面,并一个接一个地运行多个
mysqli\u query()
函数。但是我想当有大量的用户时,就会出现与速度有关的问题。那么,谁能给我一个更好的方法来做同样的事情呢

数据库中有5个表,每个表都有7到10列,每次都需要获取不同的数据集

我只想在上一个insert查询成功完成时运行每个查询。 这就是为什么我每次都要检查结果,然后运行下一个查询,这让我感觉到了大用户群的速度问题

问题是,我需要将数据插入到第一个表中,如果数据插入成功,则只对第二个表运行查询

这意味着您需要一个新的解决方案

一个事务是一组查询,要么全部执行ok,要么其中一个失败——它们全部失败。这是为了确保表中不会出现垃圾数据

不要
  • 不要使用多重查询
  • 不要使用
    mysql.*
    函数
  • 不要使用批量插入
告诉你这样做的人完全不知道他们在做什么,忽略他们

  • 使用
  • 使用
  • 准备一次语句,多次使用
示例代码-不复制粘贴
只有在两次插入都成功的情况下,上述代码才会将数据保存在两个表中。

解释接受的答案,但强调mysqli

关键是将mysqli配置为抛出异常和使用事务

交易将确保所有操作全部完成或无任何影响。使用事务的另一个重要优点是,它使多个插入更快,消除了单独执行查询可能导致的所有延迟

要使用mysqli事务,您需要执行以下操作:

首先,确保您有一个异常,它告诉mysqli在发生错误时抛出一个异常。然后,只需准备查询、启动事务、执行查询并提交事务,就像接受的答案中所示,但使用mysqli:

include 'mysqli.php';

$stmt1 = $mysqli->prepare("INSERT INTO table SET col1 = ?, col2 = ?");
$stmt2 = $mysqli->prepare("INSERT INTO another_table SET col1 = ?, col2 = ?"); 

$mysqli->begin_transaction();

$stmt1->bind_param("ss", $col1, $col2);
$stmt1->execute();

$stmt2->bind_param("ss", $col1, $col2);
$stmt2->execute();

$mysqli->commit();

由于存在异常和事务,因此无需手动验证每个查询的结果

您可以将需要的所有数据传递到服务器,并在单个查询中将数据合并到myTable(id,any,…)值(id,any,…)(id2,any2,…)(id3,any3,…)。@Nitro.de,我想将数据添加到多个表中。我不想在同一个表中添加多行。请给我建议一些好的方法。@VikashMishra抱歉,最好读一下。。很好地使用事务,然后执行
mysqli\u begin\u transaction
,然后执行
mysqli\u commit
,或者查看此处当前瓶颈在哪里的可能重复?这只是一个假设性的问题吗?如果出现错误,事务将有助于恢复,但我不认为它有助于提高插入每个表的速度。@user3783243我在哪里提到过mysqli?@user3783243因为我没有提到它,这一定意味着该示例适用于mysqli和OP,作为一名程序员,能够调整标记为“请勿复制粘贴”的示例。我更喜欢PDO而不是mysqli,我用它来传递技术。它可以换成mysqli而不会出现任何问题,但我更熟悉PDO,因此示例中使用了PDO。@user3783243-所以我们都同意一切都很好,既然我们都喜欢PDO,那么这样做没有什么坏处。我们在评论中添加了同样的内容,可以用mysqli来实现。我喜欢做大海捞针的“那个家伙”,但我们最终会浪费比描述交易的答案更多的词汇。如果你开了一家汽车店,一位用户说他们不喜欢93辛烷值增加的成本,你可以这样想。你建议他们用柴油替换整个发动机吗?“使用PDO”这句话同样具有误导性,不是吹毛求疵。答案是使用事务。PDO和mysqli支持它。您不需要一个
mysqli
示例。关于这个话题的最后评论。我会喜欢有时不跟你说话。而且,你的类比完全是错误的。
include 'mysqli.php';

$stmt1 = $mysqli->prepare("INSERT INTO table SET col1 = ?, col2 = ?");
$stmt2 = $mysqli->prepare("INSERT INTO another_table SET col1 = ?, col2 = ?"); 

$mysqli->begin_transaction();

$stmt1->bind_param("ss", $col1, $col2);
$stmt1->execute();

$stmt2->bind_param("ss", $col1, $col2);
$stmt2->execute();

$mysqli->commit();