Deténgase y revierta si una de las múltiples declaraciones preparadas falla

Tengo una base de datos de clase que tiene varios métodos, algunos ejecutando instrucciones preparadas para crear nuevas filas en mis tablas. Actualmente, todo funciona bien, pero si algo fallara, hay una manera de detener más consultas y revertir las consultas anteriores.

Aquí hay un pequeño ejemplo de cómo mi formulario se está procesando actualmente:

if(isset($_POST["someSubmitName"]) : //post variables .... // Start Queries $db->address_table_insert_statement($firstName, $lastName, $companyName, $streetAddress, $streetAddress2, $streetAddress3, $city, $state, $zip, $country, $phone, $fax, $email, $date, $date); $addressId = mysqli_insert_id($db->connection); $db->address_table_insert_statement($firstName, $lastName, $companyName, $billingStreetAddress, $billingStreetAddress2, $billingStreetAddress3, $billingCity, $billingState, $billingZipCode, $billingCountry, $billingPhone, $billingFax, $billingEmail, $date, $date); $billingAdressId = mysqli_insert_id($db->connection); $db->account_table_insert_statement($active, $addressId, $billingAddressId, $dateCreated, $dateModified); endif; 

Nuevamente, si alguno de esos 3 falla, deseo revertir todas las consultas y salir de este proceso de formulario. ¡Gracias!

  1. ponga mysqli en modo de excepción agregando esta línea antes de que mysqli se conecte

     mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 
  2. Envuelva sus consultas en una transacción
  3. Envuelva su transacción en una statement try..catch y agregue una llamada de retrotracción en su interior.

Así que el código sería algo así como

 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); $db = new mysqli(...); ... try { $db->autocommit(FALSE); $db->address_table_insert_statement($firstName, $lastName, $companyName, $streetAddress, $streetAddress2, $streetAddress3, $city, $state, $zip, $country, $phone, $fax, $email, $date, $date); $addressId = mysqli_insert_id($db->connection); $db->address_table_insert_statement($firstName, $lastName, $companyName, $billingStreetAddress, $billingStreetAddress2, $billingStreetAddress3, $billingCity, $billingState, $billingZipCode, $billingCountry, $billingPhone, $billingFax, $billingEmail, $date, $date); $billingAdressId = mysqli_insert_id($db->connection); $db->account_table_insert_statement($active, $addressId, $billingAddressId, $dateCreated, $dateModified); $db->commit(); } catch (\Exception $e) { $db->rollback(); throw $e; }