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.