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 )
Spiegazione sull'uso:
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.
Intanto niente variabili di comodo, return al volo PDO ritorna subito il collegamento al database richiesto o errore, quindi basta questo.
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.
Ultimo ma non l'ultimo!
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ì:
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.
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' );
PHP:
function connetti( $utente = 'user', $password = 'la tua password', $database = 'il tuo database' ) {
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 ....
- 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
)
- 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
)
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()); }
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.