Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PDO i transakcje
Forum PHP.pl > Forum > PHP
smiady
Witam.

Uczę się transakcji i mam taki przykład:
  1. try {
  2. $db= DB::connect();
  3.  
  4. $db->query("TRUNCATE liczby");
  5.  
  6. $liczby= array(2, 5, 12, 8, 9);
  7.  
  8. $insert= $db->prepare("INSERT INTO liczby(liczba) VALUES(:liczba)");
  9. $db->beginTransaction(); $error= false;
  10. foreach($liczby as $liczba):
  11. if($liczba > 10) {
  12. $db->rollBack();
  13. $error= true;
  14. }
  15. $insert->execute(array('liczba' => $liczba));
  16. endforeach;
  17. if(!$error) $db->commit();
  18. } catch(PDOException $e) {
  19. echo $e;
  20. }


I niestety za każdym razem przechodzi 5 insertów ... dlaczego skoro po 3 insercie mam rollback ?
Widzę, że czegoś tutaj nie łapie.
Crozin
Wywołanie metody rollback() nie zatrzyma wykonywania kodu PHP, Ty sam tego nie robisz, więc nie ma powodu dla którego dalsze zapytania miałby się nie wykonać. Tutaj mógłbyś spróbować skorzystać z czegoś takiego:
  1. try {
  2. // ...
  3.  
  4. foreach (...) {
  5. if ($liczba > 10) {
  6. throw new InvalidArgumentException('blah blah blah');
  7. }
  8.  
  9. $insert->execute(...);
  10. }
  11.  
  12. $db->commit();
  13. } catch (Exception $e) {
  14. $db->rollbackk();
  15.  
  16. throw $e;
  17. }
W przypadku pojawienia się błędu (wyjątku) przerwiesz wykonywania bloku try i wskoczysz do bloku catch, który cofnie transakcję.
smiady
Dalej jest coś nie tak:

  1. try {
  2. $db= DB::connect();
  3.  
  4. $db->query("TRUNCATE liczby");
  5.  
  6. $liczby= array(2, 5, (isset($_REQUEST['liczba']) ? intval($_REQUEST['liczba']) : 0), 8, 9);
  7.  
  8. $insert= $db->prepare("INSERT INTO liczby(liczba) VALUES(:liczba)");
  9. $db->beginTransaction();
  10. foreach($liczby as $liczba):
  11. if($liczba > 10)
  12. throw new InvalidArgumentException('Wpisano niedozwoloną liczbę !');
  13. $insert->execute(array('liczba' => $liczba));
  14. endforeach;
  15. $db->commit();
  16. } catch(Exception $e) {
  17. $db->rollBack();
  18. echo $e->getMessage();
  19. }


I przy linku: http://localhost/php/index.php?liczba=12
wyskoczy wyjątek: Wpisano niedozwoloną liczbę !
ale przejdą dwa pierwsze inserty tak jakby nie działał rollBack() ...
irmidjusz
a tabela jest InnoDB?
smiady
Tabela jest InnoDB, ale napisałem skrypt jeszcze raz i działa nie wiem co było wcześniej nie tak ...
dzięki za pomoc
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.