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

问题描述 投票:0回答:2

我想运行 mysql 查询以从自定义 html 表单插入数据。 在这里我必须插入多组数据,一些数据到一个表,一些到其他表。目前,我正在使用简单的方法使用 jquery ajax 将数据发送到 php 页面,并依次运行多个

mysqli_query()
函数。但是我想当用户量大的时候,就会出现速度相关的问题。所以任何人都可以建议我一个更好的方法来做同样的事情。

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

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

php mysql mysqli
2个回答
4
投票

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

这意味着你需要一个transaction.

事务是一组查询,要么全部执行正常,要么一个失败——它们都失败。这是为了确保您不会在表中得到垃圾数据。

不要

  • 不要使用多查询。
  • 不要使用
    mysql_*
    功能。
  • 请勿使用散装插入物。

告诉您这样做的人完全不知道他们在做什么,请忽略他们。

示例代码 - 不要复制粘贴

$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();

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


2
投票

解释已接受的答案,但在 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();

由于异常和交易,无需手动验证每个查询的结果。

© www.soinside.com 2019 - 2024. All rights reserved.