2010-07-28 25 views
5

mi problema es que tengo un diseño de base de datos desde este enlace is my database overdesigned?¿Dónde revertir una transacción en PDO?

editar * ok maybe useing transaction? pero ¿dónde debería poner la restauración si falla?

$dbConnect->beginTransaction(); 
$RegisterInsert = $dbConnect->prepare("INSERT INTO companies (
    `name`, `address`, `email`, `phone`, `link`, `verified`) VALUES (
    :name, :address, :email, :phone, :link, :verified)"); 
    $RegisterInsert->execute($RegisterData); 

    $RegisterData2['CID'] = $dbConnect->lastInsertId(); 

    $RegisterInsert = $dbConnect->prepare("INSERT INTO users_companies (
    `UID`, `CID`, `role`) VALUES (
    :UID, :CID, :role)"); 
    $RegisterInsert->execute($RegisterData2); 
    $dbConnect->commit(); 

¿dónde debo colocar la reversión?

Gracias

+1

yo diría que sí ... – pascal

+0

yup im un poco confundido debo hacer transacciones cosa? (Nunca lo usé) o simplemente hacer así, ¿o tal vez algunos unirse? u otros que me he perdido, gracias Pascal para dejar un comentario :) –

+0

posible duplicado de: http://stackoverflow.com/questions/2167853/insert-entries-in-multiple-tables-in-php, http : //stackoverflow.com/questions/2449132/run-mysql-insert-query-multiple-times-insert-values-into-multiple-tables, http://stackoverflow.com/questions/3225024/mysql-insert- to-multiple-tables-relational, http://stackoverflow.com/questions/1582834/php-mysql-inserting-data-to-multiple-tables –

Respuesta

4

Una transacción debe terminar ya sea con un rollback() o una commit(), (sólo uno de ellos)

Su por lo general se utiliza con un comunicado if...else como lógicamente sólo uno de ellos debe ser ejecutado.

$dbConnect->beginTransaction(); 

//somecode 
//$dbConnect->execute($someInsert); 
//some more code 
//$result = $dbConnect->execute($someSelect); 
//$nextRow = $result->fetchRow(); 

//either commit or rollback! 
if($someResultCheck == true) 
    $dbConnect->commit(); 
else 
    $dbConnect->rollback(); 

Las transacciones se utilizan generalmente cuando hay una lógica compleja involucrada con las consultas.

En caso de que esté utilizando MySQL, asegúrese de no utilizar el motor MyISAM para las tablas, ya que no admite transacciones.

+0

¿mi código arriba de la reversión automática si falla? –

+0

No se garantiza que su código se retrotraiga automáticamente a menos que autoCommit esté configurado como falso –

+0

¿Está bien, entonces deberíamos hacer un $ someResultCheck?, En RegisterInsert? estoy en lo correcto? –

4

Tan pronto como usted sabe que la operación en su conjunto va a fracasar, entonces debería deshacer lo que ha hecho hasta ahora y no tratar más actualizaciones - por lo que en pseudo-código:

function do_updates(array updates) 
{ 
    PDO->beginTransaction(); 
    foreach (updates as statement) { 
     run statement 
     if failed { 
     PDO->rollback(); 
     return false; 
     } 
    } 
    return PDO->commit(); 

HTH

C.

Cuestiones relacionadas