Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Prosta klasa do obsługi bazy danych
Forum PHP.pl > Forum > Przedszkole
@rtur
Znalazłem tutaj prostą klasę do obsługi bazy mysql, ale klasa nie ma obsługi mysql_num_rows i mysql_fetch_array więc postanowiłem dodać, ale nie działa jak powinna, mogę prosić o sprawdzenie i naprowadzenie co jest nie tak?

Baza.class.php
  1. <?
  2. class db {
  3. private $db_host = DB_HOST;
  4. private $db_name = DB_NAME;
  5. private $db_user = DB_USER;
  6. private $db_passw = DB_PASSW;
  7. // zmienne publiczne - dostępne poza klasą
  8. public $connection; // połączenie
  9. public $error; // ew. błąd zwrócony przez bazę danych
  10.  
  11. public function connect(){
  12. if ($connection = mysql_connect($this->db_host, $this->db_user, $this->db_passw)) {
  13. if(mysql_select_db($this->db_name, $connection)) {
  14. $this->connection = $connection;
  15. return true;
  16. } else {
  17. $this->error = mysql_error();
  18. return false;
  19. }
  20. } else {
  21. $this->error = mysql_error();
  22. return false;
  23. }
  24. } // eof connect()
  25.  
  26. public function select($sql) {
  27. if ($this->connection) {
  28. mysql_set_charset('utf8', $this->connection);
  29. if (isset($sql) && $sql != '') {
  30. if($result = mysql_query($sql)) {
  31. return $result;
  32. } else {
  33. $this->error = mysql_error();
  34. return false;
  35. }
  36. } else {
  37. $this->error = 'Błąd zapytania SQL';
  38. return false;}
  39. } else {
  40. $this->error = 'Brak połączenia z bazą danych';
  41. return false;}
  42. } // eof select()
  43. public function query($sql){
  44. if (isset($sql) && $sql != '') {
  45. if ($this->connection) {
  46. mysql_set_charset('utf8', $this->connection);
  47. if (mysql_query($sql)){
  48. return true;
  49. } else {
  50. $this->error = mysql_error();
  51. return false;}
  52. } else {
  53. $this->error = 'Brak połączenia z bazą danych';
  54. return false;}
  55. } else {
  56. $this->error = 'Błąd zapytania SQL';
  57. return false;}
  58. } // eof query()
  59. // start dodane przeze mnie ======================================================
  60. public function numrows($sql){
  61. if ($this->connection) {
  62. mysql_set_charset('utf8', $this->connection);
  63. if (isset($sql) && $sql != '') {
  64. if($result = mysql_num_rows($this->select($sql))) {
  65. return $result;
  66. } else {
  67. $this->error = mysql_error();
  68. return false;}
  69. } else {
  70. $this->error = 'Błąd zapytania SQL';
  71. return false;}
  72. } else {
  73. $this->error = 'Brak połączenia z bazą danych';
  74. return false;}
  75. } // eof numrows()
  76.  
  77. public function fetcharray($sql){
  78. if ($this->connection) {
  79. mysql_set_charset('utf8', $this->connection);
  80. if (isset($sql) && $sql != '') {
  81. if($result = mysql_fetch_array($this->select($sql))) {
  82. return $result;
  83. } else {
  84. $this->error = mysql_error();
  85. return false;
  86. }
  87. } else {
  88. $this->error = 'Błąd zapytania SQL';
  89. return false;
  90. }
  91. } else {
  92. $this->error = 'Brak połączenia z bazą danych';
  93. return false;}
  94. } // eof fetcharray()
  95. // koniec - dodane przeze mnie ======================================================
  96. public function close(){
  97. if ($this->connection){
  98. if (mysql_close($this->connection)){
  99. return true;
  100. } else {
  101. $this->error = mysql_error();
  102. return false;}
  103. } else {
  104. $this->error = 'Brak aktywnego połączenia';
  105. return false;}
  106. } // eof close()
  107.  
  108. }


fragment kodu php z index.php (wcześniej inicjuje połączenie $db->connect() i definiuje zmienną $db odnoszącą się do klasy)
  1. $sql = "SELECT wid,czas,podpis FROM tabela WHERE status = '1' ORDER BY 'czas' DESC;";
  2. if ($db->select($sql)){
  3. if ($db->numrows($sql) == 0) {
  4. echo 'brak wyników';
  5. } else {
  6. $wierszy = $db->numrows($sql);
  7. for ($i=0;$i<$wierszy;$i++) {
  8. $dane = $db->fetcharray($sql);
  9. echo $dane['wid'].$dane['czas'].$dane['podpis'];}
  10. }
  11. }


ten fragment pokazuje mi 17 razy jeden wiersz. Znalezionych wierszy jest 17 i to jest prawidłowy wynik, co jest nie tak że tylko jeden wiersz w pętle wrzuca? db
nospor
Do funkcji select() dopisz taki kod:
  1. public function select($sql) {
  2. echo 'ZNOWY WYKONUJĘ ZAPYTANIE OD POCZĄTKU';
  3. //....dalsza cześć funkcji

Zwróć uwagę co dostaniesz na ekranie po wykonaniu tego kodu a może sam się domyślisz co jest nie tak
@rtur
za każdym razem wykonuje się funkcja select w pętli for();

co mam zrobić aby się nie wykonywała?

podejrzewam jakiś błąd w składni funkcji fetcharray.... tylko brak mi pomysłu jak ją zmienić żeby działała
nospor
select() zwraca ci RESOURCE. fetcharray oraz numrows mają korzystac z tego RESOURCE a nie za każdym razem wywoływać select()
@rtur
zmieniłem na takie coś:
  1. public function numrows($sql){
  2.  
  3. if ($this->connection) {
  4. mysql_set_charset('utf8', $this->connection);
  5. if (isset($sql) && $sql != '') {
  6. if ($results = $this->select($sql)){
  7. $rows = mysql_num_rows($results);
  8. return $rows;
  9. }
  10. else {
  11. $this->error = mysql_error();
  12. return false;
  13. }
  14. } else {
  15. $this->error = 'Brak połączenia z bazą danych';
  16. return false;
  17. }
  18. }
  19. } // eof numrows()
  20.  
  21. public function fetcharray($sql){
  22.  
  23. if ($this->connection) {
  24. mysql_set_charset('utf8', $this->connection);
  25. if (isset($sql) && $sql != '') {
  26. if ($results = $this->select($sql)){
  27. $rows = mysql_fetch_array($results);
  28. return $rows;
  29. }
  30. else {
  31. $this->error = mysql_error();
  32. return false;
  33. }
  34. } else {
  35. $this->error = 'Brak połączenia z bazą danych';
  36. return false;
  37. }
  38. }
  39. } // eof fetcharray()


i dalej to samo 17 razy jeden wiersz.

błąd jest w kodzie samej funkcji numrows i fetcharray czy gdzie indziej?
nospor
Przecież ci napisałem w poprzednim poście, że fetcharray i numrows nie mają prawa korzystać z select(). A ty co? A ty nadal w nich korzystasz z select()
@rtur
  1. public function numrows($sql){
  2.  
  3. if ($this->connection) {
  4. mysql_set_charset('utf8', $this->connection);
  5. if (isset($sql) && $sql != '') {
  6. if ($rows = mysql_fetch_array($sql)){
  7. return $rows;
  8. }
  9. else {
  10. $this->error = mysql_error();
  11. return false;
  12. }
  13. } else {
  14. $this->error = 'Brak połączenia z bazą danych';
  15. return false;
  16. }
  17. }
  18. } // eof numrows()
  19.  
  20. public function fetcharray($sql){
  21.  
  22. if ($this->connection) {
  23. mysql_set_charset('utf8', $this->connection);
  24. if (isset($sql) && $sql != '') {
  25. if ($rows = mysql_fetch_array($sql)){
  26. return $rows;
  27. }
  28. else {
  29. $this->error = mysql_error();
  30. return false;
  31. }
  32. } else {
  33. $this->error = 'Brak połączenia z bazą danych';
  34. return false;
  35. }
  36. }
  37. } // eof fetcharray()


coś takiego?

a później w kodzie:

  1. $sql = "SELECT wid,czas,podpis FROM tabela WHERE status = '1' ORDER BY 'czas' DESC;";
  2. if ($db->select($sql)){
  3. if ($db->numrows($sql) == 0) {
  4. echo 'brak wyników';
  5. } else {
  6. $wierszy = $db->numrows($sql);
  7. for ($i=0;$i<$wierszy;$i++) {
  8. $dane = $db->fetcharray($sql);
  9. echo $dane['wid'].$dane['czas'].$dane['podpis'];}
  10. }
  11. }

?
pisane na szybko, nie sprawdzane, bo zaraz zmykam do pracy na 8:00 smile.gif
nospor
Ty nie pisz na szybko tylko mysl.... mówiłem ci że select() coś zwraca. Ty to coś masz przekazać do numrows i fetcharray i na tym czymś masz operować a nie na $sql.
@rtur
dzięki chyba się udało, i wygląda na to że działa, teraz te 2 funkcje wyglądają tak:
  1. public function numrows($sql){
  2. if ($this->connection) {
  3. mysql_set_charset('utf8', $this->connection);
  4. if (isset($sql) && $sql != '') {
  5. if($result = mysql_num_rows($sql)) {
  6. return $result;
  7. } else {
  8. $this->error = mysql_error();
  9. return false;
  10. }
  11. } else {
  12. $this->error = 'Błąd zapytania SQL';
  13. return false;
  14. }
  15. } else {
  16. $this->error = 'Brak połączenia z bazą danych';
  17. return false;
  18. }
  19. } // eof numrows()
  20. public function fetcharray($sql){
  21. if ($this->connection) {
  22. mysql_set_charset('utf8', $this->connection);
  23. if (isset($sql) && $sql != '') {
  24. if($result = mysql_fetch_array($sql)) {
  25. return $result;
  26. } else {
  27. $this->error = mysql_error();
  28. return false;
  29. }
  30. } else {
  31. $this->error = 'Błąd zapytania SQL';
  32. return false;
  33. }
  34. } else {
  35. $this->error = 'Brak połączenia z bazą danych';
  36. return false;
  37. }
  38. } // eof fetcharray()


a kod którym pobieram dane :

  1. $sql = "SELECT wid, czas, tresc, podpis FROM tabela WHERE status = '1' ORDER BY 'czas' DESC;";
  2. if ($results = $db->select($sql))
  3. if ($db->numrows($results) == 0) {
  4. echo 'nie ma żadnych danych';
  5. } else {
  6. $wierszy = $db->numrows($results);
  7. for ($i=0;$i<$wierszy;$i++) {
  8. if($dane = $db->fetcharray($results)){
  9. echo $dane['wid'].$dane['czas'].$dane['podpis'];}
  10. }}


jeszcze tylko nie działa mi jedna funkcja w tym moim programie, ale to w nowym poście napisze smile.gif

@nospor, z całego serca dziękuje za okazaną pomoc, po raz kolejny przekonałem się że dobry z Ciebie nauczyciel, nie poda rozwiązania na tacy a zmusza do myślenia, i oto chodzi.
mat-bi
A to nie lepiej zamykać połączenie w destruktorze?
@rtur
tego jeszcze nie ogarnąłem smile.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.