2016-05-04 3 views
2

J'ai quelques questions sur la façon dont ce code du manuel PHP fonctionne. Je vois d'autres exemples qui lancent des exceptions (généralement du code orienté objet) ou utilisent des drapeaux pour suivre les échecs de chaque requête individuelle.Un échec de mysqli_commit est-il automatiquement annulé?

Ma question est pourquoi devriez-vous signaler les erreurs et tester le drapeau avant de décider de valider ou de restaurer. En regardant l'exemple ci-dessous, il apparaît que si la validation ne fonctionne pas, aucune des requêtes ne sera validée de toute façon.

J'ai également remarqué qu'ils sortent simplement en cas d'échec de la validation. Cela annule-t-il automatiquement tout?

<?php 
$link = mysqli_connect("localhost", "my_user", "my_password", "test"); 

/* check connection */ 
if (!$link) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

/* set autocommit to off */ 
mysqli_autocommit($link, FALSE); 

mysqli_query($link, "CREATE TABLE Language LIKE CountryLanguage"); 

/* Insert some values */ 
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F',  11.2)"); 
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)"); 

/* commit transaction */ 
if (!mysqli_commit($link)) { 
    print("Transaction commit failed\n"); 
    exit(); 
} 

/* close connection */ 
mysqli_close($link); 
?> 
+1

Où commencez-vous votre transaction? – Sven

+1

@Sven il peut être clairement vu dans le code. –

Répondre

1

En regardant l'exemple ci-dessous, il semble que si le commettras ne fonctionne pas, aucune des requêtes serait commise de toute façon.

Droite.

Mais le point est que une erreur peut se produire non seulement avec la validation. Mais - encore plus probable - avec l'une des requêtes exécutées. Vous devez donc vérifier non seulement le résultat de la validation, mais également le résultat de chaque requête et annuler l'opération entière.

Alors, votre question doit se lire comme

Est-ce un échec mysqli rollback automatiquement?

Et la réponse est "oui et non".
Par défaut, ce ne sera pas le cas.
Si vous parvenez à annuler votre script en cas d'échec de la requête, le lien sera fermé et la transaction sera automatiquement annulée. Le code ci-dessous convertit les erreurs mysql dans les erreurs fatales PHP qui feront automatiquement une restauration si l'une des requêtes échouait.

<?php 
/* set the proper error reporting mode */ 
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

$link = mysqli_connect("localhost", "my_user", "my_password", "test"); 

/* set autocommit to off */ 
mysqli_autocommit($link, FALSE); 

/* Run your queries */ 
mysqli_query($link, "CREATE TABLE Language LIKE CountryLanguage"); 
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F',  11.2)"); 
mysqli_query($link, "INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)"); 

/* commit transaction */ 
mysqli_commit($link); 

/* this is the last line, NO other code is needed */ 
+0

Parfait! C'est juste ce dont j'avais besoin! – user2332467