Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: obsługa bazy danych
Forum PHP.pl > Forum > PHP
bliitz
Witam

tworze sobie klasy do obsługi bazy i walidacji danych.

plik z klasa bazy
dbFns.php

Kod
<?php

     require_once('config.php');
    
     class Database {
        
         protected $hConn;
        
         public function __construct() {
            
             $this->hConn = mysql_connect(Db_host, Db_user, Db_password, Db_database)
             if(!$this->hConn) {
                 throw new Exception("Nie można połączyć się z bazą.");
             }
         }
        
         public function __destruct() {
            
             if($this->hConn) {
                 print ('widze w destruktorze');
                 mysql_close($this->hConn);
             }
         }
        
         public function select($sql) {
            
             $sql = mysql_real_escape_string($sql);
             $hRes = mysql_query($sql, $this->hConn) or die('brak polaczenia w dbfns');
             while($odp = mysql_fetch_array($hRes)) {
             print $odp['email'];
             }
         }
     }

?>


plik z funkcjami do walidacji danych:

Kod
<?php
     require 'dbFns.php';
    
     class ValidateData extends Database {
    
      function safe_output($string) {
        
         $string = trim($string);
         $string = strip_tags($string);
         $string = htmlspecialchars($string);
        
         return $string;
     }
    
     function validateUserName($value) {
         $value = $this->safe_output($value);
         if($value == null) {
             return 0;
         }
         $query = parent::select("SELECT * FROM users WHERE username = '$value'");
     }            
}    
?>


i wywołanie funkcji w pliku sign.php w postaci:
Kod
   <?php
      if(isset($_POST['signup'])) {
      $validate = new ValidateData();
      $validate->validateUserName($_POST['login_sign']);
     }
?>


Problem polega na tym że połączenie z bazą jest zamykane przed wywołaniem funckji validateUserName(), tzn. pojawia się komunikat z
Kod
$hRes = mysql_query($sql, $this->hConn) or die('brak polaczenia w dbfns');
tej linijki kodu że brak połączenia w dbnfs, oraz komunikat
Kod
print('widze w destruktorze');
czyli wywoływany jest od razu destruktor według mnie.

Czy ktoś może pomóc rozwiązać ten problem bo nie wiem czy funkcja select jest w złym miejscu czy uchwyt połączenia trzeba jakoś inaczej przekazać??
xbitdesigns
przenies destruktor do klasy validate albo nadpisz go:

final public function __destruct() //(nie testowalem ale chyba tak powinno byc ok)
{
parent::__destruct();
}

powinno pomoc, bo w tym momencie na dobra sprawe nie tworzysz instancji obiektu Database tylko go rozszerzasz, a metoda destruct nie dziala na dziecko.

Po polsku, Database nie istnieje, aczkolwiek uzycza pol i metod klasie ktora go rozszerza.

Tak samo jest z magicznym getem- mozesz miec ustawione w klasie parent (rozszerzajacej) zmienna "dupa" a chcac zrobic:

echo $child->dupa;

metoda __get klasy dziecka sie odpali.
daniel1302
  1. <?php
  2. public function select($sql) {
  3.  
  4.  $sql = mysql_real_escape_string($sql);
  5.  $hRes = mysql_query($sql, $this->hConn) or die('brak polaczenia w dbfns');
  6.  while($odp = mysql_fetch_array($hRes)) {
  7.  print $odp['email'];
  8.  }
  9. ?>

A co z pętlą
Gdy będziesz chciał odpalić nastapi zapętlenie i będzie cały czas wyświetlany taki sam wynik
wlamywacz
O nieeee po co ta pętla i ten printf w select ?
Moja pseudo klasa która mi ładnie służy:
  1. <?php
  2. class db {
  3.  
  4. static $query_result;
  5.  
  6. function __destruct() {
  7. }
  8.  
  9. function connect($host, $user, $pass, $name) {
  10. header("Content-Type: text/html; charset=UTF-8");
  11. $this->connect = mysql_connect($host, $user, $pass);
  12. if(!$this->connect) {
  13. return false;
  14. }
  15. }
  16.  
  17. function query($db_query) {
  18. self::$query_result = mysql_query($db_query);
  19. if(self::$query_result) {
  20. return true;
  21. }
  22. }
  23.  
  24. function mysql_fetch_assoc() {
  25. while($row = mysql_fetch_assoc(self::$query_result)) 
  26. { $dane[] = $row; }
  27. return $dane;
  28. }
  29.  
  30. function mysql_num_rows() {
  31. return mysql_num_rows(self::$query_result);
  32. }
  33.  
  34. function mysql_fetch_array() {
  35. return mysql_fetch_array(self::$query_result);
  36. }
  37.  
  38. function new_trans() {
  39. mysqli_autocommit($this->connect, FALSE);
  40. }
  41.  
  42. function commit() {
  43. @mysql_query("COMMIT");
  44. }
  45.  
  46. function rollback() {
  47. @mysql_query("ROLLBACK");
  48. }
  49.  
  50. function begin() {
  51. @mysql_query("BEGIN");
  52. }
  53. }
  54. ?>
bliitz
Cytat(daniel1302 @ 6.04.2008, 09:49:46 ) *
  1. <?php
  2. public function select($sql) {
  3.  
  4.  $sql = mysql_real_escape_string($sql);
  5.  $hRes = mysql_query($sql, $this->hConn) or die('brak polaczenia w dbfns');
  6.  while($odp = mysql_fetch_array($hRes)) {
  7.  print $odp['email'];
  8.  }
  9. ?>

A co z pętlą
Gdy będziesz chciał odpalić nastapi zapętlenie i będzie cały czas wyświetlany taki sam wynik


ta pętla to tak tylko do testów wstawiona żeby sprawdzić czy zwraca rezultaty jakieś zapytanie
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.