[PHP][PDO] Come connettersi al database

MarcoGrazia

Utente Attivo
15 Dic 2009
852
20
28
62
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 1
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
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1

Discussioni simili