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


     Share

    Interazione con Database

    Andiamo ad introdurre il terzo elemento nelle nostre applicazioni web, abbiamo visto il web client, che faceva delle richieste e riceveva delle risposte, poi sul web server (apache+php) che via script possiamo generare pagine dinamiche. Ci manca il database server dove possiamo registrare tutti i dati che ci interessano salvare in un database.

     

    Abbiamo Mysql, che è stato acquistato da Oracle, la nuova versione opensource è nota come Mariadb, che si è fatto conoscere ultimamente ed è uguale a Mysql.

    Quindi ricapitolando abbiamo il web server con apache e php e ora anche mysql per formare un server completo, sia offline con XAMPP e sia online attraverso i server dedicati, condivi o vps.

     

    Mysl command line client

    Tramite la shell (terminale) possiamo interagire con il server mysql:

    mysql -h localhost -u username -p

    localhost è il server, in questo caso siamo in locale
    username è il nome dell'utente e -p è la password premiamo invio e ci chiederà di inserire la password.

     

    Bisogna sapere i diversi comandi per interagire con il server mysql da linea di comando, eccone alcuni:

    show databases; vi mostra tutti i database già esistenti

    use phpmyadmin; per usare il database phpmyadmin

    show tables; mostra tutte le tabelle di phpmyadmin

    describe pma_users; mostra la struttura della tabella

    select username from pma_users; mostra i record di pma_users nella tabella username

    MYSQL: tabelle InnoDB e MyISAM

    Abbiamo diversi motori per salvare il tipo di tabelle diverse, abbiamo diverse caratteristiche, InnoDB è il default attualemnte. MyISAM era in passato di default ed era ottimizzato per siti web che avevano molte letture ma non sono efficienti in caso di scrittura. Quindi se abbiamo un sito web dove dobbiamo solo leggere da Mysql possiamo usare MyISAM, mentre se dobbiamo scrivere molto nel DB possiamo usare di default InnoDB.

     

    Se abbiamo più utenti che scrivono nei DB, abbiamo i problemi di Lock, DBMS mettono in piedi i meccanismi di Lock, InnoDB è molto più sofisticato, ha un row-level locking, a livello di righe mentre MyIsam ha un table-level locking, per le operazioni di scritture InnoDB è più efficiente permette scritture concorrenti purchè agisca su righe diverse. mentre MyIsam blocca l'intera tabella e quindi nessuno può scrivere se la tabella è bloccata da un utente.

    MyIsam può costruire degli indici per la ricerca di tipo FULLTEXT mentre InnoDB non lo aveva fino alla versione Mysql 5.6. InnoDB permette di implementare la transazioni, implementa i controlli di integrità su chiavi esterne.

    MYSQL: UTENTI

    Un server Mysql può gestire più utenti e più database.

    L'utente root deve essere usato solo per l'amministrazione del DBMS.

    Al momento dell'installazione si deve specificare la password per l'utente root!

    Per ogni utente che deve usare il sistema (ancora meglio, per ogni database) si dovrebbe definire un utente Mysql.

     

    Privilegi su database e tabelle

    Un utente o un processo dovrebbe avere il minimo privilegio per fare il suo task.

    MYSQL: Controllo dell'accesso

    Il controllo dell'accesso in MySql si svolge in due passi

    1. Controllo delle credenziali dell'utente Mysql
    2. Se le credenziali sono OK, per ogni istruzione SQL, il server Mysql verifica se l'utente ha i privilegi sufficienti.

     

    Mysql ha un sistema di privilegi che per ogni utente permette di specificare quali operazioni può fare, si usa il comando grant, e si ha una tabella che si chiama grant tables.

     

    MySql fornisce 4 livelli di privilegi:

    - Global, Database, Table, Column

     

    Per assegnare (cancellare) un privilegio ad un utente si usa il comando GRANT (REVOKE)

    GRANT <privileges> [columns]
    ON <item>
    TO <username> [IDENTIFIED BY ‘<password>’]
    [WITH GRANT OPTION];

     

    Creazione utente/db

    CREATE USER '<sawuser>'@'localhost' IDENTIFIED BY '<sawpwd>';
    
    CREATE DATABASE <sawdb>;
    
    GRANT select, insert, update, delete, index, alter, create, drop ON <sawdb>.*
    TO <sawuser>
    IDENTIFIED BY ‘<sawpwd>’;
    FLUSH PRIVILEGES;

     

    MySQL permette di definire privilegi per l'utente generico, privilegi per l'amministratore, e dei privilegi speciali
    Per l'utente generico si possono ad esempio specificare i seguenti privilegi
    – SELECT, INSERT, UPDATE, DELETE, INDEX, ALTER, CREATE, DROP

    INTERAZIONE MYSQL COME FARE

    PHP ha delle librerie che interagiscono con Mysql.

    Per accedere ad un database da una applicazione web, i passi fondamentali sono i seguenti:

    1. Filtrare i dati in arrivo dal client
    2. Stabilire una connessione e selezionare un database
    3. Preparare la query
    4. Eseguire la query
    5. Ottenere il risultato
    6. Formattare il risultato per l'utente
    7. chiudere la connessione

     

    Abbiamo due librerie principali:

    - PHP's mysqli Extension, libreria nativa

    - PHP Data Objects (PDO), database abstraction layer, permette di lavorare su database diversi senza cambiare il codice.

     

    1. Controllare i dati in arrivo

    $nomevar=$_POST['...'];
    $nomevar=trim($nomevar);
    
    mysqli_real_escape_string();

    La funzione trim(), rimuove gli spazi o tab e \n a fine o inizio stringa. Con il database possiamo usare la funzione sopra che pulisce i caratteri speciali.

     

    2. Stabilire la connessione

    //Stile procedurale
    $con = mysqli_connect (“localhost”,“name-of-user”,“password-of-user”,”db-name”);
    if (mysqli_connect_errno($con)) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error($conn);
    }
    
    //Stile object oriented
    $con = new mysqli( localhost”,“name-of-user”,“password-of-user”,”db-name );
    // Per il controllo dell’errore vedi:
    // https://www.php.net/manual/en/mysqli.construct.php

     

    3. Preparare la query: SELECT

    In questo primo esempio la query "mischia" codice SQL e dati in arrivo dal browser

    $query = SELECT * FROM user WHERE name='” .$name. “' AND surname='” .$surname. “'”;

    Attenzione!

    La query viene passata al database e bisogna ricordare l'escape dei dati di input per evitare errori/attacchi

     

    4. Eseguire la query

    //Stile procedurale
    $res = mysqli_query($con,$query);
    
    //Stile object oriented
    $res = $con->query($query);

    In caso di SELECT viene restituita una risorsa che contiene i dati estratti dalla query

    False in caso di errore

     

    5. Ottenere il risultato

    //Stile procedurale
    $row = mysqli_fetch_assoc($res);
    
    //Stile object oriented
    $row = $res->fetch_assoc();

    come array:

    $row = mysqli_fetch_array($res,flag);
    $row = $res->fetch_array(flag);

    come oggetto:

    $obj = mysqli_fetch_object($res);
    $obj = $res->fetch_object();

     

    Sono disponibili altre funzioni che possono essere usate dopo l'esecuzione delle query per capire se le cose sono andate a buon fine

     

    // SELECT
    $rowcount=mysqli_num_rows($res);
    $rowcount=$res->num_rows();
    
    // INSERT, UPDATE, REPLACE, DELETE
    $num = mysqli_affected_rows($con);
    $num = $con->affected_rows();

     

    6. Formattare il risultato

    Si deve produrre codice HTML che verrà restituito al client che ha fatto la richiesta, ad esempio nel caso di SELECT, per ogni tupla restituita dal DB si potrà avere:

     

    // leggo i valori nella tupla
    $attr1=htmlspecialchars($row[1]);
    $attr1=htmlspecialchars($row[2]);
    ...
    // li restituisco in output
    echo “<tr>”;
    echo “<td>$attr1</td>\n”;
    echo “<td>$attr2</td>\n”;
    echo “</tr>”;
    ...

     

    7. Liberare la memoria

    mysqli_free_result($res);
    o
    $res->free();

    True in caso di successo, False in caso di errore

     

    8. Chiudere la Connessione

    mysqli_close($con);
    o
    $con->close();

     

    Preparare la query: INSERT

     

    In questo secondo esempio la query "mischia" codice SQL e dati in arrivo dal browser

    $query = "INSERT INTO users (id_user,name,surname,username,...) VALUES
    (NULL,'” . $name . “','” . $surname . “','” . $email . “'...)”;

     

    Dopo aver eseguito la query si può verificare il numero di record coinvolti nell'operazione

    $num = mysqli_affected_rows($con);
    o
    $num = $con->affected_rows();

    Le query di UPDATE e DELETE sono del tutto analoghe

     

     

     

     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.