Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Mysql i rollback (nie działa mi)
MatKus
post
Post #1





Grupa: Zarejestrowani
Postów: 63
Pomógł: 3
Dołączył: 27.08.2008

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


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?

Ten post edytował MatKus 13.11.2012, 15:21:32
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
MatKus
post
Post #3





Grupa: Zarejestrowani
Postów: 63
Pomógł: 3
Dołączył: 27.08.2008

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


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





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




ad1) Ja mówiłem o rozpoczynaniu a nie o kończeniu.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 03:54