[PHP][PDO] Come connettersi al database

MarcoGrazia

Utente Attivo
15 Dic 2009
788
16
18
59
Udine
www.stilisticamente.com
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.
 
Discussioni simili
Autore Titolo Forum Risposte Data
K [PHP] PDO.bindingParam PHP 2
M [PHP] Interrompere DROP TABLE con PDO PHP 0
M [PHP] Alternativa a datagrid con PDO PHP 6
M [PHP] Creare un menu a tendina con pdo PHP 18
M [PHP] Array di array - PDO PHP 2
W [PHP] Creazione classe PDO PHP 4
F PHP, PDO e visualizzazioni errori e/o eccezioni PHP 3
3_g [PHP] mvc, pdo e classi... PHP 7
F php PDO mysql connessione(select_db) PHP 3
Fredyss redirect a altra pagina php dopo commit su postgresql con PDO PHP 1
C [PHP] PDO prepared statement - select query errore PHP 7
ANDREA20 [PHP] Errore $this->db_connection = new PDO PHP 0
MarcoGrazia [PHP][PDO][MySQL] Non registra ma non da nemmeno errori. PHP 0
MarcoGrazia [PDO][PHP[MySQL] Piccolo modulo di ricerca in un sito tramite l'operatore LIKE Snippet PHP 0
neo996sps [PHP e funzioni con PDO] Funzione per generare corpo tabella PHP 1
R Organizzazione PHP Mysql PDO PHP 15
voldemort PHP PDO: non c'ho capito niente PHP 1
L php mysql cerca e visualizza pagina PHP 0
F Il codice php è giusto? PHP 2
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
A invio massivo dati a file php Javascript 4
Z MySql injection PHP PHP 1
V PHP form intersecate PHP 0
I [Offro][Retribuito] Programmatore Php Offerte e Richieste di Lavoro e/o Collaborazione 0
P Funzione jQuery Ajax invio file a php jQuery 1
C Dopo chiusura del tag php la stringa html va a capo PHP 1
E Transaction php PHP 11
B ciclare file xml con PHP PHP 1
L Estrazione dati php Database 6
A Aiuto per pagina php PHP 0
E Php select option e ajax PHP 23
I Aiuto php Dependent Lookup PHP 0
T arretramento versione PHP... PHP 3
D problema php mysql PHP 1
D problema php mysql PHP 1
E Barra di avanzamento codice PHP PHP 4
G creazione menu a tendina e invio a pagina php PHP 1
A inserire variabile php colore in div html PHP 2
Z Video protetto con PHP PHP 0
Z Problema di sincronizzazione PAYPAL con PHP PHP 1
I Eecuzione di javascript in ciclo foreach php. PHP 7
S Libreria PHP per creare file dwg o dxf PHP 0
A [cerco - retribuito] Sviluppatore Php freelance per progetti vari Offerte e Richieste di Lavoro e/o Collaborazione 2
L Google chart php mysql PHP 2
R Download file multipli da directory php PHP 0
F pagina dinamica PHP PHP 3
P Rimozione automatica url da sitemap.xml con PHP PHP 1
L php tinymce mi duplica la classe label PHP 3
S Errore PHP - Notice: Undefined index ... PHP 14
N file manager da php 5 a 7 PHP 15

Discussioni simili