Corso Web – Lezione PHP – #9
- Introduzione
- Il problema
- La base di dati
- Il modulo HTML
- Lo script per l’inserimento dati nel database
- Video della Lezione 9
- File SQL di supporto all’esercitazione
Introduzione
In questa lezione, si vuole esaminare l’uso delle pagine web dinamiche in HTML e PHP per effettuare una connessione ad un DBMS molto diffuso MariaDB / Mysql per inserire dati.
Tutte le piattaforme e siti web utilizzano per la memorizzazione dei dati delle basi di dati. I fruitori quando effettuano un ordine su un sito di e-commerce ad esempio eseguono via script server side (in linguaggio PHP o .NET o altri) un’istruzione DML in SQL per l’inserimento dati. Con gli esempi che seguono si vuole appunto procedere all’inserimento di un’istanza o più istanze all’interno della base di dati.
Il problema
Per collegare la base di dati occorre definire un modulo html e il relativo script php di connessione al database. Per prima cosa il database possiede un nome che nel nostro caso è “scuola” e al suo interno varie tabelle fra cui quella oggetto del nostro articolo di nome “alunni” che è caratterizzata da quattro campi cognome, nome, sesso dell’alunno e da un campo intero che è definito come “codice alunni” che è un intero., che rappresenta la chiave primaria della nostra tabella.
Nel modulo html sono predisposti questi quattro campi con relativi controlli HTML due campi di testo, un campo a discesa e un terzo campo di testo di tipo numerico infatti il tag <input> di questo ultimo avrà l’attributo type impostato a “number”. Poi sono presenti i due pulsnati “submit” e “reset”. Per poter lavoare occorre caricare o creare il nostro database sul server DBMS mysql sul nostro calcolatore che è installato mediante il tool Xampp di Apache Frieds la suite che comprende il web server, l’interprete php, il dbms mysql e tanti altri software open source. Lo script php verificherà poi se il “codice alunni“ inserito è già presente nella base di dati mediante la semplice query SQL “SELECT * FROM alunni WHERE cod_alunno=[$campo input di html]”; notare che la dicitura fra “[]” riguarda una variabile php che conterrà il valore del campo inviato tramite html.
Se la query restituisce una riga allora vuol dire che quel codice è già presente, e quindi mediante un “if” verrà eseguita un’altra query “SELECT MAX(cod_alunni) AS cm FROM alunni; che restituirà il valore massimo sulla colonna della tabella “codic alunni”. A quel punto il programma generà un nuovo “codice alunni” che sarà il valore massimo individuato aumentato di 1. Solo dopo questa operazione sarà eseguita una query di “INSERT INTO alunni (cod_alunni,nome,cognome,sesso) VALUES($[variabile codice alunni],$[variabile cognome],$[variabile nome], $[variabile sesso]”, ove fra parentesi quadre sono inserite la variabili PHP ricevute con argomenti del supervettore $_POST contenente i valori dei campi di <input> di html.
La base di dati
La base di dati SQL è possibile scaricarla da questo [link], per utilizzarla basta aprire phpMyAdmin da browser dopo aver avviato sul nostro computer Xampp control center e in particolare il web server Apache e Mysql vedere figura.

Fatto questo l’indirizzo web di phpMyAdmin è http://localhost/phpMyAdmin, e creare un nuovo database di nome “scuola” scegliere. Successivamente scegliere il database creato e scegliere il ilnk in alto importa e selezionare il file SQL dalla cartella ove è stato precedentemente scaricato (in genere la cartella Download). Se l’operazione è andata a buon fine nel Database “scuola” saranno presenti le tabelle e i dati al loro interno.
E’ mostrato in figura l’uso di phpMyAdmin.

Scarica il file SQL da importare per provare l’esercizio
Il modulo html
E’ riportato il codice del modulo HTML:
<!DOCTYPE html>
<htm>
<head>
<meta charset="utf-8">
<title>Modulo di inserimento alunni:</title>
</head>
<body>
<h1>Inserimento nuovo alunno</h1>
<form name=""insertform" action="ins.php" method="post">
<table border="3" style="background-color:yellow;">
<tr>
<td><label for="nome">Nome:</label></td>
<td>
<input type="text" name="nome" id="nome" value="Digita il tuo nome" required maxlength="30">
</td>
</tr>
<tr>
<td><label for="cognome">Cognome:</label></td>
<td>
<input type="text" name="cognome" id="cognome" value="Digita il tuo cognome" required maxlength="30">
</td>
</tr>
<tr>
<td><label for="sesso">Sesso:</label></td>
<td>
<select name="sesso" id="sesso" >
<option value="M">M</option>
<option value="F">F</option>
</select>
</td>
</tr>
<tr>
<td><label for="codice">Codice Studente:</label></td>
<td><input type=number" name="codice" id="codice" value="1" required></td>
</tr>
<tr>
<td>
<input type="submit" style="background-color: green;"" name="invia" id="invia" value="Conferma ">
</td>
<td>
<input type="reset" style="background-color: red;" name="cancella" id="cancella" value="Cancella dati">
</td>
</tr>
</table>
<form></body>
</html>
Nel form sono impostati gli attributi “name”, “action” e “method” che sono necessari all’esecuzione dello script php il cui URL è contenuto nell’attributo “action”. I campi di input sono tutti obbligatori tranne il campo “<select>”. Per rendere obbligatorio tale campo basta aggiungere l’attributo “required”.
Nel browser il form sarà visualizzato come mostrato in figura sotto.

Lo script di inserimento dati nel database
Il modulo html richiama lo script php che verifica prima che sia possibile eseguire la connessione al database, poi cattura nelle variabili $nome, $cognome, $sesso, $codice_m i dati inseriti nel form html, e esegue una prima query di selezione per individuare eventuali righe nella tabella $tb (la tabella alunni) se esiste un’istanza con quel codice alunno specifico. In caso affermativo esegue una seconda query con la funzione di aggregazione MAX per estrapolare il valore massimo della colonna “cod_alunni” nel database e incrementa il nuovo codice alunni di un’unità rispetto a questo valore massimo.
In seguito esegue una query DML per inserire i dati nella tabella e chiude la connessione. In caso di fallimento della la connessione o fallisce l’esecuzione della query lo script ferma l’esecuzione con una serie di istruzioni “die(messaggio).
Il codice PHP è:
<?php
$host="localhost";
$user="root";
$pwd="";
$db="scuola";
$tb="alunni";
$nome=$_POST['nome'];
$cognome=$_POST['cognome'];
$sesso=$_POST['sesso'];
$codice_m=(int)$_POST['codice'];
$conn=mysqli_connect($host,$user,$pwd,$db);
if($conn)
{
// $sql1="SELECT MAX(cod_alunni) AS cm FROM alunni; ";
//echo $sql1."<br>";
$sql2="SELECT * FROM alunni WHERE cod_alunni=$codice_m;";
$q1=mysqli_query($conn,$sql2
$n=mysqli_num_rows($q1);
if ($n>0)
{
$sql1="SELECT MAX(cod_alunni) AS cm FROM alunni; ";
$q1=mysqli_query($conn,$sql1);
$v=mysqli_fetch_array($q1);
//var_dump($v);
$k=$v['cm'];
$codice_m=$k+1;
//echo $codice_m."<br>";
}
$sql="insert into $tb (cod_alunni,cognome,nome,sesso) VALUES
'$codice_m','$cognome','$nome','$sesso');";
$q=mysqli_query($conn,$sql);
echo $sql."<br>";
if ($q)
echo "<h2>Inserimento riuscito<br></h2>";
else
{
echo var_dump($q);
die( "<h2>Errore nell'inserimento dei dati o nella query </h2>");
}
}
mysqli_close($conn);
Un ulteriore miglioramento (update)
Lo script in precedenza non gestisce l’inserimento di caratteri con “’” nella stringa. Ad esempio un cognome può avere un apostrofo.
Per risolvere questo grave problema è possibile apportare allo script la seguente aggiunta di codice prima di eseguire l’operazione di inserimento:
$esito=0;
for ($k=0;$k<strlen($cognome);$k++)
{
if ($cognome[$k]=='\'')
$esito=1;
}
if ($esito==1)
{
$tmp=str_replace("'","''",$cognome);
$cognome=$tmp;
echo $cognome."<br>";
}
La prova di esecuzione dello script è mostrata in figura sotto.

Un ulteriore miglioramento (update)
Lo script in precedenza non gestisce l’inserimento di caratteri con “’” nella stringa. Ad esempio un cognome può avere un apostrofo.
Per risolvere questo grave problema è possibile apportare allo script la seguente aggiunta di codice prima di eseguire l’operazione di inserimento:
$esito=0;
for ($k=0;$k<strlen($cognome);$k++)
{
if ($cognome[$k]=='\'')
$esito=1;
}
if ($esito==1)
{
$tmp=str_replace("'","''",$cognome);
$cognome=$tmp;
echo $cognome."<br>";
}
Nell’anteprima è mostrato come viene gestito l’inserimento di dati con “’” e la relativa query SQL corretta che deve essere gestita. Il codice sotto mostrato realizza la funzione specifica mediante una manipolazione delle stringhe “str_repplace”.
Video della lezione #9