Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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 mysql-如何检查和回滚mysql查询_Php_Mysql_Mysqli_Transactions - Fatal编程技术网

Php mysql-如何检查和回滚mysql查询

Php mysql-如何检查和回滚mysql查询,php,mysql,mysqli,transactions,Php,Mysql,Mysqli,Transactions,我有一个关于mySql查询的问题,我使用PHP进行查询- 在我的代码中,我将数据插入表-main\u查询。如果插入部分需要,我会执行第二次插入查询-子查询 如果第二个插入查询失败,如何取消第一个插入查询?我的意思是-在我实际执行它们之前,是否可以发送两个查询以进行检查?或者-是否可以对第一个“main_query”查询执行回滚 在这种情况下,您需要使用和: 或者我们可以使用面向对象的样式,如: # start mysql transaction $mysqli->begin_transac

我有一个关于mySql查询的问题,我使用PHP进行查询-

在我的代码中,我将数据插入表-main\u查询。如果插入部分需要,我会执行第二次插入查询-子查询

如果第二个插入查询失败,如何取消第一个插入查询?我的意思是-在我实际执行它们之前,是否可以发送两个查询以进行检查?或者-是否可以对第一个“main_query”查询执行回滚


在这种情况下,您需要使用和:

或者我们可以使用面向对象的样式,如:

# start mysql transaction
$mysqli->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);

$main_query = "INSERT INTO table_1 (...) VALUES (...)";
$res = $mysqli->query($main_query);

if ($res)
{
    $id = $mysqli->insert_id;

    $sub_query = "INSERT INTO table_2 (...) VALUES (...)"; // use var "id" here
    $res = $mysqli->query($sub_query);
    if ($res) {
        # both inserts succeed - do commit
        $mysqli->commit();
    }
    else {
        # second insert fail - do rollback
        $mysqli->rollback(); 
    }
} else  {
    # first insert fail - do rollback
    $mysqli->rollback(); 
}

看看这里的工作示例

Hi Slava-您是指
$mysqli->begin\u事务(mysqli\u TRANS\u START\u READ\u)?还有-什么是
$link
?是我的
$conn
?对不起,我的错$链接到相同的$conn中。您可以使用面向对象的样式
$mysqli->begin\u事务(mysqli\u TRANS\u START\u只读)或功能样式
mysqli\u开始\u事务($conn,mysqli\u TRANS\u START\u READ\u ONLY)
也可以,但在您的示例中,我是否能够取回$id值<代码>$id=mysqli\u insert\u id($conn)
并将其用于第二个查询?我得到以下错误:
无法在只读事务中执行语句
。您确定MYSQLI\u TRANS\u START\u READ\u仅
# start mysql transaction
mysqli_begin_transaction($conn, MYSQLI_TRANS_START_READ_WRITE);

$main_query = "INSERT INTO table_1 (...) VALUES (...)";
$res = mysqli_query($conn, $main_query);

if ($res)
{
    $id = mysqli_insert_id($conn);
    
    $sub_query = "INSERT INTO table_2 (...) VALUES (...)"; // use var "id" here
    $res = mysqli_query($conn, $sub_query);
    if ($res) {
        # both inserts succeed - do commit
        mysqli_commit($conn);
    }
    else {
        # second insert fail - do rollback
        mysqli_rollback($conn); 
    }
} else  {
    # first insert fail - do rollback
    mysqli_rollback($conn); 
}
# start mysql transaction
$mysqli->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);

$main_query = "INSERT INTO table_1 (...) VALUES (...)";
$res = $mysqli->query($main_query);

if ($res)
{
    $id = $mysqli->insert_id;

    $sub_query = "INSERT INTO table_2 (...) VALUES (...)"; // use var "id" here
    $res = $mysqli->query($sub_query);
    if ($res) {
        # both inserts succeed - do commit
        $mysqli->commit();
    }
    else {
        # second insert fail - do rollback
        $mysqli->rollback(); 
    }
} else  {
    # first insert fail - do rollback
    $mysqli->rollback(); 
}