consigli su classi per connessione e qry

ciao a tutti

prendendo spunto dalle pear e phplist

ho utlimato la prima versione di due classi per la gestione conessione e qry

nulla di completo e performante come quelle  citate si intende :-),

ma un po come tutti gli sviluppatori ho bisogno di sperimentare e fare le cose a modo mio

mi farebbe piacere un vs. sguardo , commenti e critiche

grazie anticipatamente dell'attenzione ;-p

di seguito il codice usato che comprende

- 2 classi

db_connection

db_query extends db_connection

- 1 file di configurazione per la stringa db

- 1 file di esempio di utilizzo

CLASSI

<?

   //CLASS DB_CONNECTION
   /////////////////////
   class db_connection
   {
      //parametri connessione
      var $_parametri_db = array(); 
      var $_host = ""; 
      var $_user = ""; 
      var $_pass = "";
      var $_db = ""; 
      var $_persistente=false; 
      
      //handling
      var $_link_id=0; 

      //errori & messaggi
      var $_err=false;
      var $_msg="";
      
   
      //+ COSTRUTTORE
      function db_connection($parametri_db=array())
      {
         $this->_parametri_db = $parametri_db;
         $this->_setConfig();
         $this->connetti();
      }


      //+ connessione
      function connetti()
      {
         switch ($this->_persistente)
         {
            case false:
               $this->_link_id = @mysql_connect($this->_host,$this->_user,$this->_pass);
               break;
               
            default:
               $this->_link_id = @mysql_pconnect($this->_host,$this->_user,$this->_pass);
               break;
         }
         
         if(!$this->_link_id)
         {
            $this->_setErr();
            $this->_setMsg("Parametri connessione errati!");
         }
         else
         {
            return $this->_link_id;
         }
         
      }
      
      //+ seleziona db
      function select_db($db='')
      {
      
         if($db==""){$db=$this->_db ;}
         
         if (!@mysql_select_db($db,$this->_link_id))
         {
            $this->_setErr();
            $this->_setMsg("Selezione del DB errato!");
         }
      }

         
      //+ disconetti db
      function disconnetti()
      {
         if (!@mysql_close($this->_link_id))
         {
            $this->_setErr();
            $this->_setMsg("Disconnessione al DB errnoata!");
         }
      }

      //+ mostra errore
      function getErr(){return $this->_err;}

      //+ mostra handling
      function getLink(){return $this->_link_id;}

      //+ mostra messaggio
      function getMsg(){return $this->_msg;}



      //- configura parametri
      function _setConfig()
      {
         if (isset($this->_parametri_db["host"])) { $this->_host = $this->_parametri_db["host"]; }
         if (isset($this->_parametri_db["user"])) { $this->_user = $this->_parametri_db["user"]; }
         if (isset($this->_parametri_db["password"])) { $this->_pass = $this->_parametri_db["password"]; }
         if (isset($this->_parametri_db["db"])) { $this->_db = $this->_parametri_db["db"]; }
         if (isset($this->_parametri_db["persistente"])) { $this->_persistente = $this->_parametri_db["persistente"]; }
         
         if (count($this->_parametri_db)<5)
         {
            $this->_setErr();
            $this->_setMsg("Parametri non definiti correttamente!");
         }

         if (!$this->_err)
         {
            if (empty($this->_host))
            {
               $this->_setErr();
               $this->_setMsg("Parametro Host non definito!");
            }
         }
      }

   
      //- setta errore
      function _setErr(){   $this->_err=true;   }


      //- setta messaggio
      function _setMsg($messaggio)
      {
         if ($messaggio!="")
         {
            $this->_msg.=$messaggio."<br />";
         }
         return $this->_msg;
      }
      

   }

?>










<?


   //CLASS DB_QRY
   //////////////
   class db_query extends db_connection
   {

      //handling
      var $_query_id=0;

      //query
      var $_sql = ""; 
      
      //recordset
      var $_res=array();
      var $_num_row=0;

      //flag nostra errori qry
      var $_debug=false;


      //+ query
      function query($sql,$debug=false)
      {
         //$this->_link_id=$link_id;
         $this->_sql=$sql;                  
         $this->_debug=$debug;

         $this->_controllo();
         if(!$this->getErr()){$this->_lancia_qry();}
      }
      
      //+ libera recordset
      function free_result()
      {
         @mysql_free_result($this->_query_id);
         $this->_res=array();
         $this->_query_id=0;
      }
      
      //+ numero record
      function num_rows(){return @mysql_num_rows($this->_query_id);}

      //+ numero campi
      function num_fields(){return @mysql_num_fields($this->_query_id);}

      //+ righe affette
      function affected_rows(){return @mysql_affected_rows();}

      //+ id ultimo inserito
      function insert_id(){return @mysql_insert_id();}


      // + fecth_array
      function fecth_array($num_row=0)
      {
         if($this->_query_id)
         {
            if($n_row=mysql_num_rows($this->_query_id) )
            {
               for($k=0;$k<$n_row;$k++)
               {
                  $this->_res[$k]=@mysql_fetch_array($this->_query_id);
               }
            }
            return $this->_res;
         }
      }

      // + fecth_row
      function fecth_row($num_row=0)
      {
         if($this->_query_id)
         {

            if($n_row=mysql_num_rows($this->_query_id) )
            {
               for($k=0;$k<$n_row;$k++)
               {
                  $this->_res[$k]=@mysql_fetch_row($this->_query_id);
               }
            }
            return $this->_res;
         }
      }


      // + fecth_object
      function fecth_object($num_row=0)
      {
         if($this->_query_id)
         {

            if($n_row=mysql_num_rows($this->_query_id) )
            {
               for($k=0;$k<$n_row;$k++)
               {
                  $this->_res[$k]=@mysql_fetch_object($this->_query_id);
               }
            }
            return $this->_res;
         }
      }





      //- controllo link_id & sql       
      function _controllo()
      {
         if(!$this->_link_id){$this->_setErr();$this->_setMsg("CONNESSIONE NON DEFINITA");}
         if(!$this->_sql){$this->_setErr();$this->_setMsg("SQL VUOTO");}         
      }   
      

      //- lancia qry      
      function _lancia_qry()
      {
         $this->free_result();
         $this->_query_id=@mysql_query($this->_sql,$this->_link_id);
         
         if(@mysql_error())
         {
            $this->_setErr();
            $this->_setMsg("ERRORE QUERY");
            if($this->_debug)
            {
               $this->_setMsg(mysql_error());
               $this->_setMsg(mysql_errno());               
            }
         }

      }


   }
      
      
?>

FILE CONFIG.PHP da dove prendere i dati per la stringa di connessione

<?
   $parametri_db=array();
   $parametri_db["host"]="localhost";
   $parametri_db["user"]="root";
   $parametri_db["password"]="";
   $parametri_db["db"]="mio_db";
   $parametri_db["persistente"]=false;
?>

FILE DI ESEMPIO X L'UTILIZZO

<?php
   require_once "../configure.php";            //configurazione sistema
   require_once DB_FILE_CONFIG;                 //file configurazione db
   require_once CLASS_FILE."dbconnection.php";      //class db
?>

<?
   //var gestione
   $msg="nessun record presente";
   $err=false;
   $record=false;       
   

   ////////////////////////////////////////////////////////////////////


   //connessione
   $conn = new db_query($parametri_db);
   $conn->select_db();
   
   
   if(!$err=$conn->getErr())
   {
      $sql = "SELECT * FROM news ";   
      $qry= $conn->query($sql,true);
      
      if(!$err=$conn->getErr() && $record=$conn->num_rows())
      {
         foreach($conn->fecth_array() as $value)
         {
            $id=$value["id_news"];
            $titolo=$value["titolo"];         
            echo "$id<br>";
            echo "$titolo<br>";         
         }
         $conn->free_result();
      }

      else
      {
         $msg=$conn->getMsg();
      }
   }
   else
   {
      $msg=$conn->getMsg();
   }

   echo $msg;
?>
inviato 8 anni fa
dyd666
X 0 X

db_query extends db_connection

perché extends?

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

nel caso volessi usare le solite funzioni per la gestione del db  non mi porto tutto il codice che non utilizzerei , diciamo un po per retrocompatibilita rispetto alle mie produzioni;-)

ma anche perche in previsione del futuro potrei ampliare il tutto per astrarre connessione e query dal tipo di database quindi mi sembrava piu efficiente avere le due classi separate

tu pensi sarebbe meglio fare tutta una classe?

risposto 8 anni fa
dyd666
X 0 X

Separare le classi è corretto ma renderle una figlia dell'altra mi sembra una forzatura. Nella programmazione ad oggetti l'estensione (extends) va applicata quando tra due classi c'è un rapporto di specializzazione.

Magari è solo una questioni di nomi ma una classe che si chiama query non mi sembra più specifica di una classe che si chiama connection. Mi sembrano due classi distinte, l'una adibita alla connessione con un database, l'atra all'esecuzione delle query.

Se vedi le classi dell'estensione mysqli di PHP noterai che esiste una classe mysqli che rappresenta la connessione tra PHP e MySQL e una classe mysqli_stmt che invece si occupa di eseguire le query.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

si gianni capisco bene la tua perplessita perche sono anche le mie

eheheheh

inizialmente avevo fatto due classi differenti

però entrambi utilizzano gli stessi metodi per settare e mostrare gli errori

specializzando la connection con query  non devo passare l'handling della connessione alla classe db_query

e non duplico i metodi per settare e mostrare gli errori

e quando le utilizzo  non lavoro con due oggetti ma solo con uno

ma devo dare atto come detto da te che query a livello logic non sembra per nulla  specializzazione di db_connection :-)

non so se sono stato chiaro nell'esprimere i miei pensieri:-p

ora alle luce dei fatti io avrei 3 scelte:

- una sola classe come ho visto in phplib

  dove anche se ho bisogno di fare una connessione mi porto il codice per le qry

- 2 classi differenti

corretto da un punto di vista logico poichè ogni classe fa il suo dovere

ma in fase di utilizzo scrivo un po piu di codice

- 3 specializzazione forzata

posso utilizzare solo la connection quando mi occorre , ma anche la db_query senza riportarmi l'handling di connessione ed un po meno codice da scrivere

tu cosa mi consigli ?

risposto 8 anni fa
dyd666
X 0 X

Io sarei o per la soluzione 1 o per la 2, anche se preferisco di gran lunga questa. Ti consiglio di prendere spunto dalle classi dell'estensione mysqli e PDO, e dalla struttura di Zend_DB

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda