是否可以执行某些 SQL 查询而其他查询失败?
Can some SQL queries be executed while the others fail?
我从一些帖子中了解到,一个接一个地执行查询比在 PHP 文件中执行多查询功能更好。我想知道我有两个 mysqli_query
函数,是否有可能第一个查询成功并且 MySQL 数据库在下一个查询失败时已相应更改?
如果是这种情况,我只需要在第一个查询成功时才执行第二个查询,例如(创建 table,然后将数据插入 table)。在第一个查询成功的条件下放置一个 if 语句是确保这一点的最佳方法吗?
是的,这是可能的。如果您的数据库引擎支持 transactions(例如 InnoDB),那么您可以使用事务。它们使您能够隐藏更改,直到您手动调用提交。这与 multi-query.
无关
您可以在 PDO 和 mysqli 中使用事务。尽管一如既往,您应该尽可能选择 PDO。
这里是一个使用 mysqli 的简单事务的例子。整个事情都包含在 try-catch 中,因此如果其中一个查询失败,则其他查询将回滚。
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$mysqli->set_charset('utf8mb4'); // always set the charset
// start transaction
$mysqli->begin_transaction();
try {
$stmt = $mysqli->prepare('INSERT INTO user(name) VALUE(?)');
$stmt->bind_param('s', $username);
$stmt->execute();
$id = $mysqli->insert_id;
$stmt = $mysqli->prepare('INSERT INTO hobby(uid, name) VALUE(?, ?)');
$stmt->bind_param('ss', $id, $hobby);
$stmt->execute();
// save changes
$mysqli->commit();
} catch (Throwable $e) {
$mysqli->rollback();
throw $e;
}
在上面的例子中,要么两个查询都成功,要么都不成功。
Create table 不能与事务一起使用,但是,因为它是一个 DDL 语句,并且它们在执行时总是会导致隐式提交。
我从一些帖子中了解到,一个接一个地执行查询比在 PHP 文件中执行多查询功能更好。我想知道我有两个 mysqli_query
函数,是否有可能第一个查询成功并且 MySQL 数据库在下一个查询失败时已相应更改?
如果是这种情况,我只需要在第一个查询成功时才执行第二个查询,例如(创建 table,然后将数据插入 table)。在第一个查询成功的条件下放置一个 if 语句是确保这一点的最佳方法吗?
是的,这是可能的。如果您的数据库引擎支持 transactions(例如 InnoDB),那么您可以使用事务。它们使您能够隐藏更改,直到您手动调用提交。这与 multi-query.
无关您可以在 PDO 和 mysqli 中使用事务。尽管一如既往,您应该尽可能选择 PDO。
这里是一个使用 mysqli 的简单事务的例子。整个事情都包含在 try-catch 中,因此如果其中一个查询失败,则其他查询将回滚。
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$mysqli->set_charset('utf8mb4'); // always set the charset
// start transaction
$mysqli->begin_transaction();
try {
$stmt = $mysqli->prepare('INSERT INTO user(name) VALUE(?)');
$stmt->bind_param('s', $username);
$stmt->execute();
$id = $mysqli->insert_id;
$stmt = $mysqli->prepare('INSERT INTO hobby(uid, name) VALUE(?, ?)');
$stmt->bind_param('ss', $id, $hobby);
$stmt->execute();
// save changes
$mysqli->commit();
} catch (Throwable $e) {
$mysqli->rollback();
throw $e;
}
在上面的例子中,要么两个查询都成功,要么都不成功。
Create table 不能与事务一起使用,但是,因为它是一个 DDL 语句,并且它们在执行时总是会导致隐式提交。