Tengo una pregunta sobre las consultas mySql que uso PHP para hacer -

En mi código, inserto datos en la tabla - main_query. si la parte de inserción quiere bien, hago una segunda consulta de inserción: sub_query.

¿Cómo cancelo la primera consulta de inserción si la segunda falló? Quiero decir, ¿es posible enviar ambas consultas para que se verifiquen antes de ejecutarlas? o - ¿es posible hacer una reversión para la primera consulta "main_query"?

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

if ($res)
{
    $id = mysqli_insert_id($conn);
    
    $sub_query = "INSERT INTO table_2 (...) VALUES (...)"; // use var "id" here
    $res = $conn->query($sub_query);
}
1
roi 29 ago. 2020 a las 19:43

1 respuesta

La mejor respuesta

En este caso, debe utilizar transacciones y reversión:

# 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); 
}

O podemos usar un estilo orientado a objetos como:

# 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(); 
}

Vea el ejemplo de trabajo aquí PHPize.onofollow

1
Slava Rozhnev 29 ago. 2020 a las 17:48