Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.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查询失败时,是否可以执行某些SQL查询?_Php_Mysql_Mysqli - Fatal编程技术网

Php 当其他SQL查询失败时,是否可以执行某些SQL查询?

Php 当其他SQL查询失败时,是否可以执行某些SQL查询?,php,mysql,mysqli,Php,Mysql,Mysqli,我从一些帖子中读到,一个接一个地执行查询比在PHP文件中执行多查询功能更好。我想知道如果我有两个mysqli\u query函数,是否可能第一个查询成功,并且在下一个查询失败时相应地更改了MySQL数据库 如果是这种情况,我只需要在第一个查询成功时执行第二个查询,例如(创建表,然后向该表插入数据)。在第一次查询成功的条件下放置if语句是否是确保这一点的最佳方法?是的,这是可能的。如果您的数据库引擎支持(例如InnoDB),则可以使用事务。它们使您能够隐藏更改,直到您手动调用commit。这与多重

我从一些帖子中读到,一个接一个地执行查询比在PHP文件中执行多查询功能更好。我想知道如果我有两个
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()函数后,将应用查询。非常感谢。