Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56

    Come utilizzare le classi con MySQL

    Ciao a tutti, dovrei interfacciare un database MySQL che contiene un'elenco di film con la rispettiva classe 'Film' in PHP.

    Volevo chiedervi se è giusto usare questo modo di programmazione, che certo, funziona, ma non sono sicuro sia il metodo più corretto per vari motivi:

    1 - Esegue una query ogni volta che viene istanziato un oggetto. Se dovessi istanziare 100 oggetti in uno script come faccio a non farlo risultare toppo pesante?

    2 - Il costruttore non può returnare un valore, è forse meglio utilizzare un metodo statico al posto del costruttore?

    3 - E' giusto utilizzare le get e le set in questo modo? Oppure è meglio usare le funzioni magiche?

    Codice PHP:
    class Film {
     
            private 
    $id;
            private 
    $titolo;

            function 
    __construct($id) {
                    
    $result mysql_query("SELECT * FROM films WHERE id=".$id);
                    
    $row mysql_fetch_array($result);
                    
    $this->id $row['id'];
                    
    $this->titolo $row['titolo'];
            }

            public function 
    getId() {
                    return 
    $this->id;
            }
            public function 
    getTitolo() {
                    return 
    $this->titolo;
            }
            public function 
    setId($id) {
                    
    $this->id $id;
            }
            public function 
    setTitolo($titolo) {
                    
    $this->titolo $titolo;
            }
     


  2. #2
    Ti serve una classe FilmRepository che sara l'unica ad eseguire le query e che tornera istanze di Film a questo punto diventate semplici classi ridotte a getter e setter. Cerca repository pattern su google per avere un'idea, dall'ipad non posso mettermi a farti un esempio.
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    Ok, almeno so che esiste una soluzione al problema.
    Però ho provato a cercare su Google e ho trovato solo esempi complessi, e non riesco a capirci nulla, qualcuno può gentilmente farmi un esempio applicato alla mia classe?

  4. #4
    ok:

    Codice PHP:

    class FilmRepository{

     private 
    $mysql;

     public function 
    __construct($mysql_connection){
       
    $this->mysql $mysql_connection;
     }

     public function 
    findAll(){
           
    $films = array();
           
    $res $this->mysql->query("select * from films");

           while(
    $row $res->fetch_assoc()){
                   
    $film = new Film();
                   
    $film->setId($row['id']);
                   
    $film->setTitolo($row['id']);
                   
    $films[] = $film;
           }
           return 
    $films;
     }

     
    //altri utili metodi, come findById, findByTitle, deleteAll,deleteById,etc etc


    uso:

    Codice PHP:

    $mysqli 
    = new mysqli("example.com""user""password""database");

    $repository = new FilmRepository($mysqli);

    var_dump($repository->findAll()); 
    ovviamente la classe Film avrà solo getter e setter
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    Ok grazie, cmq per evitare di creare due classi che si occupano sempre di film, una cosa del genere sarebbe sbagliata?

    Codice PHP:
    class Film 
      
        private 
    $id
        private 
    $title;
        
        function 
    __construct($row) {
            
    $film->setId($row['id']); 
            
    $film->setTitle $row['title'];
        }

        public static function 
    findById($id) {
            
    $result $db->query("SELECT * FROM films WHERE id=".$id); 
            
    $row $result->fetch_array();
            
    $film = new Film($row);
            return 
    $film;
        }
        
        public static function 
    findAll() {
            
    $films = array();
            
    $result $db->query("SELECT * FROM films"); 
            while(
    $row $result->fetch_array())
            {
                
    $film = new Film($row);
                
    $films[] = $film;
            }
            return 
    $films;
        }

        public function 
    getId() {
            return 
    $this->id;
        } 
        public function 
    getTitle() {
            return 
    $this->title;
        } 
        public function 
    setId($id) {
            
    $this->id $id;
        } 
        public function 
    setTitle($title) {
            
    $this->title $title;
        } 
      


  6. #6
    non era "usare due classi che si occupano di film", cmq ora hai cambiato pattern, direi che sei andato in un table data gateway

    2 cosa:

    1) nel construct, invece di ROW usa due argomenti, id e title

    2) ma $db da dove lo dovrebbe prendere?
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    1) potrei anche usare due paramentri di input, ma questa è una classe di esempio, nel mio progetto reale ho anche 30 parametri che dovrei passare al costruttore. E' proprio necessario fare come dici te visto che risulterebbe scomodo?

    2) La connessione al db la faccio nell'index, ho dimenticato di richiamare la variabile globale della connessione in ogni metodo che ne fa uso.

  8. #8
    Originariamente inviato da iJoker
    1) potrei anche usare due paramentri di input, ma questa è una classe di esempio, nel mio progetto reale ho anche 30 parametri che dovrei passare al costruttore. E' proprio necessario fare come dici te visto che risulterebbe scomodo?
    30 parametri?!? o mamma mia... invece di passare dal costruttore mettici un metodo tipo "loadFromRecord" a cui passi la row da parsare... cmq a logica dovresti usare tutti i setter del caso

    Originariamente inviato da iJoker
    2) La connessione al db la faccio nell'index, ho dimenticato di richiamare la variabile globale della connessione in ogni metodo che ne fa uso.
    ANCORA CON STE VARIABILI GLOBALI DEL PIFFERO?!?!?!?!?!?!?!?!?!?!?!?!?!? Ma la smettiamo una buona volta di usare le variabili globali please? Cavolo, stiamo nel 2013, a PHP 5.5 quasi, e ancora programmiamo come se usassimo PHP 0.0.1? Eddai su... devi passare la connessione all'oggetto, TU ESPLICITAMENTE, non fargliela prendere globalmente. Altrimenti è inutile che programmi ad oggetti e puoi tranquillamente tornare al procedurale puro. Il fatto poi che la cosa ti sembri "scomoda o poco conveniente" lascia il tempo che trova... scrivere due righe in più in cambio di una buona programmazione non è nè scomodo nè poco conveniente (e questo vale anche per il punto 1)
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    Rimanendo al discorso della classe con 30 parametri, è una buona idea usare una funzione del genere per istanziare l'oggetto da record?

    Visto che uso i metodi set, che filtrano i dati di input, pensavo di passare dentro questo metodo direttamente $_POST nel caso di un form.

    Codice PHP:
    public static function ByArray($args)
    {
        
    $film = new Film();
        foreach (
    $args as $k => $v)
        {
            
    $method_name 'set'.ucfirst($k);
            if (
    method_exists($news$method_name))
                
    $film->{$method_name}($v);
        }
        return 
    $film;


  10. #10
    diciamo che ci può stare
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

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.