Php 当其他SQL查询失败时,是否可以执行某些SQL查询?
我从一些帖子中读到,一个接一个地执行查询比在PHP文件中执行多查询功能更好。我想知道如果我有两个Php 当其他SQL查询失败时,是否可以执行某些SQL查询?,php,mysql,mysqli,Php,Mysql,Mysqli,我从一些帖子中读到,一个接一个地执行查询比在PHP文件中执行多查询功能更好。我想知道如果我有两个mysqli\u query函数,是否可能第一个查询成功,并且在下一个查询失败时相应地更改了MySQL数据库 如果是这种情况,我只需要在第一个查询成功时执行第二个查询,例如(创建表,然后向该表插入数据)。在第一次查询成功的条件下放置if语句是否是确保这一点的最佳方法?是的,这是可能的。如果您的数据库引擎支持(例如InnoDB),则可以使用事务。它们使您能够隐藏更改,直到您手动调用commit。这与多重
mysqli\u query
函数,是否可能第一个查询成功,并且在下一个查询失败时相应地更改了MySQL数据库
如果是这种情况,我只需要在第一个查询成功时执行第二个查询,例如(创建表,然后向该表插入数据)。在第一次查询成功的条件下放置if语句是否是确保这一点的最佳方法?是的,这是可能的。如果您的数据库引擎支持(例如InnoDB),则可以使用事务。它们使您能够隐藏更改,直到您手动调用commit。这与多重查询无关 您可以在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语句,并且在执行时总是导致隐式提交。是的,这是可能的。如果您的数据库引擎支持(例如InnoDB),则可以使用事务。它们使您能够隐藏更改,直到您手动调用commit。这与多重查询无关 您可以在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语句,并且在执行时总是导致隐式提交。有很多方法可以实现这一点。我可能会在这个特定的例子中使用一个事务。有很多方法可以实现这一点。我可能会在这个特定的例子中使用一个事务,需要注意的是,事务不能与myisam引擎一起工作——只有像innodb这样具有事务支持的引擎才能与这样的代码一起工作。因此,事务中涉及的所有表都必须是InnoDB引擎表。您好,Dharman,sql查询是否在执行查询函数后立即完成执行?例如,在您的代码中,查询是否在这一行代码之后完成$stmt->execute()@AndyLin当您调用
execute()
时,查询会在MySQL服务器上执行,但是如果您使用了事务,那么在调用commit()
@Dharman之前,更改的事务不会被持久化。是的,我的意思是没有事务,因此在MySQL上,调用execute()函数后,将应用查询。谢谢。需要注意的是,事务不能与myisam引擎一起工作——只有像innodb这样具有事务支持的引擎才能与这样的代码一起工作。因此,事务中涉及的所有表都必须是InnoDB引擎表。您好,Dharman,sql查询是否在执行查询函数后立即完成执行?例如,在您的代码中,查询是否在这一行代码之后完成$stmt->execute()@AndyLin当您调用execute()
时,查询会在MySQL服务器上执行,但是如果您使用了事务,那么在调用commit()
@Dharman之前,更改的事务不会被持久化。是的,我的意思是没有事务,因此在MySQL上,调用execute()函数后,将应用查询。非常感谢。