• User

    connessioni al server mysql via OOP

    Ciao a tutti

    sto tentando (INUTILMENTE) di applicare la programmazione ad oggetti per fare la connessione al server mysql
    Avevo trovato una classe che mi pareva facilissima da implementare invece mi sono impantanato.
    La classe è:
    <?php
    class Database {

    var $conn = NULL;

    function Database($host, $user, $pass, $dbname){
    $this->conn = mysql_connect($host, $user, $pass)
    or die("ERRORE MYSQL: ".mysql_error());
    mysql_select_db($dbname, $this->conn)
    or die("ERRORE MYSQL: impossibile connettersi al database");
    }

    function ExecuteQuery($query){
    return mysql_query($query, $this->conn)
    or die("ERRORE MYSQL: ".mysql_error());
    }

    function FetchResult($result){
    $data = array();
    while($tmp = mysql_fetch_assoc($result))
    $data[] = $tmp;
    return $data;
    }

    function Close(){
    mysql_close($this->conn);
    }
    }
    ?>

    lavora mi sembra bene nella creazione del nuovo oggetto di connessione quindi mi pare che apra la connessione ma poi non riesco a far lavorare le altre funzioni ExecuteQuery e FetchResult

    Forse voi mi potreste dare una mano ad impolementare meglio questa classe oppure mi potreste indicaste una classe impostata in maniera differente con cui io possa iniziare a capire qualche cosa.
    La devo applicare su di una rubrica per la ricerca di nomi in base a criteri di ricerca multipli con dati inseriti dall'utente in campi input come la ricerca avanzata di google.
    Senza la OOp va tutto quasi bene (poi vi dico cosa intendo per quasi bene in un prossimo 3d)

    Per ora vi sare molto grato per una mano

    Grazie a tutti


  • User Attivo

    a parte
    while($tmp = mysql_fetch_assoc($result)) senza la {
    cosi
    while($tmp = mysql_fetch_assoc($result)){
    potresti iniziare ad inserire alcune variabili nella classe come
    class Database {

    var $conn = NULL;
    public $data

    $this->data = array();
    while($tmp = mysql_fetch_assoc($result))
      $data[] = $tmp;
    

    e poi

    $database = new database();
    $database->fetchresult($xxx);
    $row=$database->fetchresult->data


  • ModSenior

    Ciao Pablito

    ci sono già ottimi framework completamente OOP anche in PHP.

    Alcuni si basano sulla modello dell'active record e a me non piacciono molto soprattutto perchè quando il modello di dati è complesso, le query con diversi Join non riesci a farle facilmente. Sono quei modelli utilizzati da framework tipo il CakePHP e simili.

    Se vuoi provare qualcosa di davvero ben modellato e modellabile ti suggerisco di guardare un ORM come Propel (lo trovi qui propel.phpdb.org). Fatto bene perchè "clonato", come logica e come configurazione da Hibernate (in Java). Funziona molto bene anche se può inizialmente apparire complesso e richiedere un pò di studio per la configurazione e la comprensione del funzionamento.


  • User Attivo

    Un regalo alla comunità, vi dono questa mia classe creata tempo fa.
    se ne volete una uguale per altri db ditemelo 😉

    $db = new mysql($hostname, $username, $password, $database);//si connette al db, aggiungere un true alla fine per connessione persistente
    $db->query('query');//effettua una query
    $db->query_array('query');//effettua una query e ritorna un array (mysql_fetch_array), aggiungere un true per mettere in cache il risultato(sconsigliato)
    $db->query_list('query'); //effettua una query e ritorna una lista di array, aggiungere un true per mettere in cache il risultato(sconsigliato)

    
    <?php
    /**
     * Driver MySQL for database transaction
     *
     * @package Dev-Site
     * @author Gonçalo Margalho <[email protected]>
     * @copyright Dev-House.Com (C) 2006-2008
     * @license h tt p:// w ww.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License
     * @version 1.0
     */
     
    define( 'SQL_CACHE_DIRECTORY', './cache/sql' );
    
    global $nquery, $ncached_query, $sql_debug;
    $nquery = 0;
    $sql_debug = true;
    
    class mysql{
    
        /**
         * meter of functions
         *
         * @var integer
         */
        private $sql_function_level = 0;
    
        /**
         * Make a connection with the database
         *
         * @param string $hostname Server SQL
         * @param string $username Name of User SQL
         * @param string $password Password of User SQL
         * @param string $database Name of Database SQL
         * @return boolean
         */
        public function __construct( $hostname, $username, $password, $database, $persistent = false ){
            if($persistent == true){
                $this->db_link = mysql_pconnect( $hostname, $username, $password ) or die( mysql_error() );
                return mysql_select_db( $database ) or die ( mysql_error() );
            }
            else{
                $this->db_link = mysql_connect( $hostname, $username, $password ) or die( mysql_error() );
                return mysql_select_db( $database ) or die ( mysql_error() );
            }
        }
        
        /**
         * Make a query
         * 
         * @param string $query Query to make
         * @return mixed|trigger_error
         */
        public function query( $query ){
            global $nquery, $sql_debug;
            $this->sql_function_level++;
            $nquery++;
            if( $this->result = mysql_query( $query ) ){
                   $this->sql_function_level = 0;
                return $this->result;
            }
            elseif( $sql_debug AND $debug_array = debug_backtrace() )
                echo $this->trace_error( $query );
            $this->sql_function_level = 0;
        }
        
        /**
         * Make a query and return an array, example: array( 'name of  field 1' => 'value of field 1', 'name of  field 2' => 'value of field 2' ... 'name of  field n' => 'value of field n' )
         *
         * @param string $query Query to Make
         * @return array
         */
        public function query_array( $query, $cache = FALSE ){
    
            if( $cache AND file_exists( $file_cache = ( SQL_CACHE_DIRECTORY . "/sql_" . ( $hash = md5( $query ) ) . ".php" ) ) ){
                include_once( $file_cache );
                return $GLOBALS[ 'sql_' . $hash ];
            }
    
            $this->sql_function_level++;
            if( $result = $this->query( $query ) ){
                $query_array = mysql_fetch_array( $result, MYSQL_ASSOC);
    
                if( $cache ){
                    $fp = fopen ( $file_cache, 'w' );
                    fwrite( $fp, $query_array_string = "<?php" . "\n" . "\$GLOBALS['sql_" . $hash . "'] = " . var_export( $query_array, TRUE ) . ";" . "\n?>", strlen( $query_array_string ) );
                    fclose( $fp );
                    $GLOBALS[ 'ncached_query' ]++;
                }
                return $query_array;
            }
        }
        
        /**
         * Make a query and return an array list, example: array( array row 1, array row 2 ... array row n )
         * Use this function for get n rows, n>1
         *
         * @param string $query Query to Make
         * @return array
         */
        public function query_list( $query, $cache = FALSE ){
    
            if( $cache AND file_exists( $file_cache = ( SQL_CACHE_DIRECTORY . "/sql_" . ( $hash = md5( $query ) ) . ".php" ) ) ){
                include_once( $file_cache );
                return $GLOBALS[ 'sql_' . $hash ];
            }
    
            $this->sql_function_level++;
            if( $result = $this->query( $query ) ){
                $query_list = array( );
                while( $row = mysql_fetch_array( $result, MYSQL_ASSOC ) )
                    $query_list[ ] = $row;
    
                if( $cache ){
                    $fp = fopen ( $file_cache, 'w' );
                    fwrite( $fp, $query_array_string = "<?php" . "\n" . "\$GLOBALS['sql_" . $hash . "'] = " . var_export( $query_list, TRUE ) . ";" . "\n?>", strlen( $query_array_string ) );
                    fclose( $fp );
                    $GLOBALS[ 'ncached_query' ]++;
                }
                return $query_list;
            }
        }
        
        /**
         * Make a query and return a number of rows
         *
         * @param string $query Query to Make
         * @return integer
         */
        public function query_count( $query ){
            $this->sql_function_level++;
            return mysql_num_rows( mysql_query( $query ) );
        }
        
        /**
         * Return the number of Queries
         *
         * @return integer
         */
        public function nQuery( ){
            return $GLOBALS[ 'nquery' ];
        }
    
        /**
         * Return the number of Cached queries
         *
         * @return integer
         */
        public function nCachedQuery( ){
            return $GLOBALS[ 'ncached_query' ];
        }
    
        /**
         * If the parameter is set delete the cache of the query, else is null delete all cache
         *
         * @param string $query Query to remove from cache
         */
        public function delete_cache( $query = null ){
            if( $query )
                unlink( SQL_CACHE_DIRECTORY . "/sql_" . ( $hash = md5( $query ) ) . ".php" );
            else if( $cache_files = glob( SQL_CACHE_DIRECTORY . "/*.php" ) )
                foreach( $cache_files as $file_name )
                    unlink( $file_name );
        }
        
        /**
         * Close the connection with the database
         * 
         * @return boolean
         */
        public function disconnect( ){
            return mysql_close( $this->db_link );
        }
    
        
        /**
         * This function make a div with the error
         *
         * @param string $query Query who are the error.
         * @return string
         */
        private function trace_error( $query ){
            $sql_error = mysql_error();
            $debug_array = debug_backtrace();
    
            $error_html = "\n" .
                  "<div style=\"background-color:#f8f8ff; border: 1px solid #aaaaff; padding:10px;\">" . "\n" .
                 "<font size=\"-1\">error: </font><font color=red>{$sql_error}</font><br>" . "\n" .
                 "<font size=\"-1\">query: </font><i>{$query}</i><br><br>" . "\n" .
                 "<font size=\"-1\">backtrace: </font><br>" . "\n" .
                 "    <div style=\"background-color:#ffffff; border: 1px dotted #9999ee; padding: 10px;\">" . "\n";
                 
            for( $i = $this->sql_function_level; $i < count( $debug_array ); $i++ ){
                $error_html .= "<font size=\"-1\">file: </font>" . str_replace( $_SERVER[ 'DOCUMENT_ROOT' ], "", $debug_array[ $i ][ 'file' ] ) . "<br>" . "\n";
                if( isset( $debug_array[ $i ][ 'function' ] ) )
                    $error_html .= "<font size=\"-1\">function: </font>{$debug_array[ $i ][ 'function' ]}<br>" . "\n";
                $error_html .= "<font size=\"-1\">line:</font> {$debug_array[ $i ][ 'line' ]}<br><br>" . "\n";
            }
            $error_html .= "</div></div><br>" . "\n";
            return $error_html;
        }
    }
    ?>
    
    

  • User

    @Skyline said:

    Un regalo alla comunità, vi dono questa mia classe creata tempo fa.
    se ne volete una uguale per altri db ditemelo

    Ciao e grazie
    l'ho provata subito e devo francamente dire che è l'unica classe fra quelle provate che NON mi ha dato problemi e che si è messa al lavoro subito senza errori.
    :sun:
    Adesso però chiedo un ulteriore spiegazione.
    Vorrei usare la tua classe per un select(per adesso semplice) su di un mio database molto vasto di analisi chimiche per la ricerca di uno specifico tipo di analisi.
    Accade spesso che il numero di analisi ritornato dalla query sia DI VARIE CENTINAIA di analisi che io desidero mostrare a video in ragione di 15 alla volta con sotto il menù di navigazione tra le varie pagine che contengono le 15 analisi
    Come mi consigli di implementare questo procedimento data l'ottima flessibilità della tua classe?
    Ho trovato alcune classi per fare oggetti di menù per rendere dinamico il menù di visualizzazione delle pagine contenenti le 15 analisi per pagina ma forse mi puoi consiglire qualche cosa di meglio.

    Grazie in anticipo


  • User Attivo

    umm vuoi fare un sistema a pagine? mostrarne 15 per pagina? dimmi se è giusto...


  • User

    @Skyline said:

    umm vuoi fare un sistema a pagine? mostrarne 15 per pagina? dimmi se è giusto...

    Si