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

    [MySqli]Uso in altre classi

    Ciao a tutti,
    vorrei implementare la classe mysqli nel mio sito, dato che sto ancora usando il metodo procedurale, ma ho alcuni problemi a farlo, sopratutto su come utilizzare l'oggetto già instanziato in altre classi.

    - Io dichiaro un nuovo oggetto in un file "head.php", che sarà poi il primo file ad essere incluso in ogni pagina
    Codice PHP:
    $mysqli = new mysqli("dati connessione"); 
    - A questo punto io definisco altre mie classi, nelle quali però ho bisogno di effettuare query al database, tramite la classe mysqli, il punto è che non so come fare. Per esempio se provo a instanziare una classe Utente e richiamare il metodo registraUtente mi da errore per variabile $mysqli non definita:
    Codice PHP:
    lass Utente

        
    /*Attributi utente*/ 
        
       /*Metodo costrutttore*/

        
    public function registraUtente(){ 
             
    /*richiamo l'oggetto instanziato nel file head.php, 
               che viene prima del richiamo dell'isntanza di questa classe e 
               del richiamo a questo metodo*/
             
    $query "INSERT INTO utenti ('id','user','pass') VALUES ('',$this->user,$$this->pass);"
             
    $result =  $mysqli->query($query);
         } 

    Come faccio ad utilizzare i metodi della classe mysqli in altre classi da me definite?
    Devo per forza crearmi una classe "DB" per la connessione che estende su mysqli, e poi estendere ogni classe definita da me che necessità di interazioni con il database su "DB", così da poter accedere ai metodi delle classi genitori?

    Non sono ancora praticissimo di OOP, dunque non mi è chiaro come risolvere questo problema.

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    1,453
    Puoi accederci tramite global, sennò ti crei una classe con metodi statici per gestire mysqli, oppure una classe astratta da estendere ogni volta

  3. #3
    non è necessaria una classe apposita, ma caldamente consigliata epr la manutenzione futura e per la leggibilità. Supponi ad esempio di creare una classe chiamata "database":

    Codice PHP:
      class database {
        public 
    $user;
        public 
    $pass;

        public function 
    openDB() {
          
    $mysqli = new mysqli('localhost' 'user''password''database');
          return 
    $mysqli;
        }

       public function 
    registraUtente($query) {
         
    $mysqli $this->openDB();
         if (
    $mysqli) {
           
    $query "INSERT INTO utenti ('id','user','pass') VALUES ('" $this->user "', '" $this->pass ')"; 
           $result =  $mysqli->query($query);
         } else
              die("Errore nella connessione al database: " . $mysqli->error);
       }
      }

    $db = new database();
    $db->user = '
    Giovanni';
    $db->pass = '
    password';
    $db->registraUtente("INSERT INTO utenti ('
    id','user','pass') VALUES ('" . $db->user . "', '" .$db->pass) . "'); 
    come vedi la classe contiene tutot quello che serve per aprire e registrare un record con poche istruzioni (oltre ad alcuni errori di sintassi che hai fatto nella stringa della query...)

  4. #4
    Grazie mille delle risposte.

    Emulman la classe che hai fatto tu ci avevo anche pensato, ma questo non vorrebbe dire dover fare per forza una di queste due cose?:

    1) Ogniqualvolta ho bisogno di interagire con il database devo creare una funzione all'interno della classe "database". Come soluzione mi pare improbabile da gestire.
    2) Creare un nuovo oggetto mysqli, per ogni classe i cui metodi interagiscono il database. Dunque aprendo e chiudendo la connessione con il database per ogni classe/metodo.

    Cercavo qualcosa di più comodo, del tipo che io definisco l'oggetto della classe mysqli una volta all'inizio della pagina head.php comune a tutto il sito (quindi una connessione al database) e uso lo stesso in ogni classe. Es.

    Codice PHP:
    file:head.php
    <?php 

      
    require_once('include/config.php);

      $mysqli = new mysqli($dbhost,$dbuser,$dbpass,$dbname);

      require_once('
    include/user.class.php); 
      
    /* In questa classe uso liberamente l'oggetto $mysqli 
          richiamando i metodi della classe mysqli con $mysqli->metodo;
      */  
        
       //includo il resto della pagina in base al contenuto richiesto...                                  
    ?>
    In un ipotetico file foot.php poi richiamo il metodo $mysqli->close() per terminare la connessione.

    Posso anche pensare di creare un oggeto mysqli, quindi aprire e chiudere una nuova connessione, in ogni classe che definisco che ne necessiti, ma questo non appesantirebbe il tutto?

    Comunque in poche parole la mia domanda è: come richiamo i metodi di una classe in un altra classe? devo per forza usare l'ereditarietà?

  5. #5
    se tu crei una classe apposita non c'è bisogno di file header, magari solo per includere la classe. Basta includere le funzioni di uso più comune in una classe database; ad esempio definisci le classi database e user ognuno in un file a parte chiamato rispettivamente database.php e user.php:

    Codice PHP:
    // database.php
    class database {
      public function 
    openDB() {
        
    $mysqli = new mysqli('localhost' 'user''password''database');
        return 
    $mysqli;
      }

      public function 
    recordArray($sql) {
        
    //restituisce un array di record
      
    }

      public function 
    findRecord($sql) {
        
    //trova un record
      
    }

      public function 
    closeDB($conn) {
        
    $conn->close();
      }
    }

    class 
    User extends database {
      
    // user.php
      
    public $name;
      public 
    $pass;

      public function 
    registraUtente($query) {
        
    $mysqli $this->openDB();
        if (
    $mysqli) {
          
    $query "INSERT INTO utenti ('id','user','pass') VALUES ('" $this->name "', '" $this->pass "')"
          
    $result =  $mysqli->query($query);
          
    $resultSQL $this->recordArray($result);
          
    $this->close($mysqli);
          return 
    $returnSQL;
         } else
              die(
    "Errore nella connessione al database: " $mysqli->error);
       }

      public function 
    modificaUtente($query) {

      }

      public function 
    cancellaUtente($sql) {

      }
    }

    require_once(
    'include/database.php');
    require_once(
    'include/user.php');
    $user = new user();
    $user->name 'Giovanni';
    $user->pass 'password';
    $user->registraUtente("INSERT INTO utenti ('id','user','pass') VALUES ('" $user->name "', '" $name->pass) . "')"
    come vedi nella classe user.php ho usato user extends database per fare in modo che user possa usare tutte le proprietà e i metodi della classe database come se fossero suoi, come se fossero una unica classe. In tal modo hai il vantaggio di avere due clasis completamente distinte ma facilmente modificabili che interagiscono fra di loro!

  6. #6
    Ok capito, come pensavo, conviene usare l'ereditarietà estendendo la classe.
    Però mi sorge spontanea una domanda: dovè la convenienza? Con il metodo procedurale (mysql_connect, mysql_select_db ecc.) basta aprire una volta la connessione a inizio pagina e una volta a fine pagina, così invece la connessione viene aperta e chiusa n volte in base al numero di query della pagina richiesta. Non nuoce alle prestazioni tutto questo?

    In ogni caso implementerò sicuramente la classe myslqi, dato che immagino tra qualche tempo il metodo procedurale sarà deprecato.

    Grazie mille dell'aiuto!!

  7. #7
    infatti, i metodi procedurali sono ormai morti e sepolti..usa $mysqli adattissimo ad un ambiente ad oggetti! E ricorda che i vantaggi delle classi sono essenzialmente due: 1) riutilizzo in qualsiasi webapp o sito tu voglia; 2) possibilità di modificare i metodi della classe senza toccare il codice principale.
    Per quanto riguarda quel che dici tu nulla vieta di inserire un $mysql = new mysqli() all'interno di qualsiasi function dove tu usi un database, sta solo a te vedere cosa è più conveniente: se dichiarare una classe apposita o no. E non ci sono problemi di velocità, credimi!!!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.