Laboratorio di Basi di Dati · DB Prontopizza e verificare se la login è stata effettuata da un...

25
Laboratorio di Basi di Dati Connessione al DB con PHP Parte di questi lucidi è tratta da una versione precedente di Marco Mesiti, Stefano Valtolina, Daniele Riboni e Sergio Mascetti Anno accademico 2016-2017 Paolo Perlasca

Transcript of Laboratorio di Basi di Dati · DB Prontopizza e verificare se la login è stata effettuata da un...

  • Laboratorio di Basi di Dati

    Connessione al DB con PHP

    Parte di questi lucidi è tratta da una versione precedente di

    Marco Mesiti, Stefano Valtolina, Daniele Riboni e Sergio Mascetti

    Anno accademico 2016-2017

    Paolo Perlasca

  • 2

    Cosa abbiamo studiato

    !  Architettura 3-tier:

    !  Programmazione sul client

    !  Programmazione lato server

    !  inclusa l’interazione con il client

    web server web client DB

  • 3

    Cosa vediamo oggi

    !  Interazione tra web server e DB

    web server web client DB

  • 4

    Prima parte: Accedere ad un DB in PHP

  • 5

    Creare la connessione al DB

    !  Per accedere al DB è necessario creare una connessione

    resource pg_connect(string $con_string)

    !  La stringa passata come parametro indica:

    !  il nome della macchina e la porta dove risponde il DBMS

    !  il nome del DB

    !  il nome e la password dell’utente

    !  (altri parametri, vedi documentazione…)

  • 6

    Creare la connessione al DB

    $conn = pg_connect("host=localhost port=5432 dbname=prova user=user_name password=user_pwd");

    if (!$conn) {

    echo "Connection to DB failed";

    exit;

    }

  • 7

    Chiusura delle connessioni

    !  Di solito non è necessario chiudere esplicitamente le connessioni

    !  le connessioni non permanenti vengono chiuse automaticamente alla fine dello script

    !  Se volete chiudere esplicitamente una connessione, esiste un metodo apposta

    !  pg_close(resource $connection)

  • 8

    Le query

    !  Le query rappresentano tutte le istruzioni che possono essere inviate ad un DBMS. Servono, per esempio per:

    !  creare un DB o una tabella di un DB

    !  aggiungere dati ad una tabella

    !  estrarre dati da una o più tabelle

  • 9

    Query in PHP

    !  pg_query ( resource connessione, string query ): restituisce un risorsa risultato della query

    !  Restituisce FALSE in caso di errore o se la connessione non è valida

    !  I dettagli dell'errore si possono recuperare utilizzando la funzione pg_last_error()

    !  connessione è un parametro opzionale.

    !  Se non impostato, viene utilizzata la connessione di default, ovvero l'ultima connessione effettuata con pg_connect()

  • 10

    Eseguire una query: esempio

    //devo aver creato la connessione prima

    $query = "INSERT INTO Cliente(telC, cognomeC, nomeC, password, via, nCiv, nInt) VALUES ('1234567890', 'Gialli', 'Mario', 'pwd', 'via Comelico', 39, 2)";

    $insert_query = pg_query($conn, $query);

    if($insert_query) { echo 'Cliente inserito!
    '; } else { exit("Errore nella query: ".pg_last_error($conn)); }

  • 11

    Query di estrazione dati

    !  Per estrarre dei dati:

    !  si esegue la query

    !  si passa alla funzione pg_fetch_array il risultato della query

    !  la funzione ritorna un array con la prima riga del risultato

    !  ogni elemento dell’array rappresenta una cella della riga

    !  si richiama nuovamente la funzione pg_fetch_array per le righe successive

  • 12

    Estrazione dei dati: esempio 1

    //devo aver creato la connessione prima

    $query="SELECT CognomeC, NomeC FROM Cliente";

    $query_res = pg_query($conn, $query);

    $row = pg_fetch_array($query_res);

    //Nome e cognome della prima riga

    echo "Cognome: ".$row[0]."
    ";

    echo "Nome: ".$row[1];

  • 13

    Estrazione dei dati: esempio 2

    //devo aver creato la connessione prima

    $query="SELECT CognomeC, NomeC FROM Cliente";

    $query_res = pg_query($conn, $query);

    //fino a quando ci sono righe da leggere

    while($row = pg_fetch_array($query_res)) {

    echo "Cognome: ".$row[0]."
    ";

    echo "Nome: ".$row[1] ."

    ";

    }

  • 14

    Estrazione dei dati con pg_fetch_assoc: esempio

    //devo aver creato la connessione prima

    $query = "SELECT CognomeC, NomeC FROM Cliente";

    $query_res = pg_query($conn, $query);

    //fino a quando ci sono righe da leggere

    while($row = pg_fetch_assoc($query_res)) {

    echo "Cognome: ".$row["cognomec"]."
    ";

    echo "Nome: ".$row["nomec"]."

    ";

    }

  • 15

    Come uso i dati letti dal DB?

    !  In genere i dati estratti dal DB vengono usati per:

    !  fornire informazioni all’utente

    !  per esempio mostrando i dati presi dal DB all’interno di una tabella

    !  creare form

    !  per esempio mostrando una casella di scelta multipla i cui possibili valori sono letti dal DB

  • 16

    Mostrare il risultato di una query all’utente: esempio

    //...come gli esempi di prima

    echo "NomeCognome";

    while($row = pg_fetch_assoc($query_res)) {

    echo "";

    echo "".$row["nomec"]."";

    echo "".$row["cognomec"]."";

    echo "";

    }

    echo "";

  • 17

    “E se il risultato della query contenesse tantissimi risultati?”

    !  Che problemi ci sarebbero se il risultato della query contenesse centinaia di righe?

    !  Soluzione: si limita la query a ritornare solo alcuni risultati. Esempio:

    !  I primi venti nella prima pagina (dal primo al 20esimo)

    !  I gruppo dei secondi venti nella seconda pagina (dal 21esimo al 40esimo)

    !  etc…

  • 18

    Limitare il numero di risultati !  Nello specificare una query di selezione esistono

    due parametri: LIMIT e OFFSET

    !  LIMIT: il numero massimo di record da restituire

    !  OFFSET indica quanti record devono essere “saltati” prima di restituire il primo

    !  Esempio (20 risultati per pagina):

    !  prima pagina: SELECT […] LIMIT 20

    !  in generale, per la n-esima pagina: SELECT […] LIMIT 20, OFFSET m

    !  dove m = 20*(n-1)

  • 19

    Usare i dati letti dal DB per creare form

    !  Supponiamo di voler permettere di cancellare le informazioni su un cliente

    !  Nel mostrare la lista dei clienti, di fianco ad ogni nome vogliamo mettere un pulsante per cancellare quel cliente

    !  Tenete in considerazione che ogni riga della tabella Cliente ha un campo telC che identifica univocamente ogni riga

  • 20

    Esempio

    //nel while di stampa del risultato, per ogni riga aggiungo una cella che contiene quanto segue

    echo "";

    $telC = $row["telc"];

    echo '';

    echo '';

    echo '';

    echo '';

    echo "";

  • 21

    Seconda parte: ora prova tu

  • 22

    Esercizio 1

    !  Scarica e scompatta “Esercizio connessione DB” dal sito del corso

    !  Prima pagina: login.php

    !  Seconda pagina (login1.php): “sei loggato, puoi inserire i tuoi dati” oppure “nome utente o password errate, riprova” e rimanda a login.php

    !  ATTENZIONE: nel progetto i dati utili devono essere memorizzati nel DB e recuperati tramite interrogazioni, non cablati nel codice PHP!

    !  Terza pagina (step2.php): vengono mostrati i dati

  • 23

    Esercizio 1

    !  Vogliamo modificare il file login1.php per connetterci al DB Prontopizza e verificare se la login è stata effettuata da un cliente del database

    !  Come login e password consideriamo il numero di telefono e la password di ogni cliente

    !  Dobbiamo:

    1.  Creare la connessione al DB

    2.  Scrivere l’interrogazione per verificare se il cliente esiste nel DB e farla eseguire a PostgreSQL

    3.  Come capiamo se il cliente esiste o meno?

  • 24

    Esercizio 2 - sito Prontopizza

    !  Scarica e scompatta “Codice Prontopizza” dal sito del corso (lez. 13)

    !  SE NON HAI GIA' il DB Prontopizza in Postgres:

    !  Apri PgAdmin e crea il DB “prontopizza”

    !  Prendi il file “script Creazione DB” (lez. 9) dal sito del corso e copia le istruzioni nell’interfaccia SQL

    !  Viene creato e popolato il seguente schema Cliente(telC,cognome,nome,password,via,nCiv,nInt)

    Pizza (codP,nome,prezzo)

    Ingrediente (codP,ingrediente)

    Ordine (telC,data,codP,qta,importo)

  • 25

    Esercizio 2 – sito Prontopizza

    1.  Completa la pagina per la registrazione di un nuovo utente (register.php): crea un form per l'inserimento dati e (in una nuova pagina) lo script per l'inserimento del nuovo utente nel DB. Controlla la correttezza dei dati inseriti.

    2.  Modifica la pagina di registrazione degli ordini (set_order.php) affinché questi vengano inseriti nel DB. Controlla la correttezza dei dati prima dell'inserimento.

    3.  Modifica la pagina degli ordini (pizze.php) in modo da filtrare le pizze in base a diversi criteri (costo, nome, ingredienti)