Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Interazione con mysql con oop

    Salve a tutti, ho inziato a fare un piccolo script per compiere le operazioni più comuni su database (mysql) in oop, ho iniziato da poco e ho qualche dubbio qua segue il codice:

    la classe:

    <?php
    class mysql{
    private $user = 'nomeutente';
    private $password = 'password';
    private $host = 'localhost';

    public function open(){
    $this->connessione = @mysql_connect($this->host,$this->user,$this->password);
    $this->customError = "ERRORE: Non è possibile collegarsi al database per il seguente motivo: ". mysql_error()."";
    if($this->connessione){return $this->connessione;}else{echo $this->customError;}
    }

    public function close(){
    $this->closeConnection = mysql_close($this->connessione);
    return $this->closeConnection;
    }

    public function db($database){
    $this->database = $database;
    $this->selectDB = mysql_select_db($this->database, $this->connessione);
    return $this->selectDB;
    }

    public function select($tabella){
    $this->tabella = $tabella;
    $this->result = mysql_query("SELECT * FROM ".$this->tabella);
    eval("\$result = \"$this->result\";");
    while($row = mysql_fetch_array($this->result)){echo $row['titolo']." - ".$row['testo']."
    ";}
    }
    }
    ?>

    il file php per estrarre i contenuti:

    <?php
    require "connect.php";
    $connect = new mysql;
    $connect->open();
    $connect->db("contenuti");
    $connect->select("articoli");
    $connect->close();
    ?>

    Funziona ma volevo chiedere un paio di cose:

    è corretto un tale utilizzo di eval nella funzione select?
    il ciclo while nella funzione select potrebbe essere migliorato secondo voi?
    utilizzare return nelle prime tre funzioni mi sembra brutale ma non sono riuscito a far di meglio conoscete alternative?

    Ringrazio sin da ora per le risposte!

  2. #2

    Re: Interazione con mysql con oop

    Originariamente inviato da Mauro84
    è corretto un tale utilizzo di eval nella funzione select?
    No. L'utilizzo di eval() dovrebbe essere limitato il più possibile, oltretutto la tua chiamata ad eval() è totalmente inutile.

    Originariamente inviato da Mauro84
    il ciclo while nella funzione select potrebbe essere migliorato secondo voi?
    Il modo in cui hai implementato la gestione degli errori va migliorato. Es. non verifichi il valore restituito da mysql_query().

    Inoltre una classe per la manipolazione del DB non dovrebbe in linea teorica inviare dei dati in output, dovrebbe restituirli come valore di ritorno del metodo, etc.

    Originariamente inviato da Mauro84
    utilizzare return nelle prime tre funzioni mi sembra brutale ma non sono riuscito a far di meglio conoscete alternative?
    Aumenta l'astrazione: non restituire semplicemente il valore di ritorno delle funzioni mysq_*, restituisci true o false, etc. etc.

  3. #3
    Hai assolutamente ragione.
    Per eval() cerco di eliminarlo.
    mysql_query() non l'ho proprio considerato =_="

    Per ritornare i valori come output devo lavorarci un po', non ho idea di come fare idem per restituire un valore booleano dalle mysql_* e far funzionare il tutto...sto cercando di capirci qualcosa sulle classi perchè sono molto comode, i tutorial mi aiutano a capire come funziona ma sono anni luce dal fare del codice decente...grazie davvero per l'aiuto!

  4. #4
    Ho fatto qualche modifica adesso riporto true per le varie funzioni, ho tollto l'eval però non sono sicurissimo che il while fatto così fosse quello che intendevi... copio il codice:

    <?php
    class mysql{
    private $user = 'username';
    private $password = 'password';
    private $host = 'localhost';

    public function open(){
    $this->connessione = @mysql_connect($this->host,$this->user,$this->password);
    $this->customError = "ERRORE: Non è possibile collegarsi al database per il seguente motivo: ". mysql_error()."";
    if($this->connessione){return true;}else{echo $this->customError;}
    }

    public function close(){
    $this->closeConnection = mysql_close($this->connessione);
    return true;
    }

    public function db($database){
    $this->database = $database;
    $this->selectDB = mysql_select_db($this->database, $this->connessione);
    return true;
    }

    public function select($tabella){
    $this->tabella = $tabella;
    $this->result = mysql_query("SELECT * FROM ".$this->tabella);
    while($this->elementi = mysql_fetch_array($this->result)){
    $this->titolo = $this->elementi['titolo'];
    $this->testo = $this->elementi['testo'];
    echo "INIZIO CICLO WHILE
    ";
    echo $this->titolo."
    ";
    echo $this->testo."
    ";
    echo "FINE CICLO WHILE

    ";
    }
    return true;
    }
    }
    ?>

    :master:

  5. #5
    private $user = 'username'; private $password = 'password'; private $host = 'localhost';
    mettili come parametri al costruttore così
    la puoi utilizzare + volte (invece di private metti protected)


    Codice PHP:
    public function select($tabella){
    $this->tabella $tabella;
    $this->result mysql_query("SELECT * FROM ".$this->tabella);
    while(
    $this->elementi mysql_fetch_array($this->result)){
    $this->titolo $this->elementi['titolo'];
    $this->testo $this->elementi['testo'];
    echo 
    "INIZIO CICLO WHILE
    "
    ;
    echo 
    $this->titolo."
    "
    ;
    echo 
    $this->testo."
    "
    ;
    echo 
    "FINE CICLO WHILE

    "
    ;
    }
    return 
    true;

    e se ti resttuisce + di un valore ?

    fai ritornare un array (le classi devono astrarre)






    PS
    Usa il BB code per il codice
    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  6. #6
    Codice PHP:
    public function open(){
    $this->connessione = @mysql_connect($this->host,$this->user,$this->password);
    $this->customError "ERRORE: Non è possibile collegarsi al database per il seguente motivo: [b]"mysql_error()."[/b]";
    if(
    $this->connessione){return true;}else{echo $this->customError;} 

    qui è questione di gusti
    preferisco terminare lo script

    lo vedo adesso l'echo che ci incastra ?

    PS
    ma PP indentare il codice ti fà proprio così schifo

    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  7. #7
    Arieccomi ho fatto un po' di prove, ho escluso l'echo dalla mia vita e adesso gestisco l'errore con un comodissimo die, ho fatto una cosa orribile? spero di no.

    ho anche riarrangiato l'estrazione e ora la funzione mi butta fuori degli array che poi riciclo e tiro fuori...è corretto? non lo so... così ho due cicli invece di uno quindi non ne sono convintissimo...

    ultima cosa ma il return true è sempre indispensabile? ho visto che omettendolo mi restitutisce comunque il valore della funzione ma non vorrei affidarmi troppo alla libertà che mi lascia php...

    vi posto il codice, grazie in anticipo per i preziosissimi consigli!

    Codice PHP:
    <?php
    class mysql{
    /*dati per accederre al database*/
    protected $user 'username';
    protected 
    $password 'password';
    protected 
    $host 'localhost';
    /*fine dati per accederre al database*/

        /*connessione a mysql*/
        
    public function open(){
            
    $this->connessione = @mysql_connect($this->host,$this->user,$this->password);
            
    /*gestione errore*/
            
    $this->errorConnection "ERRORE: Non è possibile collegarsi al database per il seguente motivo: [b]"mysql_error()."[/b]";
                if(!
    $this->connessione){
                    die(
    $this->errorConnection);    
                }
            
    /*fine gestione errore*/
            
    return true;
        }
        
    /*chiusura connessione a mysql*/
        
    public function close(){
            
    $this->closeConnection mysql_close($this->connessione);
            return 
    true;
        }
        
    /*selezione connessione al db*/
        
    public function db($database){
            
    $this->database $database;
            
    $this->selectDB mysql_select_db($this->database$this->connessione);
            return 
    true;
        }
        
    /*estrazione dati da db*/
        
    public function select($tabella){
            
    $this->tabella $tabella;
            
    $this->result = @mysql_query("SELECT * FROM ".$this->tabella);
            
    /*gestione errore*/
            
    $this->errorQuery "ERRORE: La tabella cercata non esiste:[b]"mysql_error()."[/b]";
                if(!
    $this->result){
                    die(
    $this->errorQuery);    
                }
                
    /*fine gestione errore*/
            
    $this->testo = array();
            
    $this->titolo = array();
                while(
    $this->elementi mysql_fetch_array($this->result)){
                    
    $this->testo[] = $this->elementi['testo'];
                    
    $this->titolo[] = $this->elementi['titolo'];
                }
            return 
    true;
        }    
    }
    ?>
    p.s. sorry prima ho fatto un copia e incolla veloce e ho perso la formattazione del testo

  8. #8
    Intendevo una cosa del genere
    Codice PHP:
     public function select($tabella){ 
        
    $this->tabella $tabella
         
    $this->result = @mysql_query("SELECT * FROM ".$this->tabella); 
          
    /*gestione errore*/ 
          
    $this->errorQuery "ERRORE: La tabella cercata non esiste:[b]"mysql_error()."[/b]"
           if(!
    $this->result){ 
               die(
    $this->errorQuery);     
         } 
         
    /*fine gestione errore*/ 
         
    $rows= array();
         while(
    $this->elementi mysql_fetch_array($this->result)){ 
             
    $rows[] = $this->elementi
         } 
        if(
    count($rows)==0){
            return 
    null;
        }
            return 
    $rows


    Be i return true servono se
    c'è il corrispettivo false
    o altro cioè ti devono
    dare la possibilità di
    fare un controllo + a valle.

    Aumenta l'astrazione: non restituire semplicemente il valore di ritorno delle funzioni mysq_*, restituisci true o false, etc. etc.
    Segui il consiglio che ti è stato dato da filippo.toso

    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  9. #9
    Capito... grazie mille, per il momento stavo facendo qualche prova, sul discorso dell'astrazione penso sia più applicabile al contesto, nel senso questa classe dovrebbe gestire solo la connessione a sql poi dovrei farmi un altre classe articoli dove faccio la select degli articoli, li aggiorno e li elimino, una classe per utenti con i vari metodi per eliminare, modificare selezionare... ho capito come usare return dal tuo esempio, faccio qualche prova per vedere se ho capito, grazie davvero!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.