Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] klasa do obsługi MySQL
Forum PHP.pl > Forum > PHP
mynio
witam
napisalem sobie prostą klasę do obsługi MySQL, nie zamieszczam tego jeszcze w dziale oceny ponieważ to nic wielkiego, chciałbym jeszcze nad nią tochę popracować, co radzicie, przeglądałem troche kody podobnych klas, czekam na Wasze opinie
myślę o jakiejś obsłudze błędów ponieważ narazie nie ma to żadnych zabezpieczeń
pzdr

  1. <?
  2. //show_source ('mysql.class.php');
  3. error_reporting (E_ALL);
  4.  
  5. class mysql {
  6.  
  7. private $host;
  8. private $user;
  9. private $password;
  10. private $database;
  11. public $id_connection;
  12.  
  13.  public function __construct ($host, $user, $password, $database) {
  14.  
  15.  $this->host = $host;
  16.  $this->user = $user;
  17.  $this->password = $password;
  18.  $this->database = $database;
  19.  
  20. if (! ($this->id_connection = mysql_connect ($this->host, $this->user, $this->password))) {
  21. throw new Exception ('Nie mogę połączyć się z serwerem bazy danych');
  22.  } 
  23. if (! (mysql_select_db($this->database))) {
  24. throw new Exception ('Nie mogę połączyć się bazą danych: '.$this->database);
  25. } 
  26.  
  27. }
  28.  
  29. public function make_query($sql) {
  30. return new mysql_res (mysql_query($sql, $this->id_connection));
  31. }
  32.  
  33. public function __destruct () {
  34. mysql_close ($this->id_connection);
  35. }
  36. }
  37.  
  38. class mysql_res implements IteratorAggregate {
  39.  
  40. private $result;
  41.  
  42. public function __construct($result) {
  43. $this->result = $result;
  44. }
  45.  
  46. public function getIterator() {
  47. return new mysql_res_iterator($this->result);
  48. }
  49.  
  50.  
  51. }
  52.  
  53. class mysql_res_iterator implements Iterator {
  54.  
  55. private $result;
  56. private $current = 0;
  57. private $rows;
  58.  
  59. public function __construct($result) {
  60. $this->result = $result;
  61. $this->rows = mysql_num_rows($this->result);
  62. }
  63.  
  64. public function current() {
  65. return mysql_fetch_object($this->result);
  66. }
  67.  
  68. public function key() {
  69. return $this->current;
  70. }
  71.  
  72. public function rewind() {
  73. $this->current = 0;
  74. mysql_data_seek($this->result, $this->current);
  75. }
  76.  
  77. public function next() {
  78. $this->current++;
  79. }
  80.  
  81. public function valid() {
  82. return $this->current < $this->rows;
  83. }
  84.  
  85. }
  86. ?>


i użycie:

  1. <?
  2.  
  3. function __autoload($classname) {
  4. include_once $classname.'.class.php';
  5. }
  6.  
  7.  
  8. try {
  9. $db = new mysql('localhost','root','krasnal', 'tomek');
  10. $sql = 'SELECT * FROM ks_tel';
  11. $dane = $db->make_query($sql);
  12.  
  13. foreach ($dane as $id ){
  14. echo 'Imie: '.$id->imie.'<br>';
  15. echo 'Nazwisko: '.$id->nazwisko.'<br>';
  16. echo 'Numer: '.$id->numer.'<br><br>';
  17. }
  18.  
  19. } catch (Exception $e) {
  20. echo $e;
  21. }
  22. ?>
NuLL
Bardzo marna ta klasa. Brak obiektu wyniku, brak możliwośc zwrócenia wyniku jako iterator - sporo do zrobienia.
Sh4dow
Bez obrazy ale wyglada to jak przepisanie strukturalnego mysql na obiekt i nic wiecej.
Null: jesli chdozi o wykonanie obiektu dla wyniku itd, nie ma sprawy, ale nie wszyscy tego wymagaja. Ja naprzyklad zrobilem swoj prosty obiekt dla wlasnego uzytku i miesci sie to w 2 klasach, gdzie ta druga to dodatkowy debugger smile.gif

No ale wracajac do klasy. Dla ulatwienia zycia proponuje dopisac takie proste dosc metody jak getRow, getArray, getCol, getOne, insert, update bardzo przydatne przy wiekszych aplikacjach. Duzo szybciej sie pisze poznej cokolwiek.

W konstruktorze odradzal automatycznego laczenia sie z baza. Wiem ze moze to dziwne, ale ja przed polaczeniem wole ustawic sobie wszystko. wlaczenie logo, debuger, licznik zapytan i wiele innych rzeczy. pozniej dopiero wykonywane jest polaczenie.
To takie sugestie smile.gif
mike
Z mojej strony tylko tyle co już zaznaczył @Sh4adow. Klasa nie ma najmniejszego sensu, jest tylko i wyłącznie nadpisaniem metod już zaimplementowanych w php, więc po co jej uzywać? Co innego jeżeli wnosiłaby coś konkrentego, ale tak nie jest. Gdybym miał to oceniać to byłoby to 1/10.
nrm
proponuje ci skorzystac z gotowej klasy np. dostepnej na phpclasses.org. ja sobie bardzo chwale bodajze ezSql (ezMysql? jakos tak).

o wygoglalem http://php.justinvincent.com/

no chyba, że traktujesz to jako nauke i masz czas na zabawe z tym. wtedy to skorzystaj z rad kolegów wyżej. ja nie mam czasu wiec korzystam z tego co gotowe - o ile mi pasuje a akurat ten ezSql jest tym co sam chcialem napisac. dodalem do niego tylko zliczanie zapytan i czasow pytan.
mynio
dzięki za wyrażenie własnych opini, ta klasa to moja pierwsza klasa pisana pod PHP5 i wiem, że nie jest to nic wielkiego, mam zamiar nad nią popracować więc powinna się rozbudować, spróbuję dostosować się do rad kolegi Sh4dowa i dopisania tych metod, jeśli można by było to prosiłbym o dokłądniejsze skonkretyzowanie co wymienione przez Ciebie metody miały by dokładnie robić lub ewentualnie powiedzieć mi czy dobrze myślę:

getRow - jak myśle pobierałaby wiersz z bazy danych
getArray - hmm
getCol - kolumne
getOne - hmm

i jeszcze jedno czy warto dopisać metody typu insert, update, delate, które by poprostu dodawały, uaktualniały bądź usuwały dane z bazy czy poprostu zostawić to tak jak jest to w ten sposób i przypisywać to jakiejś zmiennej $sql, na której miała by działać metoda make_query()

i jeszcze jedno nie za bardzo zrozumiałem o co chodzi Tobie NuLL
Cytat
Brak obiektu wyniku, brak możliwośc zwrócenia wyniku jako iterator - sporo do zrobienia.


jeśli mógłbyś wyjaśnić lub odesłać to jakiegoś przykładu byłbym wdzięczny

normanos: traktuję to jako formę nauki, ale dzięki za linka zapoznam się
pzdr
Major
NuLL nie jesteś w dziale 'php Pro' więc miło by było gdybyś pisał by każdy zrozumial ;]

Co do klasy przypomina mi moja pierwsza klase do DB tyle ze pisana pod php4 smile.gif

Pare dni temu równierz pisałem klase pod php5 i bede musial ja pisać od nowa bo ona pokazuje tylko jak pisac nie wolno i jest bardzooo toporna smile.gif

Co do klasy przedstawionej przez normanosa też nie jest super(ogladalem tylko wersja dla mysqla). Głównie przez to:
  1. <?php
  2.  if ( preg_match("/^(insert|delete|update|replace)s+/i",$query) )
  3.  {
  4. $this->rows_affected = mysql_affected_rows();
  5.  
  6. // Take note of the insert_id
  7. if ( preg_match("/^(insert|replace)s+/i",$query) )
  8. {
  9.  $this->insert_id = mysql_insert_id($this->dbh);  
  10. }
  11.  
  12. // Return number fo rows affected
  13. $return_val = $this->rows_affected;
  14.  }
  15. ?>

Można by to bez problemu zastąpić funkcjami str* bądź jednym pregiem
Sh4dow
Cytat(mynio @ 2005-08-21 19:04:47)
...
getRow - jak myśle pobierałaby wiersz z bazy danych
getArray - hmm
getCol - kolumne
getOne - hmm
...

GetArray zazwyczaj pobiera wynik jako tablice asocjacyjna, gdzie indexy tablicy maja nazwy pol w tabeli. tablica jest oczywiscie wielo-wymiarowa. mozna zrobic modyfikacje pod tytulem ze zglowny index tablicy bedzie to powiedzmy klucz PRIMARY tablicy.
  1. <?php
  2. $array = $db->getArray("SELECT * FROM table");
  3. // $array[0] = array('id' =>1, 'col1' => 'val1', 'col2' =>'val2');
  4. // lub
  5. // jesli kluczem tablicy jest naprzyklad ID
  6. // $array[1] = array('col1' => 'val1', 'col2' =>'val2');
  7. ?>

Wsszystko zalezy od zastosowan jakie sa potrzebne
getOne - pobiera tylko jedna wartosc, zawsze pierwsza z brzegu. przydatne naprzyklad przy zliczaniu wierszy przy zapytaniach typu
  1. <?php
  2. $int = $db->getOne("SELECT COUNT(*) FROM table");
  3. //zwroci liczbe
  4. ?>


Przy getCol moze zrobi generator zapytania naprzyklada podajac tylko nazwe kolumny i nazwe tablicy, ale za jednym zamachem utrudniamy limity, warunki itp. Wiec wykonujemy metode podobna do getOne, czyli ponieramy tylko jedna warosc z tablicy, zawsze pierwsza i wpladamy w polejne indexy. Tu mamy tablice jedno wymiarowa.

Metod jakie mozna wykonac przy takiej klasie jest naprawde duzo, mozna to wszystko laczyc razem z obiektem zajmujacym sie cache'em.

Klas do baz danych jest na tyle duzo ze oczywiscie mozna sobie cos wybrac. Ale jest to dobra rzecz do nauki i eksperymentow przy obiektach. Proste, przydatne chyba kazdemu. Ja osobiscie sie przekonalem ze uzywajac czyjejs klasy dla baz danych zawsze nadchodzi czas zeby ja chociaz troszeczke poprzerabiac smile.gif

Zycze powodzenia. O tym to mozna by prawie arta napisac, ale ja sie nie podejmuje, nie mam czasu juz na nic. Rkingsmiley.png
mynio
witam
edytowałem troche swoją klasę, wprowadziłem drobną obsługę błędów, marna ale rozbuduje to i wprowadzilem funckje wykorzystujące Iterator, przyznam, że pierwszy raz się z tym spotkałem i większość kodu pochodzi w wiki.php.pl

teraz mam pytanie odnośnie tych klas, gdzie wprowadzać do której z klas pozostałe metody, które rozbudują możliwości tej klasy ?

i jak mam rozumiec pojęcie cacheowania i debugowania o których wspominaliście w komentarzach do pierwszej wersji tej klasy

pzdr
nrm
artykuł o cacheowaniu zapytań sql (do plików) jest na webcity, poszukaj. ogolnie szybciej bedzie keszowac cały template i ja po jakims czasie usunąłem mozliwośc keszu.

nie wiem co miał kolega na mysli pisząc debbugowanie -> byc może wypluwanie tabelek z rozbiciem zapytania sql na częsci pierwsze - pomaga zlokalizowac błąd, tudzież zoptymalizowac zapytanie.
przyklad tego masz w klasie, która wcześniej poleciłem.
mynio
zamieszczam kolejną wersję mojej skromnej klasy
  1. <?
  2. //show_source ('mysql.class.php');
  3. error_reporting (E_ALL);
  4.  
  5. class mysql {
  6.  
  7. private $host;
  8. private $user;
  9. private $password;
  10. private $database;
  11. public $id_connection;
  12.  
  13.  public function __construct ($host, $user, $password, $database) {
  14.  
  15.  $this->host = $host;
  16.  $this->user = $user;
  17.  $this->password = $password;
  18.  $this->database = $database;
  19.  
  20. if (! ($this->id_connection = mysql_connect ($this->host, $this->user, $this->password))) {
  21. throw new Exception ('Nie mogę połączyć się z serwerem bazy danych');
  22.  } 
  23. if (! (mysql_select_db($this->database))) {
  24. throw new Exception ('Nie mogę połączyć się bazą danych: '.$this->database);
  25. } 
  26.  
  27. }
  28.  
  29. public function make_query($sql) {
  30. return new mysql_res (mysql_query($sql, $this->id_connection));
  31. }
  32.  
  33. public function __destruct () {
  34. mysql_close ($this->id_connection);
  35. }
  36. }
  37.  
  38. class mysql_res implements Iterator {
  39.  
  40. private $result;
  41. private $current = 0;
  42. private $rows;
  43.  
  44. public function __construct($result) {
  45. $this->result = $result;
  46. $this->rows = mysql_num_rows($this->result);
  47. }
  48.  
  49. public function getIterator() {
  50. return new mysql_res_iterator($this->result);
  51. }
  52.  
  53. public function current() {
  54. return mysql_fetch_object($this->result);
  55. }
  56.  
  57. public function key() {
  58. return $this->current;
  59. }
  60.  
  61. public function rewind() {
  62. $this->current = 0;
  63. mysql_data_seek($this->result, $this->current);
  64. }
  65.  
  66. public function next() {
  67. $this->current++;
  68. }
  69.  
  70. public function valid() {
  71. return $this->current < $this->rows;
  72. }
  73.  
  74.  
  75. }
  76.  
  77.  
  78. ?>


mam pytanie o metody wymuszone przez Iterator, w jakich sytuacjach ich najlepiej używać, zauważyłem również, że raczej nie potrzebna jest metoda typu mysql_fetch_array(), ponieważ można to zrobić inaczej poprawcie mnie jeśłi źle myślę oraz kolejne pytanie do której z klas dopisywać ewentualne dodatkowe metody, o których mowa był wcześniej?

pzdr
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.