Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Klasa obsługi baz SQL, nie działa wyświetlanie 'wielu rekordów'
tiraeth
post
Post #1





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

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


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 (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) .....

POMOCY

Ten post edytował Tiraeth 9.08.2004, 20:17:29
Go to the top of the page
+Quote Post
pirat
post
Post #2





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 13.05.2003
Skąd: Katowice

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


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 " (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
tiraeth
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

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


ej.. masz jakiekolwiek pojęcie o php?? ....n/c (IMG:http://forum.php.pl/style_emoticons/default/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!
Go to the top of the page
+Quote Post
pirat
post
Post #4





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 13.05.2003
Skąd: Katowice

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


Niezle sie usmialem znalazles DOKLADNIE TEN SAM blad i nazwales go swoim bledem i masz racje TO TWÓJ BŁĄD (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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

Ten post edytował pirat 9.08.2004, 22:45:38
Go to the top of the page
+Quote Post
fones
post
Post #5





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 7.08.2004
Skąd: Brześć Kujawski

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


No przeciez pisał ze wszytkiego nie zamieszcza bo nie chce forum zasmiecac...

LUDZIE CZYTAJCIE POSTY DO KONCA

pozdro (IMG:http://forum.php.pl/style_emoticons/default/guitar.gif)
Go to the top of the page
+Quote Post
pirat
post
Post #6





Grupa: Zarejestrowani
Postów: 68
Pomógł: 0
Dołączył: 13.05.2003
Skąd: Katowice

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


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 ;/
Go to the top of the page
+Quote Post
tiraeth
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

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


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 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) jak zobaczylem ten blad to go poprawilem.....

Dalej proszę o 'sensowną' odpowiedź.
Go to the top of the page
+Quote Post
davidD
post
Post #8





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 10.10.2002

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


Hmm, ogólnie namieszałeś nieźle z tej klasie (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Pozdrawiam (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował davidD 11.08.2004, 00:20:31
Go to the top of the page
+Quote Post
fones
post
Post #9





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 7.08.2004
Skąd: Brześć Kujawski

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


  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 (IMG:http://forum.php.pl/style_emoticons/default/guitar.gif)

Ten post edytował fones 11.08.2004, 12:57:50
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 20:33