[PHP][PDO] Come connettersi al database

Discussione in 'Snippet PHP' iniziata da MarcoGrazia, 22 Novembre 2015.

Tag (etichette):
  1. MarcoGrazia

    MarcoGrazia Utente Attivo

    Registrato:
    15 Dicembre 2009
    Messaggi:
    676
    Mi Piace Ricevuti:
    7
    Punteggio:
    18
    Sesso:
    Maschio
    Occupazione:
    Sviluppare web design (Studiare)
    Località:
    Udine
    Home Page:
    Prima una mia considerazione: normalmente uso PDO, non è importantissimo usarlo, si può tranquillamente continuare a usare le funzioni mysqli: cioè le cosiddette improved extension, vanno benissimo, solo che per lavoro e diletto devo usare più server di database e quindi non solo MySQL; le estensioni PDO mi semplificano la vita.
    Spero solo che non usiate ancora le mysql_ ( senza la i ) non solo sono obsolete al punto che PHP ne ha deprecato l'uso dalla versione 5.5.0 ma dalla 7 le ha proprio tolte, quindi programmatori avvisati...

    La funzione di connessione che condivido qui è per un database MySQL e quindi dato che le PDO si interfacciano a database addirittura della versione 3.x, quindi 4.0 e fino alla 5.5 va bene per tutti i modelli di server MySQL.

    Eccola: ( poi ve la spiego in dettaglio )
    PHP:
    function connetti$utente 'user',  $password 'la tua password'$database 'il tuo database' ) {
      try {
        return new \
    PDO(   'mysql:host=localhost;dbname=' $database ';charset=utf8mb4',
                            
    $utente,
                            
    $password,
                            array(
                                \
    PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
                                \
    PDO::ATTR_PERSISTENT => false
                            
    )
        );
      }
      catch ( 
    PDOException $e ) { print( 'Errore in connessione:<br><br>' $e->getMessage()); }
    }  
    //  Fine connetti
    PHP:
    //  Per attivare la connessione:
    $connessione connetti();
    //  Oppure a seconda dei casi:
    $connessione connetti'root' );
    $connessione connetti'root''password' );
    $connessione connetti'root''password''mio_database' );
    Spiegazione sull'uso:
    PHP:
    function connetti$utente 'user',  $password 'la tua password'$database 'il tuo database' ) {
    ai più la chiamata della funzione è chiara e non ha bisogno di spiegazione, l'uso dei parametri con valori predefiniti è ovvio, una volta sostituiti i valori non devo più cambiarli e posso richiamare la funzione senza menzionare nulla.
    Però una considerazione su $utente = 'user' va fatta: normalmente se si usano database gratuiti, ma a volte purtroppo anche usando hosting a pagamento non si ha la possibilità di modificare il nome utente del database ( per fortuna ora la situazione sta cambiando ), è molto importante per la sicurezza del server di database e per il nostro sito che ci siano più livelli di utenza.
    Normalmente definisco sempre un utente user che ha solo il permesso di leggere il database ( SELECT ) e null'altro, è l'utente visitatore, quello più consistente in termini numerici, quello più anonimo e anche quello più pericoloso che porta attacchi non voluti.
    Permettere all'utente generico i permessi di cancellare, scrivere, creare, eccetera in un database è fondamentalmente deleterio; mi rendo conto che per molti rimane impossibile fare diversamente perché gli hosting gratuiti non permettono di aggiungere nomi utente, pazienza ma almeno la nostra funzione è pronta per un uso avanzato.

    PHP:
    try {
      return new \
    PDO(   'mysql:host=your-hostname;dbname=' $database ';charset=utf8mb4'
    ... 
    eccetera ....
    Intanto niente variabili di comodo, return al volo PDO ritorna subito il collegamento al database richiesto o errore, quindi basta questo.
    • try {} catch ci permette al volo di avere un errore mostrato. Sia chiaro sempre parlando di sicurezza è meglio non fare una echo $e->getMessage(); per non dare informazioni al nemico, ma costruire una funzione wrapper che da solo informazioni utili a capire che si è verificato un errore e che bisogna avvisare il programmatore; ma questo solo dopo che sappiamo tutto funzionare al meglio, gli errori sono comodi in fase di debug.
    • host:localhost; localhost va bene per il 99% delle volte, ma qui ci va il nome del server, meglio se in IP se non è impostato come localhost, o comunque chiedete sempre al sistemista ( quello che mette il carbone nella caldaia del server :D )
    • charset=utf8mb4; è la codifica del vostro database, la si imposta sempre prima di creare le tabelle, tanto lo so che usate phpmyadmin, va bene, quindi quando create il database, o se questo vi viene già fornito dall'hosting, andate in Server: localhost » Database: mio_database » Operazioni e nel box Codifica carattere mettete utf8mb4_general_ci che vuol dire usare la codifica UTF8 versione Multi byte ( 4 byte ) tipo case insensitive.

    PHP:
                            $utente,
                            
    $password,
                            array(
                                \
    PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
                                \
    PDO::ATTR_PERSISTENT => false
                            

    Il resto del comando è quasi ovvio per utente e password, un po' meno per l'array.
    Qui si possono mettere impostazioni che di solito si possono passare tramite le setAttribute(), ma non ne vale la pena, questo metodo è più diretto e non crea ritardi, tutto avviene in fase di creazione della connessione e non dopo.
    • \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, anche qui c'è poco da dire, accende la possibilità di riportare errori, sia in modo normale che tramite le eccezioni.
    • \PDO::ATTR_PERSISTENT => false qui è complicato rispondere, banalmente dico che dipende dal server sql; MySQL non è settato per usarla quasi mai, Oracle sì, ma non è una regola fissa, conviene fare due cose: leggere la documentazione e fare prove.
      Tenete presente che il numero di connessioni possibile in MySQL per ogni script in esecuzione è limitato, quindi se mettete connessione persistente e poi vi dimenticate di chiederle dopo l'uso lo mandate subito in crash!
      Molti hosting le vietano e quindi metterle a FALSE è l'unica via per accedervi.
    • \PDO::... la barretta rovesciata? Ah sì, la si usa per via dei namespace, se li usate dovete dire al PHP che le funzioni PDO non sono funzioni vostre ma del PHP.
      Può sembrare sciocco ma c'è un motivo: PDO è una classe estensibile, la potete estendere e quindi il PHP non sa se quella che si trova davanti è il suo PDO o il vostro, nel caso da per scontato che sia il vostro!
      La barretta davanti riporta l'esecuzione all'estensione PDO originale, non è necessaria se non usate namespace, metterla però non fa male.

    Ultimo ma non l'ultimo!
    PHP:
     catch ( PDOException $e ) { print( 'Errore in connessione:<br><br>' $e->getMessage()); } 
    Controllo dell'errore, se si verifica questa stringa ne riporta il dato.
    Io però di solito uso una stringa un po' più complessa perché voglio anche il nome dello script dove si è verificato l'errore e la riga, ma qui c'è poco da dire, la riga sostanzialmente è una sola e la funzione la conosciamo, quindi non aggiungo altro.
    In ogni caso la si può sostituire così:
    PHP:

     
    catch ( PDOException $e ) { print( 'Errore in connessione:<br><br>' $e->getMessage()) . '<br><br>' $e->getCode() . ' - ' $e->getFile() . ' linea: ' $e->getLine(); } 

    Se siete arrivati a leggermi fino a qui e senza avere mal di testa avete tutta la mia stima e invidia, spero che queste righe vi siano d'aiuto.
    Buon lavoro.
     
Sto caricando...

Condividi questa Pagina