Database MySQL e PHP

Lunedì, 10 Maggio 2004

OBIETTIVI DELLA LEZIONE
In questa lezione:
  1. Impareremo ad interrogare un database SQL da PHP
  2. Vedremo cosa sono le sessioni e perchè servono
  3. Miglioreremo la conoscenza di base del linguaggio PHP

MySQL

Contestualizzazione:

Il processo di creazione dinamica di una pagina HTML può essere schematizzato nei seguenti passi fondamentali:

(1) Invio dei dati dal client al server form HTML + richiesta HTTP (GET/POST) lez13e14
(2) Sul server una CGI riceve i dati Server + Programma PHP lez15e16
(3) La CGI interroga il DB MySQL query MySQL Oggi
(4) Con i risultati ottenuti crea la pagina da rimandare all'utente Programma PHP + Server lez15e16

In questa sezione ci concentriamo sul punto (3).

MySQL è un server di database relazionale, in parte conforme allo standard SQL92. In termini molto rozzi, un database relazionale è un insieme di tabelle e di relazioni tra alcuni campi di tabelle diverse.
Per quanto riguarda il nostro corso chiameremo con il nome di "record" ciascuna riga di una tabella e con quello di "campo" ciascuna colonna.
MySQL può essere interrogato attraverso un dialetto del linguaggio standard SQL. Vediamo attraverso alcuni esempi una possibile sessione:

I comandi SQL (SELECT ad esempio) e i nomi delle colonne (i campi) non sono case-sensitive. Sono invece case-sensitive in MySQL i nomi dei database e delle tabelle.

ATTENZIONE: i comandi SQL riportati sopra terminano con il punto e virgola (;). Quando li effettuaremo da PHP, anche se per il resto la sintassi sarà IDENTICA, il punto e virgola finale NON DEVE ESSERE INSERITO.

PhpMyAdmin

PhpMyAdmin è un pacchetto di script PHP che ci permetterà di interagire molto più semplicemente con il server MySQL [Benissimo!].

Ad esempio la vediamo in queste immagini la creazione del database "db_annunci" e della tabella "annunci", come fatto in SQL nella sezione precedente.

  1. Viene inserito il nome del database da creare da creare. [Immagine]
  2. Viene inserito il nome della tabella da creare e il numero di campi che la tabella deve avere. [Immagine]
  3. Vengono specificati i nomi dei campi e il tipo di ciascun campo. [Immagine]
  4. La tabella è stata creata ed è possibile inserire nuovi record. [Immagine]

Anche se PhpMyAdmin permette di fare molto di più di quanto visto, in generale servirà più che altro per creare la struttura del database. I dati verranno inseriti dagli script PHP.

PHP + MySQL

L'accesso al database MySQL da PHP si compone SEMPRE dei seguenti passi:

  1. apertura della connessione al database MySQL;
  2. selezione del database su cui operare;
  3. esecuzione query SQL sul database;
  4. lettura dei risultati della query;
  5. eliminazione dei risultati della query (NON NECESSARIO);
  6. chiusura della connessione.

Esempio 1

esempiosql1.php conta i records contenuti nella tabella annunci del database db_annunci, visto sopra.


<html>
<head>
<title>Bacheca annunci</title>
</head>
<body>
<?php

$ptr_mysqls=mysql_connect("localhost","root","")
    or die("Impossibile connettersi al server MySQL.\n");
mysql_select_db("db_annunci", $ptr_mysqls)
    or die("Impossibile aprire il database.\n");

$query_visualizzazione="SELECT * FROM annunci";
$ptr_risultato_query=mysql_query($query_visualizzazione, $ptr_mysqls);

$numero_records=mysql_affected_rows($ptr_mysqls);

print "Il database contiene $numero_records annunci.\n";

mysql_free_result($ptr_risultato_query);
mysql_close($ptr_mysqls);

?>
</body>
</html>

Esempio 2

esempiosql2.php visualizza tutti i records della tabella annunci


<html>
<head>
<title>Bacheca annunci</title>
</head>
<body>
<?php

$ptr_mysqls=mysql_connect("localhost","root","")
    or die("Impossibile connettersi al server MySQL.\n");
mysql_select_db("db_annunci", $ptr_mysqls)
    or die("Impossibile aprire il database.\n");

$query_visualizzazione="SELECT * FROM annunci";
$ptr_risultato_query=mysql_query($query_visualizzazione, $ptr_mysqls);

print "<table cellpadding=\"3\" border=\"1\">\n";
while( $record=mysql_fetch_array($ptr_risultato_query, MYSQL_ASSOC) )
{
    print "<tr>\n";
    foreach($record as $valore_campo)
    {
        print "<td>\n";
        print $valore_campo . "\n";
        print "</td>\n";
    }
    print "</tr>\n";
}
print "</table>\n";

mysql_free_result($ptr_risultato_query);
mysql_close($ptr_mysqls);

?>
</body>
</html>

Esempio 3

Sito dove gli studenti possono inserire le loro inserzioni. L'esempio è più complesso e costituito da tre files. annunci0.php è la pagina principale, inserisci0.php permette di inserire un nuovo annuncio e cancella0.php cancella un annuncio dal database. Il database è sempre bd_annunci e la tabella annunci ha la struttura vista sopra.

PHP e SESSIONI

HTTP è un protocollo senza memoria di stato e, di sua natura, ogni coppia "domanda del client"/"risposta del server" è indipendente dalle altre. Una SESSIONE è semplicemente una serie di domande/risposte effettuate da un client ad un server che condividono uno stato (condividono informazioni che persistono tra una connessione e le successive).
Nella lezione 15, abbiamo visto come sia possibile utilizzare un cookie per far si che il valore di alcune variabili permanga tra connessioni indipendenti. Di fatto l'esempio 4 costituiva un primo rudimentale esempio di sessione.
D'altra parte, per applicazioni in cui la sicurezza è critica il cookie ha un punto debole: le informazioni che si vogliono conservare tra una pagina e l'altra vengono salvate in un file sul disco del client e sono quindi modificabili dall'utente.
Una soluzione a questo problema è quello di mettere nel cookie un codice identificativo della sessione e salvare le informazioni che devono essere persistenti sul server.
Un esempio (essessione1.php):

<?php
session_start();

if( !isset($_SESSION['numero_visite'])  )
{
    $_SESSION['numero_visite']=1;
}
else
{
    $_SESSION['numero_visite']++;
}
?>

<html>
<head>
<title>Titolo</title>
</head>
<body>

Il numero di volte che ti sei connesso a questa pagina è
<b><?php print $_SESSION['numero_visite']; ?></b>.

</body>
</html>

PHP II

In questa breve sezione aumentiamo la conoscenza di base del PHP

Lab

CONSIGLIO: usate il manuale PHP!
Il manuale MySQL si scarica dalla pagina http://dev.mysql.com/doc/ (non è essenziale).

Per prima cosa svolgere gli esercizi della lezione 16

Esercizio 1: Prendiamo confidenza con MySQL e PhpMyAdmin
Una descrizione dettagliata della procedura di connessione al server MySQL attraverso PhpMyAdmin è disponibile all'indirizzo: http://php.weblab.crema.unimi.it . In breve, andate alla pagina http://php.weblab.crema.unimi.it/mysql/ e inserite SIA come username che come password lo username che vi è stato assegnato (solitamente lettera iniziale nome + cognome).
php.weblab pone la restrizione agli utenti di avere un solo database di nome "phpweb[numero del gruppo a cui appartenete]". Quindi non è possibile creare un database, solo aggiungervi delle tabelle (poco importa per il corso e al fine dello svolgimento dell'elaborato).
Create la tabella "annunci" in modo che abbia la struttura degli esempi visti a lezione. Inoltre, tramite PhpMyAdmin aggiungete qualche inserzione (suggerimento: selezionate la tabella e andate alla scheda "Inserisci").
Modificate i file degli esempi 1 e 2 in modo che funzionino dal vostro account: (1) cambiate username e password nella funzione mysql_connect() in modo che coincidano con i vostri dati; (2) cambiate il nome del database nella funzione mysql_select_db(), che nel vostro caso si chiama "phpweb[numero del gruppo a cui appartenete]".
Copiate i files sul webserver. Funzionano?
Esercizio 2
Tramite PhpMyAdmin, create una tabella "spese" che contenga 3 campi: (1) data: la data della spesa; (2) motivo: che cosa avete comperato; (3) importo: quanto avete speso.
Create lo script inseriscispesa.php che permetta all'utente di inserire, tramite un form una spesa effettuata nel database.
Preparare lo script vedispese.php che produca una tabella di tutte le spese effettuate.
Esercizio 3
Preparare lo script memorizzanome1.php che inizia una sessione e, dopo aver chiesto all'utente il nome, lo memorizza nella variabile di sessione "nome". Se "nome" è già contenuto in $_SESSION, presenta all'utente una pagina di saluto contenente il nome dell'utente.
Preparare lo script memorizzanome2.php che legge il valore della variabile di sessione "nome" e presenta all'utente una pagina di benvenuto contenente il nome.
Funzionano entrambi? Chiudete il brower. Apritelo di nuovo e visualizzate memorizzanome2.php. La sessione è ancora aperta?




Informazioni sul sito