Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> obsługa bazy danych, klasy
bliitz
post
Post #1





Grupa: Zarejestrowani
Postów: 155
Pomógł: 12
Dołączył: 5.04.2008

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


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ć??

Ten post edytował bliitz 5.04.2008, 13:04:21
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
xbitdesigns
post
Post #2





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 24.04.2006
Skąd: Kielce

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


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.

Ten post edytował xbitdesigns 5.04.2008, 17:03:01
Go to the top of the page
+Quote Post
daniel1302
post
Post #3





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


  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
Go to the top of the page
+Quote Post
wlamywacz
post
Post #4





Grupa: Zarejestrowani
Postów: 535
Pomógł: 27
Dołączył: 3.05.2005

Ostrzeżenie: (20%)
X----


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. ?>
Go to the top of the page
+Quote Post
bliitz
post
Post #5





Grupa: Zarejestrowani
Postów: 155
Pomógł: 12
Dołączył: 5.04.2008

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


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

Ten post edytował bliitz 6.04.2008, 11:03:35
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.12.2025 - 12:18