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

rqqzpn5f  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(363)

我想运行mysql查询来插入来自自定义html表单的数据。在这里我必须插入多组数据,一些数据到一个表中,一些数据到另一个表中。目前我正在使用jqueryajax将数据发送到php页面并运行多个 mysqli_query() 功能一个接一个。但是我猜当用户数量很大的时候,就会出现与速度有关的问题。所以有谁能给我一个更好的方法来做同样的事。
数据库中有5个表,每个表有7到10列,每次都需要获得不同的数据集。
我只想在上一个insert查询成功完成时运行每个查询。这就是为什么我每次都检查结果,然后运行下一个查询,这让我感觉到在大量用户基础上的速度问题。

hrirmatl

hrirmatl1#

问题是,我需要将数据插入到第一个表中,如果插入成功,则只对第二个表运行查询。
这意味着你需要一笔交易。
事务是一组查询,要么全部执行ok,要么其中一个失败—它们全部失败。这是为了确保表中不会出现垃圾数据。

不要

不要使用多重查询。
不要使用 mysql_* 功能。
不要使用批量插入。
告诉你这样做的人完全不知道他们在做什么,忽略他们。

使用pdo
使用准备好的语句
准备一次语句,多次使用

示例代码-不复制粘贴

$dsn = 'mysql:dbname=testdb;host=127.0.0.1;charset=utf8mb4';
$user = 'dbuser';
$password = 'dbpass';

$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$insert['first'] = $pdo->prepare("INSERT INTO table SET col1 = :val, col2 = :val2");
$insert['second'] = $pdo->prepare("INSERT INTO another_table SET col1 = :val, col2 = :val2"); 

$pdo->beginTransaction();

$insert['first']->bindValue(':val', 'your value');
$insert['first']->bindValue(':val2', 'anothervalue');
$insert['first']->execute();

$insert['second']->bindValue(':val', 'your value');
$insert['second']->bindValue(':val2', 'anothervalue');
$insert['second']->execute();

$pdo->commit();

只有在两个插入都成功的情况下,上面的代码才会将数据保存在两个表中。

wnrlj8wa

wnrlj8wa2#

您可以使用php函数multi\u query来运行多个查询,并使用mysqli\u more\u result、mysqli\u next\u result获得查询结果。

uelo1irk

uelo1irk3#

重新解释接受的答案,但重点放在mysqli上。
关键是配置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();

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

相关问题