Pagine dinamiche PHP e connessioni a database MySQL Cominciamo con un esempio Supponiamo di avere un database MySQL, con una tabella di nome tabella_esempio che contiene i campi (id, nome, cognome, password). id nome cognome password 1 pippo baudo ccccqqxzcxzczxc 11 paolino paperino ccccf 69 Federico Pasquesi nonlaso Ora supponiamo di dover utilizzare questa tabella all'interno di un nostro sito web. Dovrà quindi essere possibile, sempre via web, accedere al database in modo da 1. visualizzare il contenuto della tabella 2. inserire nuovi dati 3. modificare i dati esistenti o rimuoverli Presupposti Ricordiamo che il database è gestito da un apposito server, a cui avremo accesso con appropriati credenziali (username e password). Dal nostro script PHP dovremo quindi aprire una connessione a questo database specificando al server MySQL username e password.. Potremo quindi selezionare il database sul quale vogliamo lavorare (specificandone il nome), per poi eseguire tutti i comandi SQL (SELECT, INSERT etc etc) sul nostro database. Per connetterci al database usando PHP dovremo creare un nuovo oggetto $conn utilizzando il costruttore mysqli al quale dovremo passare i seguenti parametri, precedentemente definiti: $conn = new mysqli($hostname, $username, $password, $database ); nel nostro caso useremo i seguenti parametri: $username="user2442453"; // nome utente MySQL $password="pippo123"; // password MySQL $hostname="localhost"; // ip o nome del server su cui gira MySQL $database="db2442453-main"; // nome del database Un po' di SQL Supponiamo di avere una tabella con le caratteristiche menzionate all'inizio. Vediamo come possiamo, usando il linguaggio SQL, • inserire un nuovo dato: INSERT INTO tabella_esempio ( nome, cognome) VALUES (“pippo”, “baudo”); nel caso vengano specificati i valori di tutti i campi della tabella, si possono specificare semplicemente i valori senza elencare tutti i campi, es: INSERT INTO tabella_esempio VALUES (118,“pippo”, “baudo”, “la mia password”); • rimuovere uno (o più record) da una tabella: • modificare uno(o più) dati esistenti: DELETE FROM tabella_esempio WHERE nome=”paolino” AND cognome=”paperino”; UPDATE tabella_esempio SET nome=”topolino”, password=”pluto” WHERE id=”11”; • selezionare tutti i dati presenti in una tabella SELECT * FROM tabella_esempio; • selezionare solo alcune colonne di una tabella SELECT cognome, nome • FROM tabella_esempio; selezionare solo alcuni record (righe) dalla tabella SELECT cognome, nome FROM tabella_esempio WHERE cognome=”paperino” OR id < 100; Visualizzazione di una tabella Nella nostra pagina PHP, dovremo innanzitutto: aprire la connessione al server MySQL, selezionare il database sul quale vogliamo lavorare, quindi eseguire la richiesta SQL per selezionare tutti i dati presenti nella tabella, e rappresentarli tutti formattando una tabella HTML. Ma procediamo con ordine. La parte iniziale corrisponderà a qualcosa del tipo: <?php $username="user2442453"; // nome utente MySQL $password="pippo123"; // password MySQL $hostname="localhost"; // ip o nome del server su cui gira MySQL $conn = new mysqli($hostname, $username, $password, $database ); ?> <html> <body> <table border=1> <?php //qua inseriremo tutto il codice (sotto riportato) che estrae i dati dal database ?> </table> </body> </html> Ora dovremo eseguire la prima richiesta al database sfruttando la connessione creata ed ottenendo un nuovo oggetto $ris $ris = $conn->query("SELECT * FROM tabella_esempio;"); $n = $ris->num_rows ; Possiamo controllare quanto risultati(quante righe) otteniamo dalla nostra richiesta accedendo ad una variabile dell'oggetto $ris: $num = $ris->num_rows ; e quindi andare a selezionare una riga alla volta usando il metodo fetch_assoc ell'oggetto $ris otteniamo un array ($row) con un valore per ogni campo (colonna) della tabella. Usando il comodissimo ciclo foreach del PHP possiamo quindi riassumere questa parte nel seguente codice: for($i=0; $i<$num; $i++){ // da 0 al numero dei risultati echo "<tr>\n"; $row=$ris->fetch_assoc(); // seleziono la riga successiva del risultato foreach($row // per ogni elemento $val dell'array $row as $campo => $val){ echo "<td> $val</td>\n"; // stampo la cella in formato html }; echo "</tr>\n"; }; Volendo è possibile anche visualizzare l'intestazione della tabella, elencando i nomi delle colonne. Basterà semplicemente stampare il nome del campo prima di stampare la prima riga, ovvero aggiungendo prima del ciclo foreach del codice soprastante le seguenti istruzioni: if($i==0){ echo "<tr>\n"; foreach($row as $campo => $val){ echo "<th>$campo</th>\n"; // per ogni elemento $val dell'array $row // stampo la cella in formato html }; echo "</tr>\n"; } Inserimento di un nuovo record Per inserire un nuovo record sono necessarie 2 pagine: una prima pagina HTML contenente un form con i campi di input opportuni. È indispensabile che ogni campo di input abbia specificato l'attributo name. È altresì importante che l'attributo action del tag form rimandi alla seconda pagina. pagina_uno.html: <form action="pagina_due.php" method="get"> Inserisci il tuo nome <input type="text" name="nome" value =""> [...] </form> La seconda pagina dovrà invece recuperare i dati del suddetto form e inserirli nel database eseguendo l'opportuna query. Le variabili del form sono accessibili tramite i vettori $_REQUEST["nome_variabile"]. La stringa che viene passata al metodo query sarà costruita concatenando con l'operatore “punto” i vari pezzi della stringa SQL con le variabili usate. L'attributo affected_rows mi permetterà di conoscere il numero di record inseriti (o eventualmente modificati/eliminati). pagina_due.php: <?php [ mi connetto al database come sopra descritto ] $conn->query("INSERT INTO tabella_esempio (nome) VALUES ('".$_REQUEST["nome"]."')" ); echo "Hai inserito ". $conn->affected_rows . " nuovi record "; ?> Eliminazione record Riprendendo la pagina che stampa l'elenco di elementi in tabella possiamo aggiungere una colonna ove viene inserito un link per eliminare/modificare il record selezionato. Basterà semplicemente aggiungere una colonna stampando un link ad una pagina che si curerà dell'eliminazione del record nota la relativa chiave primaria. Aggiungerò quindi dopo l'istruzione fetch_assoc del primo esempio sopra mostrato una cosa del genere: echo “<td><a href='cancella.php?id=” . row[“id”] . “'>Elimina</a></td>”; A questo punto sarà necessario creare la pagina cancella.php che riceverà il parametro $_REQEUST[“id”]. Dopo aver aperto la connessione al database si procederà eseguendo l'opportuna query sql : <?php [ mi connetto al database come sopra descritto ] $conn->query("DELETE FROM tabella_esempio WHERE id = '".$_REQUEST["id"]."')" ); echo "Hai eliminato ". $conn->affected_rows . " record "; ?> Modifica di un record Si procede come al paragrafo precedente aggiungendo un ulteriore link alla tabella: echo “<td><a href='modifica.php?id=” . row[“id”] . “'>Modifica</a></td>”; La pagina modifica.php conterrà gli stessi elementi di pagina_uno.html. I vari campi di input dovranno però assumer un valore di default corrispondente a quello del record selezionato. Per far ciò sarà necessario estrarre dal database il record relativo all'id richiesto eseguendo la query $ris $row echo echo = $conn->query("SELECT * FROM tabella_esempio WHERE id = “ . $_REQUEST[“id“] = $ris->fetch_assoc(); “Id: <input name ='nome' type=”hidden” value ='” . $row['id'] . “' > “; “Nome: <input name ='nome' type=”text” value ='” . $row['nome'] . “' > “; . “;"); La seconda pagina dovrà non tanto inserire il dato bensì aggiornare il record già presente nel database. Il form di modifica.php dovrà pertanto puntare a un'altra pagina modifica_due.php contenente la seguente istruzione SQL: <?php [ mi connetto al database come sopra descritto ] $conn->query("UPDATE tabella_esempio (nome) SET nome ='".$_REQUEST["nome"]."' WHERE id='".$_REQUEST["id"]."';)” ); echo "Hai modificato ". $conn->affected_rows . " nuovi record "; ?> Compiti 1. Crea una tabella a piacere utilizzando un tuo spazio web oppure accedendo al link 2. 3. 4. 5. 6. 7. http://www6.subdomain.com/phpMyAdmin/index.php usando l'username user2442453 e la password pluto123 Allo stesso link potrai inserire anche alcuni dati nella tabella. Crea quindi una pagina PHP per visualizzare i dati contenuti in questa tabella. La pagina php potrai caricarla e testarla al link ftp://www6.subdomain.com (username user2442453 e password pluto123) e visualizzarla al sito http://russell4c.website.org Crea una pagina HTML con un form per inserire i dati richiesti dalla suddetta tabella Crea una seconda pagina che ricevi i dati del suddetto form e li inserisca nel database Alla pagina dell'esercizio 3 aggiungere per ogni riga un pulsante/link che permetta di eliminare il record selezionato (dovrai creare una nuova pagina per cancellare il singolo dato) Alla pagina dell'esercizio 3 aggiungere per ogni riga un pulsante/link che permetta di modificare il singolo record: verrà caricata quindi una pagina come al punto 3, ma con i campi già precompilati, che rimanderà ad una terza pagina che andrà ad effettuare l'update vero e proprio.