Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> PDO i transakcje
smiady
post
Post #1





Grupa: Zarejestrowani
Postów: 137
Pomógł: 2
Dołączył: 2.07.2007
Skąd: Ostrzeszów

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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ę.
Go to the top of the page
+Quote Post
smiady
post
Post #3





Grupa: Zarejestrowani
Postów: 137
Pomógł: 2
Dołączył: 2.07.2007
Skąd: Ostrzeszów

Ostrzeżenie: (0%)
-----


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() ...
Go to the top of the page
+Quote Post
irmidjusz
post
Post #4





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

Ostrzeżenie: (0%)
-----


a tabela jest InnoDB?
Go to the top of the page
+Quote Post
smiady
post
Post #5





Grupa: Zarejestrowani
Postów: 137
Pomógł: 2
Dołączył: 2.07.2007
Skąd: Ostrzeszów

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 10:49