Jump to content
  • PHP Lezione #5 - Interazione con Database Mysql o MariaDB


     Share

    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.

     

    v79oAn8.png

     

    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

     

     

     

     

     Share


    User Feedback

    Recommended Comments

    There are no comments to display.


×
×
  • Create New...

Important Information

Terms of Use Privacy Policy Guidelines We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.