Per inserire un valore uso le query parametriche con prepare, bind ed execute
FONDAMENTALE queste accortezze: nella query inerire :id, :nome e così via ossia i : e poi il nome della variabile.
Inoltre si ha il controllo del tipo del campo che si andrà ad inserire che come si vede può essere di tipo intero o di tipo stringa con il comando PDO::PARAM_STR che sarà appunto di tipo stringa.
Si noti che mi sono collegato al dbms poi ho creato il database. Ho intercettato il messaggio d’errore nel caso in cui la creazione del database non fosse andata a buon fine con il metodo errorCode().
Adesso creo la tabella dopo essermi collegato al database utenti.
sto operando in maniera molto veloce la creazione di una tabella e si nota che non sto specificando che tipo di DBMS sto usando se non , ovviamente in fase si login, ma a differenza dell’altro approccio non uso più metodi o classi caratteristici del mysql.
La connessione a un database MySQL si realizza creando un’istanza della classe PDO: il costruttore si aspetta 3 parametri, uno obbligatorio e due facoltativi. Il parametro obbligatorio è il DSN (Data Source Name), i parametri facoltativi, almeno formalmente, sono username e password di accesso al nostro database server.
Possiamo inserire la creazione della connessione al database in un costrutto try-catch in modo da gestire eventuali errori (PDOException) di connessione, bloccare l’esecuzione del codice se la connessione stessa non va a buon fine e visualizzare la tipologia di eccezione individuata .
Si deve chiudere la connessione con il comando:
Posso creare una connessione persistente in maniera tale da migliorare le prestazioni.
PDO, acronimo di PHP Data Object, è un’estensione di PHP introdotta a partire dalla versione 5.1 del linguaggio con lo scopo di unificare le API di accesso ai database.
Come ben sintetizza il suo acronimo, PDO si presenta come una soluzione per sua natura orientata agli oggetti, l’estensione fornisce infatti un’interfaccia comune per la comunicazione con i diversi database.
Uno dei principali punti di forza di PDO risiede nel fatto che esso mette a disposizione delle sviluppatore i prepared statement, costrutti che se utilizzati sistematicamente sono in grado di mettere al riparo gli script delle minacce basate sull’SQL injection, una tecnica di attacco incentrata sull’iniezione di SQL malevolo tramite input al fine di violare le applicazioni per la gestione dati.
In conclusione è possibile sottolineare che i vantaggi derivanti dall’uso di PDO fanno riferimento alle seguenti caratteristiche:
Portabilità: grazie al supporto di più engine per la gestione di dati.
Programmazione orientata agli oggetti: grazie ad un’interfaccia nativamente object-oriented.
Sicurezza: grazie ai prepared statement che proteggono dai tentativi di code injections
Attualmente quando accediamo ad un database tramite PHP abbiamo due opzioni corrispondenti ad altrettante estensioni: PDO oppure MySQLi. Le differenze principali fra le due librerie riguardano i database supportati, la gestione dei parametri e le performance.
La principale differenza tra PDO e MySQLi sta nel numero dei database supportati: mentre MySQLi supporta, come indica il nome stesso, soltanto MySQL, PDO può supportare 12 diversi database.
La select tradizionale espone a potenziali rischi dal punto di vista dell’iniezione di codice malevolo, le sql injection infatti sono ancora al primo posto sia per la facilità di sfruttamento della vulnerabilità, sia per i rischi ad essa connessi.
Il rischio è legato all’uso incauto della variabile:
e, usata senza controllo, potrebbe contenere qualsiasi codice malevolo .
La soluzione risiede nell’uso dei prepared statement che ci garantiscono un miglioramento della sicurezza e anche delle buone performance di esecuzione, in particolare nel caso di operazioni ripetute.
Il primo passo per utilizzare i prepared statement sarà quello di preparare la nostra query sostituendo le due variabili con dei segnaposto (placeholder) che verranno valorizzati in fase di binding:
La separazione fra la preparazione dell’SQL e i dati ci permette di avere una protezione rispetto alle SQL injection, infatti i dati provenienti dall’utente verranno gestiti al di fuori dell’istruzione SQL.
A livello di sintassi si deve registrare l’assenza dei delimitatori attorno al parametro: in questo caso pur trattandosi di stringhe non è necessario delimitarle, infatti l’associazione con il tipo di dato verrà fatta in fase di binding.
I valori di bind sono i seguenti:
Valore
Descrizione
“s”
Corrisponde a variabili associate al tipo di dato stringa.
“i”
Corrisponde a variabili associate al tipo di dato numeri interi.
“d”
Corrisponde a variabili associate al tipo di dato numeri double.
“b”
Corrisponde a variabili associate al tipo di dato BLOB, formato binario.
la variabile result mi ritorna il valore 0 o 1 de il risultato del bind è corretto.
Tale operazione permette una velocizzazione dell’accesso al database e una maggiore sicurezza dei campi che verranno inseriti o cancellati.
“By using prepared statements you are separating SQL queries from user entered data. Instead of input data, you put placeholders (‘?’ char) in your SQL query. Then you send the query to the DBMS server (e.g.: MySQL) by means of the “mysqli::prepare” method. So the server checks that everything is ok and, if so, it waits for input data. By now it already knows your query. Just it has to wait for input data to bind to the query. “
Al termine del fie php inserisco sempre:
Quindi il codice sorgente che avevo usato precedentemente con il prepare, bind ed execute adesso DEVE esesere scritto nella seguente maniera:
DEVE essere presente il metodo store_result() per poi usare il metodo num_rows, alla fine del bind usare sempre il metodo close().
Il nostro sito utilizza i cookies per offrirti un servizio migliore.
Se vuoi saperne di più o avere istruzioni dettagliate su come disabilitare l'uso dei cookies puoi leggere l' informativa estesa.
Cliccando in un punto qualsiasi dello schermo, effettuando un’azione di scroll o cliccando su Accetto, presti il consenso all’uso di tutti i cookies.OkNoPrivacy policy