Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wygodna klasa obslugi mysql
Forum PHP.pl > Forum > Gotowe rozwiązania > Skrypty obsługi baz danych
ergo
co sadzicie o takim podejsciu do biblioteki obslugujacej baze ?
dziala w php4, zawiera raportowanie bledow, posiada mozliwosc wyboru pomiedzy buforowaniem zapytan, potrafi cacheowac zapytania, i ma wsparcie dla transakcji.

chetnie uslysze co jest nie tak oraz co mozna ulepszyc.

przyklad uzycia
  1. <?php
  2. $db = new sqlklasa(DB_HOST,DB_LOGIN,DB_PASS,DB_NAME);
  3.  
  4. if($validator->ok['login'] && $validator->ok['password']){
  5. $db->fetcharray('SELECT * FROM '.DB_PREFIX.'users WHERE login='.$db->sqlquote($input->post('login')).' AND pass='.$db->sqlquote(md5($input->post('password'))));
  6. if(!empty($db->rekordy)){
  7. $_SESSION['user']=$db->rekordy[0];
  8. $db->zapytaj('UPDATE '.DB_PREFIX.'users SET data_ostatniego_logowania='.time().' WHERE id='.$_SESSION['user']['id']);
  9. }
  10. }
  11.  
  12. ?>



  1. <?php
  2. /**
  3.  * Tworzy polaczenie do bazy i zapewnia uniwersalny interfejs zapytan
  4.  * @author ergo
  5.  * @version 1.0
  6.  * @access public
  7.  */
  8. class sqlklasa {
  9. /**
  10.  * nazwa bazy
  11.  *
  12.  * @var integer
  13.  */
  14. var $baza;
  15. /**
  16.  * ilosc wykonanych zapytan
  17.  *
  18.  * @var integer
  19.  */
  20. var $zapytan;
  21. /**
  22.  * wynik wykonania zapytania
  23.  *
  24.  * @var mixed
  25.  */
  26. var $wynik;
  27. /**
  28.  * rekordy zwrocone przez serwer sql
  29.  *
  30.  * @var array
  31.  */
  32. var $rekordy;
  33. /**
  34.  * identyfikator polaczenia sql
  35.  *
  36.  * @var unknown_type
  37.  */
  38. var $link;
  39. /**
  40.  * tablica zawierajaca blednie wykonane zapytania
  41.  *
  42.  * @var array
  43.  */
  44. var $error;
  45. /**
  46.  * tablice zawierajaca dobrze wykonane zapytania
  47.  *
  48.  * @var array
  49.  */
  50. var $sql;
  51. /**
  52.  * buforujemy czy nie
  53.  *
  54.  * @var boolean
  55.  */
  56. var $buffered;
  57. /**
  58.  * postarcza polaczenia z baza danych
  59.  *
  60.  * @param string $host
  61.  * @param string $login
  62.  * @param string $pass
  63.  * @param string $baza
  64.  */
  65. function sqlklasa($host, $login, $pass, $baza) {
  66. $this->link = mysql_connect($host, $login, $pass);
  67. $this->baza = $baza;
  68. $this->buffered = false;
  69. if (!$this->link) {
  70. $this->error[]=mysql_errno($this->link).':'.mysql_error($this->link);
  71. }
  72. $db_selected = mysql_select_db($this->baza, $this->link);
  73. if (!$db_selected) {
  74. $this->error[]=mysql_errno($this->link).':'.mysql_error($this->link);
  75. }
  76. }
  77. /**
  78.  * rozpoczyna transakcje 
  79.  */
  80. function rozpocznij_transakcje(){
  81. $this->zapytaj('SET AUTOCOMMIT = 0');
  82. $this->zapytaj('BEGIN');
  83. }
  84. /**
  85.  * zakoncza transakcje
  86.  */
  87. function zakoncz_transakcje(){
  88. if(!empty($this->error)){
  89. $this->zapytaj('ROLLBACK');
  90. }else{
  91. $this->zapytaj('COMMIT');
  92. }
  93. }
  94. /**
  95.  * wykonuje zapytanie do bazy
  96.  *
  97.  * @param string $zmienna
  98.  */
  99. function zapytaj($zmienna) {
  100. $db_selected = mysql_select_db($this->baza, $this->link);
  101. if (!$db_selected) {
  102. $this->error[]=mysql_errno($this->link).':'.mysql_error($this->link);
  103. }
  104. $this->zapytan++;
  105. $this->rekordy = NULL;
  106. if($this->buffered==false){
  107. $this->wynik = @mysql_unbuffered_query($zmienna, $this->link);
  108. }else{
  109. $this->wynik = @mysql_query($zmienna, $this->link);
  110. }
  111.  
  112. if ($this->wynik === false) {
  113. $this->error[]=mysql_errno($this->link).':'.mysql_error($this->link).' - '.$zmienna;
  114. return false;
  115. }
  116. else{
  117. $this->sql[]=$zmienna;
  118. return $this->wynik;
  119. }
  120. }
  121.  
  122. /**
  123.  * pobiera dane jako tablice
  124.  * @param string $zmienna
  125.  * @param integer $cached [opcja]
  126.  * @param string $gdzie [opcja]
  127.  */
  128. function fetcharray($zmienna,$cached=false,$gdzie=NULL) {
  129. $db_selected = mysql_select_db($this->baza, $this->link);
  130. if (!$db_selected) {
  131. $this->error[]=mysql_errno($this->link).':'.mysql_error($this->link);
  132. }
  133. if(is_integer($cached) && !empty($gdzie) && (@filemtime(KATALOG_CACHE.$gdzie.'.sqlcache')>time()-$cached)) {
  134. $this->rekordy=@unserialize(@file_get_contents(KATALOG_CACHE.$gdzie.'.sqlcache'));
  135. $this->sql[]=$zmienna;
  136. }
  137. else{
  138. $this->rekordy = NULL;
  139. $this->zapytaj($zmienna);
  140. while ($wiersz = @mysql_fetch_array($this->wynik)) {
  141. $this->rekordy[] = $wiersz;
  142. }
  143. if(is_integer($cached) && !empty($gdzie)){
  144. $handle = fopen(KATALOG_CACHE.$gdzie.'.sqlcache', 'wb');
  145. fwrite($handle,serialize($this->rekordy));
  146. fclose($handle);
  147. }
  148. }
  149.  
  150. }
  151. /**
  152.  * zwalnia wynik zapytania z pamieci
  153.  *
  154.  */
  155. function zwolnij() {
  156. @mysql_free_result($this->wynik);
  157. }
  158. /**
  159.  * zamyka polaczenie z baza
  160.  *
  161.  */
  162. function zamknij() {
  163. @mysql_close($this->link);
  164. }
  165. /**
  166.  * zabezpiecza zmienna przed sql injection
  167.  *
  168.  * @param string $zmienna
  169.  * @return string
  170.  */
  171. function sqlquote($zmienna) {
  172. $zmienna = stripslashes($zmienna);
  173. }
  174. if (is_numeric($zmienna) == FALSE) {
  175. $zmienna = "'".mysql_real_escape_string($zmienna)."'";
  176. }
  177. return $zmienna;
  178. }
  179. ?>
Jojo
Ameryki to Ty nie odkryłeś. Jakbyś przeszukał forum, to zobaczyłbyś, że podobna klasa już była tu prezentowana.

Moim zdaniem to co pokazujesz to nic specjalnego...
ergo
Cytat(Jojo @ 7.07.2006, 11:22 ) *
Ameryki to Ty nie odkryłeś. Jakbyś przeszukał forum, to zobaczyłbyś, że podobna klasa już była tu prezentowana.

Moim zdaniem to co pokazujesz to nic specjalnego...

za to ty zbyt konstruktywny nie jestes, to ze nie jest odkrywcze to wiem, ja sie pytam co mozna ulepszyc i rozszerzyc, byle nie kosztem wydajnosci.
siemakuba
w metodzie sqlquote powinieneś jeszcze sprawdzać stan magic_quotes_gpc. Jeżeli będą włączone i przekażesz dane z $_POST np. do mysql_real_escape_string zrobi się kiszka.
  1. <?php
  2. function sqlquote($zmienna)
  3. {
  4. { $zmienna = stripslashes($zmienna);
  5. }
  6.  // ....
  7. }
  8. ?>


pozdr.
ergo
dzieki , juz poprawilem
NuLL
A co kiedy ja musze jednoczesnie operowac na dwoch wynikach dwoch zapytan questionmark.gif
ergo
przyznam sie ze nie mialem takiej sytuacji jeszcze, mozesz podac jakis konkretny przyklad zastosowania? bo nie bardzo widze do czego zmierzasz i jak by to moglo byc uzyte ( wiec zaimplementowane).
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-2024 Invision Power Services, Inc.