Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa obsługi baz SQL
Forum PHP.pl > Forum > PHP
tiraeth
Witam.... Jestem totalny newbie jeżeli chodzi o klasy ale postanowiłem napisać klasę do obsługi dwóch baz danych: mySQL oraz postreSQL. Niestety nie działa mi jedna rzecz... mianowicie wyświetlanie wielu rekordów przy użyciu pętli while... zarówno jeżeli chodzi o mySQL jak i postreSQL. Odpowiada za to funkcja fetchrowset. Pisząc moją klasę opierałem się na phpBB2, z którego wyciągałem tylko kod dotyczący wyświetlania wyników zapytania (SELECT).

Poniżej przedstawiam kody źródłowe plików, które odpowiadają za klasę. Nie chcąc zasypywać forum wrzucam tylko funkcje odpowiadające na wyświetlanie danych:

mysql.php - klasa dla bazy mysql
  1. <?
  2. class sqlDb
  3. {
  4. var $dbhost;
  5. var $dbuser;
  6. var $dbpass;
  7. var $dbname;
  8. var $dbconnect;
  9. var $dbresult;
  10. var $dbrow = array();
  11. var $dbrowset = array();
  12.  
  13. ...................CIACH
  14.  
  15. //
  16. // Zapytanie do bazy danych
  17. //
  18. function sendquery($query)
  19. {
  20. //
  21. // Usuwamy poprzednie istniejące zapytania
  22. //
  23. unset($this->dbresult);
  24.  
  25. $this->dbresult = mysql_query($query, $this->dbconnect);
  26.  
  27. if($this->dbresult)
  28. {
  29. unset($this->dbrow[$this->dbresult]);
  30. unset($this->dbrowset[$this->dbresult]);
  31.  
  32. return $this->dbresult;
  33. }
  34. else
  35. {
  36. return false;
  37. }
  38. }
  39.  
  40. ...................CIACH
  41.  
  42. //
  43. // Pobieramy wiersz z zapytania
  44. //
  45. function fetchrow($query_id = 0)
  46. {
  47. if(!$query_id)
  48. {
  49. $query_id = $this->dbresult;
  50. }
  51.  
  52. if($query_id)
  53. {
  54. $this->dbrow[$query_id] = mysql_fetch_array($query_id, MYSQL_ASSOC);
  55. return $this->row[$query_id];
  56. }
  57. else
  58. {
  59. return false;
  60. }
  61. }
  62.  
  63. //
  64. // Pobieramy wszystkie wiersze z zapytania
  65. //
  66. function fetchrowset($query_id = 0)
  67. {
  68. if(!$query_id)
  69. {
  70. $query_id = $this->dbresult;
  71. }
  72.  
  73. if($query_id)
  74. {
  75. unset($this->dbrowset[$query_id]);
  76. unset($this->dbrow[$query_id]);
  77.  
  78. while($this->dbrowset[$query_id] = mysql_fetch_array($query_id, MYSQL_ASSOC))
  79. {
  80. $result[] = $this->dbrowset[$query_id];
  81. }
  82.  
  83. return $result;
  84. }
  85. else
  86. {
  87. return false;
  88. }
  89. }
  90. }
  91. ?>


postresql.php - klasa dla bazy postresql
  1. <?
  2. class sqlDb
  3. {
  4. var $dbconnect;
  5. var $dbresult;
  6. var $dbrow = array();
  7. var $dbrowset = array();
  8. var $dbrownum = array();
  9. var $dbnumqueries = 0;
  10.  
  11. ...................CIACH
  12.  
  13. //
  14. // Zapytanie do bazy danych
  15. //
  16. function sendquery($query)
  17. {
  18. //
  19. // Usuwamy poprzednie istniejące zapytania
  20. //
  21. unset($this->dbresult);
  22.  
  23. $this->dbnumqueries++;
  24. $query = preg_replace(&#092;"/LIMIT ([0-9]+), ([0-9]+)/\", \"LIMIT 2 OFFSET 1\", $query);
  25.  
  26. $this->dbresult = @pg_exec($this->dbconnect, $query)
  27.  
  28. if($this->dbresult)
  29. {
  30. $this->dblastquerytext[$this->dbresult] = $query;
  31. $this->dbrownum[$this->dbresult] = 0;
  32.  
  33. unset($this->dbrow[$this->dbresult]);
  34. unset($this->dbrowset[$this->dbresult]);
  35.  
  36. return $this->dbresult;
  37. }
  38. else
  39. {
  40. return false
  41. }
  42. }
  43.  
  44. ...................CIACH
  45.  
  46. //
  47. // Pobieramy wiersz z zapytania
  48. //
  49. function fetchrow($query_id = 0)
  50. {
  51. if(!$query_id)
  52. {
  53. $query_id = $this->dbresult;
  54. }
  55.  
  56. if($query_id)
  57. {
  58. $this->dbrow = @pg_fetch_array($query_id, $this->dbrownum[$query_id]);
  59. if($this->dbrow)
  60. {
  61. $this->rownum[$query_id]++;
  62.  
  63. return $this->dbrow;
  64. }
  65. }
  66. else
  67. {
  68. return false;
  69. }
  70. }
  71.  
  72. //
  73. // Pobieramy wszystkie wiersze z zapytania
  74. //
  75. function fetchrowset($query_id = 0)
  76. {
  77. if(!$query_id)
  78. {
  79. $query_id = $this->dbresult;
  80. }
  81.  
  82. if($query_id)
  83. {
  84. unset($this->dbrowset[$query_id]);
  85. unset($this->dbrow[$query_id]);
  86. $this->rownum[$query_id] = 0;
  87.  
  88. while($this->dbrowset = @pg_fetch_array($query_id, $this->dbrownum[$query_id], PGSQL_ASSOC))
  89. {
  90. $result[] = $this->dbrowset;
  91. $this->dbrownum[$query_id]++;
  92. }
  93.  
  94. return $result;
  95. }
  96. else
  97. {
  98. return false;
  99. }
  100. }
  101. }
  102. ?>


db.php - odpowiada za wybór bazy i połączenie
  1. <?
  2. switch($dbtype)
  3. {
  4. case 'mysql':
  5. include($root_path . 'mysql.php');
  6. break;
  7.  
  8. case 'postgresql':
  9. include($root_path . 'postgresql.php');
  10. break;
  11. }
  12.  
  13. // Tworzymy połączenie z bazą danych
  14. $db = new sqlDb();
  15. $db->connect($dbhost, $dbuser, $dbpass, $dbname);
  16. if(!$db->dbconnect)
  17. {
  18. die(&#092;"Error: Could not connect to the database\");
  19. }
  20. ?>


config.php - konfiguracja bazy danych
  1. <?
  2. $dbhost = '';
  3. $dbuser = '';
  4. $dbpass = '';
  5. $dbname = '';
  6.  
  7. $dbtype = 'mysql'; // lub postresql
  8. ?>


show.php - przykladowy plik z wykonaniem klasy
  1. <?
  2. $root_path = '';
  3. include($root_path . &#092;"config.php\");
  4. include($root_path . &#092;"db.php\");
  5.  
  6. // TWORZYMY TABELE - dziala
  7. $sql = &#092;"CREATE TABLE sqls_test (id CHAR(10), tekst CHAR(20))\";
  8.  
  9. $result = $db->sendquery($sql);
  10.  
  11. // WRZUCAMY REKORD - dziala
  12. $sqla = &#092;"INSERT INTO sqls_test(id, tekst) VALUES ('2', 'jeden')\";
  13.  
  14. $resulta = $db->sendquery($sqla);
  15.  
  16. // WRZUCAMY REKORD - dziala
  17. $sqlb = &#092;"INSERT INTO sqls_test(id, tekst) VALUES ('4', 'dwa')\";
  18.  
  19. $resultb = $db->sendquery($sqlb);
  20.  
  21. // ODBIERAMY REKORDY - dziala
  22. $sqlc = &#092;"SELECT * FROM sqls_test ORDER BY id ASC\";
  23.  
  24. $resultc = $db->sendquery($sqlc);
  25.  
  26. // WYSWIETLAMY REKORDY - nie dziala
  27. if($rows = $db->fetchrowset($resultc))
  28. {
  29. $id = $rows['id']; // NIE WIEM CZY TO TAK MA BYC :C
  30. $tekst = $rows['tekst']; // NIE WIEM CZY TO TAK MA BYC :C
  31.  
  32. echo '<b>ID:</b> '.$id.'<br /><b>TEKST:</b> '.$tekst.'<br /><br />';
  33. }
  34.  
  35. // ODLACZAMY SIE OD BAZY - dziala
  36. $db->disconnect;
  37. ?>


Proszę o pomoc jeżeli codzi o wyświetlanie... bo funkcja fetchrow działa... ale fetchrowset nie sad.gif.....

POMOCY
pirat
jak na moje oko to tu czegos brakuje nie

  1. <?php
  2.  
  3.  $query - preg_replace(&#092;"/LIMIT ([0-9]+), ([0-9]+)/\", \"LIMIT 2 OFFSET 1, $query);
  4. ?>


winno byc moze tak
  1. <?php
  2.  
  3.  $query - preg_replace(&#092;"/LIMIT ([0-9]+), ([0-9]+)/\", \"LIMIT 2 OFFSET 1, $query\");
  4.  
  5.  
  6. ?>


brak " biggrin.gif
tiraeth
ej.. masz jakiekolwiek pojęcie o php?? ....n/c laugh.gif

a tak wogle to znalazlem inny błąd

zamiast:
  1. <?
  2. $query - preg_replace(&#092;"/LIMIT ([0-9]+), ([0-9]+)/\", \"LIMIT 2 OFFSET 1, $query);
  3. ?>


powinnobyć
  1. <?
  2. $query = preg_replace(&#092;"/LIMIT ([0-9]+), ([0-9]+)/\", \"LIMIT 2 OFFSET 1\", $query);
  3. ?>


taki mały błąd zrobiłem... dalej czekam na pomoc!
pirat
Niezle sie usmialem znalazles DOKLADNIE TEN SAM blad i nazwales go swoim bledem i masz racje TO TWÓJ BŁĄD tongue.gif poprostu ja zle poprawilem z rozmachu !, dzizaz w dodatku tu jeszze operanda = ni bylo

pfff nie nie mam pojecia o php i ten blad to se lepiej sam nastepnym razem znajdz....bo wystarczylo by ZNAWCO jeszcze napisac jakies błędy? lecą ? OCZYWIŚCIE żę lecą tylko albo masz wyłączoną ich obsługe albo nie zwracasz na nie uwagi albo jestes dziwny, bo bledy w skladni zostalby juz dawno wykryte ! wystaczy troszke dobrych checi exclamation.gif i nie musialby cie poprawiac zaden amator... czy to nie obraza dla Ciebie mistrzu ? ze wlasnie poprawil Cie amator, ktory pierwszy raz zobaczyl zeby ktos nie zadal sobie trudu, zanim zada pytanie !

w pliku db.php
  1. <?php
  2.  
  3. if(!$db->dbconnect)  //podpowiem COS NIE TAK TUTAJ !! ale tu chyba jest '!', 
  4.  
  5. //cos kiepsko dziala tutaj ten phpcode (forum)
  6.  
  7. {
  8.     die(&#092;"Error: Could not connect to the database\");
  9. }
  10.  
  11. ?>



w db.php wywolujesz funkcje ktorej wczesniej nigdzie nie zdefiniowales, chyba ze nie podales tutaj jakis plikow, ale moj serv nie widzi connect(); wiec se sam musialem napisac,

mysql.php
  1. <?
  2. class sqlDb
  3. {
  4.     var $dbhost;
  5.     var $dbuser;
  6.     var $dbpass;
  7.     var $dbname;
  8.     var $dbconnect;
  9.     var $dbresult;
  10.     var $dbrow = array();
  11.     var $dbrowset = array();
  12.     
  13.     //laczenie z baza
  14. function connect()
  15. {
  16. $dbhost;
  17. $dbuser;
  18. $dbpass;
  19. $dbname;
  20.  
  21.  @ $db = mysql_pconnect(&#092;"$dbhost\", \"$dbuser\", \"$dbpass\");
  22.   
  23.   if (!$db)
  24.   {
  25.      echo &#092;"Błąd: : Połączenie z bazą danych nie powiodło się. Spróbuj jeszcze raz późn
    iej.\";
  26.      exit;
  27.   }
  28.  
  29.   mysql_select_db(&#092;"$dbname\");
  30.  
  31. }
  32.  
  33.     //
  34.     // Zapytanie do bazy danych
  35.     //
  36.     function sendquery($query)
  37.     {
  38.         //
  39.         // Usuwamy poprzednie istniejące zapytania
  40.         //
  41.         unset($this->dbresult);
  42.  
  43.         $this->dbresult = mysql_query($query, $this->dbconnect);
  44.  
  45.         if($this->dbresult)
  46.         {
  47.             unset($this->dbrow[$this->dbresult]);
  48.             unset($this->dbrowset[$this->dbresult]);
  49.  
  50.             return $this->dbresult;
  51.         }
  52.         else
  53.         {
  54.             return false;
  55.         }
  56.     }
  57.  
  58.  
  59.  
  60.     //
  61.     // Pobieramy wiersz z zapytania
  62.     //
  63.     function fetchrow(!$query_id = 0)
  64.     {
  65.         if($query_id)
  66.         {
  67.             $query_id = $this->dbresult;
  68.         }
  69.  
  70.         if($query_id)
  71.         {
  72.             $this->dbrow[$query_id] = mysql_fetch_array($query_id, MYSQL_ASSOC);
  73.             return $this->row[$query_id];
  74.         }
  75.         else
  76.         {
  77.             return false;
  78.         }
  79.     }
  80.  
  81.     //
  82.     // Pobieramy wszystkie wiersze z zapytania
  83.     //
  84.     function fetchrowset($query_id = 0)
  85.     {
  86.         if($query_id)
  87.         {
  88.             $query_id = $this->dbresult;
  89.         }
  90.  
  91.         if(!$query_id)
  92.         {
  93.             unset($this->dbrowset[$query_id]);
  94.             unset($this->dbrow[$query_id]);
  95.  
  96.             while($this->dbrowset[$query_id] = mysql_fetch_array($query_id, MYSQL_ASSOC))
  97.             {
  98.                 $result[] = $this->dbrowset[$query_id];
  99.             }
  100.  
  101.             return $result;
  102.         }
  103.         else
  104.         {
  105.             return false;
  106.         }
  107.     }
  108. }
  109. ?>




wreszcie moglbym polaczyc sie z baza gdyby, nie fakt

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in mysql.php on line 43
nie mam zadnych informacji o bazie a niewatpliwie by mi sie przydaly,
nie chce mi sie dalej rozwiazywac problemu bo juz pozno, siade do tego rano jak bede mial czas
fones
No przeciez pisał ze wszytkiego nie zamieszcza bo nie chce forum zasmiecac...

LUDZIE CZYTAJCIE POSTY DO KONCA

pozdro guitar.gif
pirat
ta, ale akurat jak jest zbudowana baza tio tutaj by sie przydalo jakby na to nie patrzec inaczej nie potrafie odtworzyc tego na kompie i poprawiac ewentualnych bledow ;/
tiraeth
Mi jest potrzebna tylko informacja jak odczytac wszystkie rekordy z bazy, bo polaczenie i odlaczenie od bazy to mam juz napisane.... nie podalem bo nie bede zasmiecac forum...... a tak poza tym to php nie zwracal bledy przy tym z $query bo to bylo w postresql'u a ja testowalem na mysql'u i serwer korzystal z klasy dla mySQL'a tongue.gif jak zobaczylem ten blad to go poprawilem.....

Dalej proszę o 'sensowną' odpowiedź.
davidD
Hmm, ogólnie namieszałeś nieźle z tej klasie winksmiley.jpg
To co napicałeś jest to do końca zgodne z ideą OOP - powieneś raczej stworzyć np. dwie takie klasy:
- Db - przechowująca połączenie do bazy danych, metody do łączenia, rozłączania i zadawania zapytań - ta może tworzyć nowy obiekt następnej klasy:
- DbResult - przechowującej wynik zapytania i metody do jego obsługi, czyli m.in. te fetchrowset()


Już pomijając to, najprościej byłoby napisać tą metodę w ten sposób:
  1. <?php
  2.  
  3. function fetchrowset()
  4. {
  5. return mysql_fetch_array($this->dbresult, MYSQL_ASSOC))
  6. }
  7. ?>


Wiem, że chciałeś przechowywać w polach klasy wynik tego przetwarzania - ale w tak skonstruowanej klasie raczej nie ma to sensu tongue.gif

Pozdrawiam smile.gif
fones
  1. <?php
  2.  
  3. function fetchrow($query_id = 0)
  4. {
  5. if(!$query_id)
  6. {
  7. $query_id = $this->db_result;
  8. }
  9. if($query_id)
  10. {
  11. $this->db_row[$query_id] = @mysql_fetch_array($query_id);
  12. return $this->db_row[$query_id];
  13. }
  14. else
  15. {
  16. return false;
  17. }
  18. }
  19.  
  20. function fetchrowset($query_id = 0)
  21. {
  22. if(!$query_id)
  23. {
  24. $query_id = $this->db_result;
  25. }
  26. if($query_id)
  27. {
  28. unset($this->db_rowset[$query_id]);
  29. unset($this->db_row[$query_id]);
  30. while($this->db_rowset[$query_id] = @mysql_fetch_array($query_id))
  31. {
  32. $result[] = $this->db_rowset[$query_id];
  33. }
  34. return $result;
  35. }
  36. else
  37. {
  38. return false;
  39. }
  40. }
  41.  
  42. ?>


a tak wyswietlasz:
  1. <?php
  2.  
  3. $sql = &#092;"SELECT host, user FROM user\";
  4.  
  5. $result = $db->sendquery($sql);
  6.  
  7. while ($row = $db->fetchrow($result))
  8. {
  9. $user=$row['user'];
  10. $host=$row['host'];
  11.  
  12. echo &#092;"$user, $host<br>\";
  13.  
  14. }
  15.  
  16. ?>


tak wiec nie wiem po co jest ta druka funkcja, skoro do wyswietlania wystarczy pierwsza ;p moze ktos wie...

pozdro guitar.gif
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.