Abbiamo visto come interagire con il database, e i passaggi da fare, per connettersi e per fare il fetch dei dati con select. Ora andiamo a vedere quello che ci manca come modificare e cancellare dati nel database.
Operazioni CRUD
E' un acronimo quando si gestiscono dei dati e rappresenta le 4 operazioni fondamentali che si possono fare sulle applicazioni che usano un database:
- Create: corrisponde ad INSERT (registration.php è una pagina pubblica)
- Read: corrisponde a SELECT (login.php qui si creano le variabili di sessione; show_profile.php qui si controllano le variabili di sessione)
- Update: corrisponde a UPDATE (update_profile.php servono le variabili di sessione)
- Delete: corrispodne a DELETE (delete_user servono le variabili di sessione)
Modifica Profilo
Regola importante: campi pre-compilati con i dati già memorizzati nel database
Raccoli i dati, si deve impostareuna query SQL con comando UPDATE
Spesso nella query si usa l'ID dell'utente da modificare
Cancellazione utente
Si usa la query di DELETE
Spesso si usa l'ID dell'utente da cancellare
Anche in questo caso bisogna fare attenzione a non cancellare utenti a caso..
PREAPARED STATEMENT
Risolvono un problema arcinoto e continua ad esistere ovvero i SQL INJECTION, l'attacante invece di inserire in un form web (nome, cognome, ecc..) va ad inserire anche dei frammenti di codice sql che possono essere mandati in esecuzione verso il database se l'applicazione web non è fatta bene, prende i dati dall'esterno e non valida i dati in entrata.
An injection of code happens when an attacker sends invalid and untrusted data to the application as part of a command or query. The attacker has the malicious intention to trick the application into executing unintended behavior to collect data or create damage.
Source: https://cai.tools.sap/blog/top-10-web-security-vulnerabilities-to-watch-out-for-in-2019/
Le query come quelle viste fino ad ora, per es.
$query = "SELECT * FROM user WHERE name='" . $name . "' AND surname='" . $surname . "'";
che combinano
- codice SQL
- input fornito dall’utente
sono potenzialmente pericolose se i dati forniti in input non sono opportunamente validati
Per risolvere a questo problema possiamo usare i Prepared Statement, sono delle caratteristiche che permettono di spezzare in due le interrogazioni mysql, che possono aiutare in questo problema.
Rispetto alle query SQL standard, i prepared statement
- vengono eseguiti più volte, per valori diversi dei parametri: prima il DBMS prepara il piano di esecuzione della query, e poi si possono avere esecuzioni multiple, per valori diversi dei parametri
- sono “robusti” rispetto a SQL injection, perché i valori dei parametri sono trasmessi in un secondo momento e non sono usati nella costruzione della query
MySQLi e Prepared Statement
MySQL supporta i prepared statement, sono necessari 2 passi:
- Prepare: si scrive un template con dei parametri (placeholder) che viene inviato al DBMS. Il DBMS esegue il controllo sintattico e inizializza le risorse per gli usi successivi
- Execute: il client invia i valori dei parametri al server che esegue la query sfruttando le risorse precedentemente allocate
Prepare
- mysqli_prepare, mysqli::prepare
$stmt = mysqli_prepare($con, "SELECT * FROM user WHERE email=?"); o $stmt = $con->prepare("SELECT * FROM user WHERE email=?");
Vedi: http://php.net/manual/it/mysqli.prepare.php
Bind parameter
mysqli_stmt_bind_param, mysqli_stmt::bind_param
mysqli_stmt_bind_param($stmt, 's', $email); $email = “[email protected].it”; o $stmt->bind_param('s',$email); $email = “[email protected].it”;
Vedi: http://www.php.net/manual/it/mysqli-stmt.bind-param.php
Execute
mysqli_stmt_execute, mysqli_stmt::execute
mysqli_stmt_execute($stmt); o $stmt->execute();
Al termine si deve chiudere lo statement
mysqli_stmt_close($stmt); o $stmt->close();
Ottenere il risultato
$res=mysqli_stmt_get_result($stmt); o $res = $stmt->get_result(); $row = $res->fetch_assoc();
Per le query di SELECT viene restituita una risorsa con i record (0,1,...) selezionati in caso di successo, FALSE in caso di fallimento
TRUE (successo) o FALSE (fallimento) per le altre query
https://www.php.net/manual/en/mysqli-stmt.get-result.php
Recommended Comments
There are no comments to display.