Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: OOP <==> MySQLi
Forum PHP.pl > Forum > PHP
ksenonlogin
Witam

Niżej zamieszczam klasę odpowiedzialną za połączenie z bazą danych oraz za wykonywanie zapytań sql wraz z generowaniem wyjątków.

Działa tak:

Łączy się z bazą danych za pomocą danych (dekodowanych) z klasy nadrzędnej i to wszystko ładnie działa (prócz wymuszenia wyświetlenia komunikatu o braku połączenia z bazą, przy błędnych danych pokazuje drugi wyjątek o braku bazy dach a nie braku połączenia).

Dodatkowo mam problem z destruktorem (jest jakiś błąd składniowy - dokładnie nie wiem).
Chodzi o to że klasa działa na tej zasadzie że metoda "cos" rozpoczyna transakcje dla tabel innob, natomiast destruktor w razie wykrycia błędu (zostanie zwrócony wyjątek) cofa wszystkie działania wywołane przez obiekt.

Prosiłbym o wskazówki co poprawić w kodzie tak by to było poprawnie wykonane jak na na OOP przystało wink.gif


  1. class mysqli_db extends masa
  2. {
  3.  
  4.  
  5.  
  6.  
  7. public function cos()
  8. {
  9.  
  10. // łączymy się z bazą danych
  11. IF(!$this->mysqli = new mysqli($this->host, $this->user, $this->password))
  12. {
  13. $this->error = true;
  14. // W przypadku niepowodzenia połączenia wygeneruj wyjątek
  15. throw new Exception('Błąd Połączenia z Bazą Danych - '.$this->mysqli->error, $this->mysqli->errno);
  16. }
  17. // wybieramy bazę danych
  18. IF(!$this->mysqli->select_db($this->database))
  19. {
  20. $this->error = true;
  21. // W przypadku niepowodzenia wybrania bazy wygeneruj wyjątek
  22. throw new Exception('Nie można wybrać bazy danych - '.$this->mysqli->error, $this->mysqli->errno);
  23. }
  24. // ustawiamy "tryb" transakcji dla tabel InnoDB
  25. $this->mysqli->autocommit(false);
  26. $this->mysqli->query('SET AUTOCOMMIT = 0');
  27. $this->mysqli->query('BEGIN');
  28. }
  29. // Wykonywanie zapytań nie zwracających wartości (nie-Select)
  30. public function query($query)
  31. {
  32. IF(!ereg('SELECT', $query) and !$this->error)
  33. {
  34. IF(!$result = $this->mysqli->query($query))
  35. {
  36. $this->error = true;
  37. throw new Exception('Błąd wykonania zapytania - ('.$query.') - '.$this->mysqli->error, $this->mysqli->errno);
  38. }
  39. else
  40. {
  41. return true;
  42. }
  43. }
  44. }
  45. // Zapytania z SELECT zwrócą nam od razu tablicę asocjacyjną z wynikami
  46. public function query_select($query)
  47. {
  48. IF(!$this->error)
  49. {
  50. IF(!$result = $this->mysqli->query($query))
  51. {
  52. $this->error = true;
  53. throw new Exception('Błąd wykonania zapytania - ('.$query.') - '.$this->mysqli->error, $this->mysqli->errno);
  54. }
  55. while($row = $result->fetch_assoc())
  56. {
  57. $return[] = $row;
  58. }
  59. unset($result);
  60. unset($row);
  61. return $return;
  62. }
  63. }
  64. // ID pola autoincrement użyte w ostatnim zapytaniu INSERT
  65. public function insert_id()
  66. {
  67. return $this->mysqli->insert_id;
  68. }
  69. public function escape($string)
  70. {
  71. return $this->mysqli->real_escape_string($string);
  72. }
  73. // Destruktor, w przypadku błędów wszystkie zmiany będą cofnięte
  74. public function __destruct()
  75. {
  76. IF(!$this->error)
  77. {
  78. $this->mysqli->query('COMMIT');
  79. }
  80. else
  81. {
  82. $this->mysqli->query('ROLLBACK');
  83. }
  84. unset($this->mysqli);
  85. unset($this->error);
  86. }
  87. }
  88.  
  89.  
  90. try
  91. {
  92. $ms = new mysqli_db();
  93. $ms->cos();
  94. $ms->query("*");
  95. echo 'OK';
  96.  
  97. }
  98. catch (Exception $error)
  99. {
  100. echo '<b>Komunikat</b>: '.$error->getMessage().'<br /><b>Plik</b>: '.$error->getFile().'<br /><b>Wiersz</b>: '.$error->getLine().'<br /><b>IP</b>: '.$_SERVER['REMOTE_ADDR'].' | <b>LINK</b>: '.$_SERVER['REQUEST_URI'].'<br /><br />'.$error->getTraceAsString();
  101. }
pamil
Wyrzucić ten kod, zobaczyć jak napisany jest Doctrine\DBAL i przyjść ponownie.
ksenonlogin
Cytat(pamil @ 2.09.2012, 13:07:09 ) *
Wyrzucić ten kod, zobaczyć jak napisany jest Doctrine\DBAL i przyjść ponownie.


Tak, już to widziałem wcześniej, ale dopiero przechodzę z programowania strukturalnego na obiektowe i mam wrażenie że cały internet przeszukałem dlatego proszę o wskazówki...
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.