Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Php5 - Oop

  1. #1

    Php5 - Oop

    Buongiorno a tutti,
    sto sviluppando un progetto in stile OOP per avvicinarmi a questo concetto di programmazione e grazie alla vasta gamma di notizie in rete (anche se molte ripetute a non finire) mi riesce tutto abbastanza semplice, però ci sono alcuni concetti che mi sfuggono e quindi vorrei esporli qui di seguito:

    Ho creato una classe astratta per una connessione tramite mysqli, e poi con classi derivate inserisco i dati per i vari utenti del db mysql poichè ne ho vari (per aumentare la sicurezza) ed ognuno di questi ha privilegi diversi e limitati. Nella classe ho incluso come metodi :

    Codice PHP:
    //...    
    public function connection() {
            
    $this->getUser();
            
    $this->getPassword();
            
    $this->getHost();
            
    $this->getDb();
            new 
    mysqli($this->getHost(), $this->getUser(), $this->getPassword(), $this->getDb());
            if (
    mysqli_connect_errno()) {
                
    printf("Connessione al database fallita.");
                exit();
            }
        }
        public function 
    disconnection() {
            
    mysqli_close();
        } 
    ma mi sorge un dubbio, dovendo fare la query al db, supponendo che una volta richiamata la classe ed averla assegnata ad una variabile di nome $db, dovrei fare $db->query (almeno cosi faccio quando programmo ibrido tra oop e procedurale) però questa volta non ho mysqli impostato a $db:

    Codice PHP:
    $db= new mysqli(...);
    $db->query('...'); 
    ma ho una classe che richiama la connessione, e quindi per impostare la query devo forse includere nella classe un metodo cosi ?
    Codice PHP:
    public function query($query) {
            
    mysqli_query($query);
        } 
    o funzionerebbe comunque la query?

    altrimenti come dovrei fare?
    E per concludere con questo quesito, questo metodo sarebbe sicuro, oppure rischio una manipolazione della flusso e senza controlli di sorta(non è questo un campo di imput ma una query di lettura da codice ma è bene sapere eventuali problemi) nella stessa classe?
    Di solito i controlli li applico subito quando ricevo i dati alle variabili con htmlentities e/o addslashes.
    es.
    Codice PHP:
    // usando la forma abbreviata di controllo se vero o falso
    $var= if(isset($_GET['var'])) ? htmlentities($_GET['var']) : null
    Poi passando ad un'altro quesito (ne approfitto per esporre ora tutti i miei problemi):
    avendo scritto una classe per l'inclusione delle template e la sostituzione dei 'placeholder' per i contenuti dinamici, quando costruisco la classe dichiaro : __construct($template) che viene richiamato con : new template(URI); e sempre nella costruzione imposto una variabile che contiene il codice del template ($code), tutto ciò tramite file_get_contents.
    Al termine per liberare la memoria distruggo la classe e nella distruzione metto anche : unset($code); per liberare la variabile che ormai ha già, tramite altra funzione, restituito il codice modificato tramite foreach. Il quesito è... nel metodo __destruct() devo mettere __destruct($template) o basta __destruct() per eliminare anche quella variabile che è stata immessa nella costruzione?(appunto $template)
    per facilitarvi la comprensione posto di seguito il codice:
    Codice PHP:
    <?php
    class addTemplate {
        var 
    $code;
        function 
    __construct($template) {
            
    $this->codefile_get_contents($template);
        }
        public function 
    replaceTag($replacers){
            foreach(
    $replacers as $key => $value){
                
    $this->codestr_replace("<!".$key."!>"$value$this->code);
            }
        }
        public function 
    getTemplate() {
            return 
    $this->code;
        }
        function 
    __destruct(){
            unset(
    $this->code);
        }

    }
    ?>

    Quindi concludendo con due semplici domande (perdonatemi lo stress :-( ):
    -quando dichiaro una classe ereditaria devo includere prima di aprire la classe, semplicemente (tramite require_once o altro metodo) la classe madre, vero?
    - ho implementato una funzione __autoload per caricare dinamicamente le classi che mi servono e ho impostato l'url in modo che dal file in cui serve la classe, si possa giungere nella cartella 'classes', ma non c'è un modo per far indirizzare dinamicamente la classe verso tale cartella sia che io sia nella root o una cartella di pari livello ? (lo sò che è una stupidaggine, ma forse si può risolvere con una funzione ed io non lo sò per questo nell'eventualità ...).


    D'accordo, concludo qui (lo prometto!), spero che questo sia un'argomento utile ed interessante a molti e che possa trovare le mie risposte, grazie mille ! Se sono stato poco chiaro (chiedo scusa e so che lo sono stato) per via dei molti argomenti vi prego di chiedermi delucidazioni e risponderò quanto prima.

    Buona giornata.

  2. #2
    Codice PHP:
    public function connection() { 
            
    $this->getUser(); 
            
    $this->getPassword(); 
            
    $this->getHost(); 
            
    $this->getDb(); 
            new 
    mysqli($this->getHost(), $this->getUser(), $this->getPassword(), $this->getDb()); 
            if (
    mysqli_connect_errno()) { 
                
    printf("Connessione al database fallita."); 
                exit(); 
            } 
        } 
        public function 
    disconnection() { 
            
    mysqli_close(); 
        } 
    se non ti salvi l'oggetto mysqli con cosa
    la fai la query ?


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

  3. #3
    Originariamente inviato da whisher
    se non ti salvi l'oggetto mysqli con cosa
    la fai la query ?


    Grazie mille per la risposta in effetti non sapevo se salvarla o no, ora ho risolto ma sono insicuro che sia un metodo giusto, posto di seguito il codice:

    Codice PHP:
    require_once("connectingDb.php");
    class 
    mysqliReader extends connectingDb {
    var 
    $mySqli;
    //...    
    public function connection() {
            
    $this->getUser();
            
    $this->getPassword();
            
    $this->getHost();
            
    $this->getDb();
            
    $mySqli= new mysqli($this->getHost(), $this->getUser(), $this->getPassword(), $this->getDb());
            if (
    mysqli_connect_errno()) {
        
    printf("Connessione al database fallita.");
        exit();
    }
        }
        public function 
    query($query) {
        
    $mySqli->query($query);
        }
        public function 
    disconnection() {
            
    $mySqli->close();
        }

    cosi dovrebbe andare? e intendo anche il metodo per le query che quindi richiamerei dopo aver assegnato la classe alla variabile $db, richiamando solo il metodo $db->query('query'); oppure bastava salvare l'oggetto nella variabile e quindi la funzione query è inutile?

    Dicevo sopra sono insicuro se dichiarare la variabile $mySqli ($mySqli= ...) come tale oppure $this->mySqli ($this->mySqli= ...) o ancora $this->mySqli->... (che però mi pare veramente errato).


    Ciao ciao e grazie mille ancora .

  4. #4
    Come dicevo è appunto una classe derivata e la variabile $mySqli la imposto solo nella classe stessa e non nella classe madre astratta.

  5. #5
    Codice PHP:
     $this->mySqli= new mysqli($this->getHost(), $this->getUser(), $this->getPassword(), $this->getDb()); 

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

  6. #6
    Ottimo


    Mille grazie, provvedo subito ad aggiornare il codice.
    Sapresti anche dirmi quindi qualcosa sulle query? Ormai credo di doverle impostare così:
    $this->mySqli= mysqli_query($query);


    Ciao ciao

  7. #7
    Codice PHP:
     public function query($query) { 
        return 
    $this->mySqli->query($query); 
        } 

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

  8. #8


    Mille grazie non sò proprio come ringraziarti,

    buona giornata.

    Ciao Ciao

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.