Lezioni di PHP - Lezione 3.3 - Lavorare con il database MySQL. Aggiornamento dei dati con UPDATE.
Abbiamo già conosciuto operatori MySQL come SELECT e INSERT INTO, ora è il momento di imparare come aggiornare i dati già inseriti nel database. Per questo utilizzeremo l’operatore SQL UPDATE. Ma prima, modifichiamo il nostro file index.php aggiungendo la gestione di un nuovo percorso. Trova questo codice:
if( $_GET['admin'] == 1 ){ // se esiste nel URL la variabile admin
print $obj->display_admin(); // se esiste la variabile, mostra il modulo
}else{
print $obj->display_public(); // se la variabile non esiste, mostra i messaggi
}
E sostituiscilo con il seguente codice:
switch ($_GET['admin']){
case 'add':
print $obj->display_admin(); // se la variabile è add, mostra il modulo di aggiunta
break;
case 'update':
print $obj->display_update(); // se la variabile è update, mostra il modulo di modifica
break;
default:
print $obj->display_public(); // se la variabile non esiste, mostra i messaggi
}
Ho sostituito l’istruzione if con switch, che consente di gestire più valori della variabile $_GET['admin']. In futuro ne aggiungeremo altri, come delete. Per ora, ho cambiato il valore 1 in add e aggiunto un nuovo caso update. Poiché ho cambiato 1 in add, dobbiamo anche modificare i link nel file simpleCMS.php:
$content .= '<p><a href="/index.php?admin=1">Aggiungi messaggio</a></p>';
Sostituiscilo con:
$content .= '<p><a href="/index.php?admin=add">Aggiungi messaggio</a></p>';
Dobbiamo anche aggiungere un nuovo metodo display_update(), che verrà richiamato quando nella richiesta GET la variabile admin avrà valore update. Aggiungiamo questo nuovo metodo:
public function display_update(){
}
Abbiamo creato la gestione del percorso che richiama il nostro nuovo metodo display_update(). Ora restano da aggiungere i link che lo attivano e da implementarne il codice.
Pensiamo prima a come realizzeremo l’aggiornamento dei record. Sarà necessario eseguire una query nel database con una condizione WHERE, per specificare con precisione quale record aggiornare. Possiamo farlo indicando l’id del record — nel nostro caso, la colonna mid. Quindi dobbiamo passare il valore mid al metodo display_update(). Possiamo farlo passando il parametro nella richiesta GET insieme a admin=update, ad esempio:
http://test/index.php?admin=update&mid=3
Oppure possiamo passarlo come parametro del metodo display_update():
public function display_update($mid){
}
In tal caso, il metodo verrà richiamato così:
switch ($_GET['admin']){
case 'add':
print $obj->display_admin(); // se la variabile è add, mostra il modulo di aggiunta
break;
case 'update':
$mid = 1; // oppure qui possiamo inserire $_GET['mid']
print $obj->display_update($mid); // se la variabile è update, mostra il modulo di modifica
break;
default:
print $obj->display_public(); // se la variabile non esiste, mostra i messaggi
}
In ogni caso, dobbiamo passare il valore di mid, e la soluzione più semplice è farlo tramite la richiesta GET.
public function display_update(){
$message_id = $_GET['mid'];
}
In questo modo passiamo il valore di mid. Ma cosa succede se questo valore non è presente nella richiesta GET? Dobbiamo verificarlo.
public function display_update(){
$message_id = $_GET['mid']; // salviamo mid nella variabile
if(!empty($message_id)){
}else{
$content .= '<p>Nessun valore mid!</p>';
$content .= '<p><a href="/index.php">Torna alla home</a></p>';
}
return $content;
}
Ora, se nella richiesta GET c’è admin=update ma non mid, apparirà una pagina con un link per tornare alla home.
http://test/index.php?admin=update
A questo punto dobbiamo aggiungere i link di modifica ai messaggi. Modifichiamo quindi il metodo display_public() per includerli:
public function display_public() { // metodo per mostrare i messaggi
$content = '';
$sql = 'SELECT * FROM Messages ORDER BY mid DESC'; // query di selezione
$result = mysql_query($sql) or die(mysql_error()); // salviamo il risultato della query
while($row = mysql_fetch_array($result)){ // il risultato deve essere elaborato con mysql_fetch_array()
$content .= '<div class="post">'; // div che avvolge il record
$content .= '<span class="time">#' . $row['mid'] . ' del ' . date('d-m-Y', $row['created']) . '</span><h2>' . $row['title'] . '</h2>'; // mostra data e titolo
$content .= '<p>' . $row['bodytext'] . '</p>'; // mostra il testo del messaggio
$content .= '<p><a href="/index.php?admin=update&mid=' . $row['mid'] . '">Modifica messaggio</a>'; // aggiunge il link per modificare il messaggio
$content .= '</div>'; // fine del div
}
$content .= '<p><a href="/index.php?admin=add">Aggiungi messaggio</a></p>';
return $content;
}
Ora sotto ogni messaggio ci sarà un link per modificarlo. Il modulo di modifica sarà visualizzato tramite il metodo display_update(). Scriviamo ora il codice per questo metodo. Il modulo sarà simile a quello per l’aggiunta, ma includerà i valori esistenti del messaggio dal database e un campo nascosto con il valore mid.
public function display_update(){
$message_id = $_GET['mid']; // salviamo mid nella variabile
if(!empty($message_id)){
$result = mysql_query('SELECT * FROM Messages WHERE mid='.$message_id); // recuperiamo il record con mid corrispondente
$message = mysql_fetch_object($result); // elaboriamo il risultato
$content = '';
$content .= '<form action="/index.php?admin=update" method="post">'; // inviamo i dati al medesimo script
$content .= '<label for="title">Nome:</label><br />';
$content .= '<input name="title" id="title" type="text" maxlength="150" value=' . $message->title .' />'; // valore del titolo
$content .= '<div class="clear"></div>';
$content .= '<input name="mid" id="mid" type="hidden" value="'.$message->mid.'" />'; // campo nascosto con mid
$content .= '<label for="bodytext">Messaggio:</label><br />';
$content .= '<textarea name="bodytext" id="bodytext">'. $message->bodytext .'</textarea>'; // testo del messaggio
$content .= '<div class="clear"></div>';
$content .= '<input type="submit" value="Salva" />';
$content .= '</form>';
$content .= '<p><a href="/index.php">Torna alla home</a></p>';
}else{
if (!empty($_POST)) { // controlliamo i dati inviati
print_r($_POST); // stampiamo l’array post
$content .= '<p><a href="/index.php">Torna alla home</a></p>';
}else{
$content .= '<p>Nessun valore mid!</p>';
$content .= '<p><a href="/index.php">Torna alla home</a></p>';
}
}
return $content;
}
Come indicato nei commenti, la forma è quasi identica a quella per l’inserimento. Ora gestiamo i dati inviati tramite POST.
Array(
[title] => asdf
[mid] => 1
[bodytext] => asdfasf
)
Ecco l’array che riceviamo. È simile a quello per l’inserimento, con l’aggiunta di mid. Scriviamo la logica per aggiornare i dati con la query UPDATE:
public function display_update(){
$message_id = $_GET['mid']; // salviamo mid nella variabile
if(!empty($message_id)){
$result = mysql_query('SELECT * FROM Messages WHERE mid='.$message_id);
$message = mysql_fetch_object($result);
$content = '';
$content .= '<form action="/index.php?admin=update" method="post">';
$content .= '<label for="title">Nome:</label><br />';
$content .= '<input name="title" id="title" type="text" maxlength="150" value=' . $message->title .' />';
$content .= '<div class="clear"></div>';
$content .= '<input name="mid" id="mid" type="hidden" value="'.$message->mid.'" />';
$content .= '<label for="bodytext">Messaggio:</label><br />';
$content .= '<textarea name="bodytext" id="bodytext">'. $message->bodytext .'</textarea>';
$content .= '<div class="clear"></div>';
$content .= '<input type="submit" value="Salva" />';
$content .= '</form>';
$content .= '<p><a href="/index.php">Torna alla home</a></p>';
}else{
if (!empty($_POST)) { // gestiamo i dati inviati
mysql_query('UPDATE Messages SET title="'.$_POST["title"].'", bodytext="'.$_POST["bodytext"].'" WHERE mid='.$_POST["mid"]);
$content .= '<p>Messaggio aggiornato!</p>';
$content .= '<p><a href="/index.php#mid-'.$_POST['mid'].'">Vai al messaggio</a></p>';
}else{
$content .= '<p>Nessun valore mid!</p>';
$content .= '<p><a href="/index.php">Torna alla home</a></p>';
}
}
return $content;
}
Ecco tutto il codice del nostro metodo display_update(). Vediamo ora com’è strutturata una query UPDATE:
Per prima cosa c’è l’operatore UPDATE, seguito dal nome della tabella. Dopo il nome della tabella scriviamo l’operatore SET, e dopo di esso indichiamo a quali valori devono essere aggiornati i campi. Poi aggiungiamo la condizione con WHERE, che specifica quale record aggiornare (in questo caso, dove mid è uguale al valore desiderato). Più avanti preparerò una panoramica di tutti gli operatori MySQL, ma questa lezione è pensata soprattutto per chi ha appena iniziato a studiare PHP e MySQL.