Posiadam klasę:
  1. <?php
  2. /**
  3. * Klasa obsługi bazy danych mysql
  4. *
  5. * @author Michał (Foxbond) Ch. <foxbond at gmail dot com >
  6. * @copyright 2010 Michał Ch.
  7. * @version 0.0.3 PRE-ALPHA
  8. * @access public
  9. * @license All rights reserved! NOT COPY!
  10. * @package *** *****
  11.  
  12. */
  13.  
  14.  
  15. class fox_db {
  16.  
  17. /**
  18. * Dane do połączenia (użytkownik, pass, host, prefix itp.)
  19. *
  20. *
  21. */
  22. private $info = array();
  23. /**
  24. * objekt połączenia (wynik mysql_connect() )
  25. *
  26. *
  27. */
  28. private $_l;
  29. /**
  30. * True/False w zależności czy połączenie jest aktywne
  31. *
  32. *
  33. */
  34. protected $_connected = false;
  35. /**
  36. * Zawiera wynik ostatniego zapytania
  37. *
  38. *
  39. */
  40. public $last_query;
  41.  
  42.  
  43. public function __construct ($pass, $start=true)
  44. {
  45. if(!is_array($pass))
  46. {
  47. throw new fox_db_exception('Dane do połączenia z bazą nie są tablicą!');
  48. }
  49. elseif(!is_bool($start))
  50. {
  51. throw new fox_db_exception('Info startu nie jest Boolean [ten comment trzeba zmienić]');
  52. }
  53.  
  54. $this->info = $pass;
  55. if($start === true) { $this->connect(false); }
  56. }
  57.  
  58.  
  59. public function connect($czyy=false, $set_names=true, $dane)
  60. {
  61. if($czyy === false && is_array($dane)) { $log = $dane; }
  62. else { $log = $this->info; }
  63.  
  64. $link = mysql_connect($log['host'], $log['user'], $log['pass']);
  65. if(!$link) { throw new fox_db_exception('Błąd przy połączeniu z bazą!'); }
  66. if(!mysql_select_db($log['db_name'])) { throw new fox_db_exception('Błąd przy wyborze bazy danych!'); }
  67. if($set_names === true)
  68. {
  69. @mysql_query("SET NAMES latin2", $link);
  70. }
  71.  
  72. $this->_l = $link;
  73. $this->_connected = true;
  74. return $link;
  75. }
  76.  
  77. public function query($query, $table)
  78. {
  79. $query = str_replace('{[table]}', $this->info['prefix'].$table, $query);
  80. $result = mysql_query($query, $this->_l);
  81. if(!$result) { throw new fox_db_exception('Zapytanie nie powiodło się! {{{'.mysql_error().'}}}'); }
  82. $this->last_query = $result;
  83. return $result;
  84. }
  85.  
  86. public function fetch_array($param1=false, $param2=false)
  87. {
  88. if(is_resource($param1)) { $result = mysql_fetch_array($param1); }
  89. elseif ($param1 === false) { $result = mysql_fetch_array($last_query); }
  90. elseif (is_string($param1) && is_string($param2)) { $result = mysql_fetch_array($this->query($param1, $param2)); }
  91. //if(!$result) { throw new fox_db_exception('Zapytanie nie powiodło się! {{{'.mysql_error.'}}}'); }
  92. return $result;
  93. }
  94.  
  95. public function fetch_row($param1=false, $param2=false)
  96. {
  97. if(is_resource($param1)) { $result = mysql_fetch_row($param1); }
  98. elseif ($param1 === false) { $result = mysql_fetch_row($last_query); }
  99. elseif (is_string($param1) && is_string($param2)) { $result = mysql_fetch_row($this->query($param1, $param2)); }
  100. if(!$result) { throw new fox_db_exception('Zapytanie nie powiodło się! {{{'.mysql_error.'}}}'); }
  101. return $result;
  102. }
  103.  
  104. public function fetch_assoc($param1=false, $param2=false)
  105. {
  106. if(is_resource($param1)) { $result = mysql_fetch_assoc($param1); }
  107. elseif ($param1 === false) { $result = mysql_fetch_assoc($last_query); }
  108. elseif (is_string($param1) && is_string($param2)) { $result = mysql_fetch_assoc($this->query($param1, $param2)); }
  109. //if(!$result) { throw new fox_db_exception('Zapytanie nie powiodło się! {{{'.mysql_error.'}}}'); }
  110. return $result;
  111. }
  112.  
  113. /**
  114. * Odpowiednik funkcji mysql_num_rows
  115. *
  116. * @param string|resource|boolean $param1 - Parametr 1
  117. * @param string $param2 - parametr 2
  118. * @return array
  119.  
  120. */
  121. public function num_rows($param1=false, $param2=false)
  122. {
  123. if(is_resource($param1)) { $result = mysql_num_rows($param1); }
  124. elseif ($param1 === false) { $result = mysql_num_rows($last_query); }
  125. elseif (is_string($param1) && is_string($param2)) { $result = mysql_num_rows($this->query($param1, $param2)); }
  126. //if(!$result) { throw new fox_db_exception('Zapytanie nie powiodło się! {{{'.mysql_error.'}}}'); }
  127. return $result;
  128. }
  129.  
  130. /**
  131. * Ta funkcja może sprawiać problemy w zrozumieniu. Całe zapytanie wygląda tak: SELECT COUNT(*) FROM $table WHERE $after_where
  132. *
  133. * @example $db->count_rows('id>0 AND id<300', users);
  134. * @param string $after_where - Co ma być w zapytaniu po where
  135. * @param string $table - Nazwa tabeli na której ma być wykonywana operacja
  136. * @return integer
  137.  
  138. */
  139. public function count_rows($after_where, $table)
  140. {
  141. $query = 'SELECT COUNT(*) FROM {[table]} WHERE ';
  142. $query = str_replace('{[table]}', $this->info['prefix'].$table, $query);
  143. $query .= $after_where;
  144. $result = mysql_query($query, $this->_l);
  145. if(!$result) { throw new fox_db_exception('Zapytanie nie powiodło się! {{{'.mysql_error().'}}}'); }
  146. $result = mysql_fetch_row($result);
  147. //if(!$result) { throw new fox_db_exception('Zapytanie nie powiodło się! {{{'.mysql_error().'}}}'); }
  148. $result = $result[0];
  149. return $result;
  150. }
  151.  
  152. public function is_connected() { return $this->_connected; }
  153.  
  154.  
  155. public function disconnect()
  156. {
  157. if(!mysql_close($this->_l)) { throw new fox_db_exception('Nie można zamknąć połączenia z bazą danych!'); }
  158. $this->_connected = false;
  159. }
  160.  
  161. public function __destruct()
  162. {
  163. if ($this->_connected === true)
  164. {
  165. $this->disconnect();
  166. }
  167.  
  168. }
  169. }
  170.  
  171. class fox_db_exception extends exception {};
  172. ?>


I przykładowy skrypt:
  1. <?php
  2. require_once('core.php');
  3.  
  4. while($p = $db->fetch_assoc("SELECT * FROM {[table]} WHERE id > 0", "tabelka1")
  5. {
  6. echo $p['nazwa'].$p['ile'];
  7. }


Skrypt zapętla się wciąż zwracając pierwszy wynik.
Jednak gdy zrobię tak:
  1. <?php
  2. require_once('core.php');
  3.  
  4. $q = $db->query("SELECT * FROM {[table]} WHERE id > 0", "tabelka1");
  5.  
  6. while($p = $db->fetch_assoc(false))
  7. {
  8. echo $p['nazwa'].$p['ile'];
  9. }

wszystko jest w porządku. Takie rozwiązanie mnie nie zadowala, ponieważ w takim wypadku wygodniej jest dać mysql_query i mysql_fetch_assoc .

Proszę nie zwracać uwagi na literówki, ponieważ piszę to z pamięci, gdyż nie mam laptopa ze skryptami przy sobie.