Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mysql i rollback (nie działa mi)
Forum PHP.pl > Forum > PHP
MatKus
Witam.

Próbuję zrobić sobie prostą klasę dziedziczącą po mysqli, która do polecenia "query" będzie przyjmowała tablicę i wykonywała albo ją cała, albo rollback. I tu pojawia się problem. Oto mój kod:

  1. class class_db extends mysqli
  2. {
  3. var $connected; // czy połączony?
  4. var $last_insert_id; // ostatni insert_id (osobno, bo po commit insert_id jest nieokreślony)
  5. function __construct($host, $login, $pass, $db)
  6. {
  7. parent::__construct($host, $login, $pass, $db);
  8. parent::query('SET NAMES utf8');
  9. if (mysqli_connect_error())
  10. {
  11. $this->connected = false;
  12. } else
  13. {
  14. $this->connected = true;
  15. $this->autocommit(false);
  16. }
  17. }
  18.  
  19. function query($query)
  20. {
  21. if($this->connected)
  22. {
  23. if (!is_array($query))
  24. {
  25. $query=array($query);
  26. }
  27. foreach ($query as $zapytanie)
  28. {
  29. $wynik = parent::query($zapytanie);
  30. if ($this->errno>0) break;
  31. }
  32. if($this->error != '')
  33. {
  34. // błąd zapytania
  35. $this->rollback();
  36. return false;
  37. }
  38. $this->last_insert_id=$this->insert_id; // po commit insert id jest nieokreślony, więc trzeba go zapamiętać przed commitem.
  39. $this->commit();
  40. return $wynik;
  41. }
  42. else
  43. {
  44. // błąd połączenia z bazą
  45. return false;
  46. }
  47. }
  48. }


Problem w tym, że jeśli dam kilka zapytań, to rollback nie wykonuje się (mimo, że dochodzi do tego miejsca w kodzie). Przykładowo, przekażę tablicę z 10 delete'ami i w 5 będzie błąd, to 4 pierwsze nie przywrócą się, po prostu są skasowane i tyle.

Gdzie robię błąd?
nospor
1) Skoro robisz ROLLBACK to wypadałoby wpierw zrobić BEGIN, czyli rozpocząć transakcję.
2) No i najważniejsze - czy tu w ogóle działasz na tabelach typu INNODB?

ps: to nie ma związku z obiektówką. Przenosze
MatKus
Sorry za zły dział.

@1) jest autocommit(false)
@2) i tu jest właśnie pies pogrzebany. Tego nie doczytałem w żadnym manualu. Dzięki.
nospor
ad1) Ja mówiłem o rozpoczynaniu a nie o kończeniu.
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.