Esercizio - Improveded microBlog

Fai in modo che ogni post del microBlog comprenda anche una immagine (file grafico), che risulti associata con il post. Devi anche adeguare il pannello di amministrazione (Edit + Delete).

Il microBlog è composto da due file index.php e aiuto.php. index.php contiene le istruzioni per il funzionamento principale del microBlog: le diverse visualizzazione, e come e quando richiamare le diverse funzionalità che le realizzano; aiuto.php contiene le definizioni della funzionalità. Prima domanda da porsi: cosa si deve modificare in index.php, per realizzare la modifica richiesta? Seconda domanda da porsi: quali delle funzionalità definite in aiuto.php devono essere modificate per permettere di gestire anche un campo immagine nei post?

Alla prima domanda è facile rispondere: niente (ma dovete capire perché). Alla seconda vediamo sotto qualche suggerimento.

ATTENZIONE, Per il punto centrale per risolvere l'esercizio, studia con attenzione PHP 5 File Upload.

Come modificare aiuto.php

<?php

/* 	le funzionalità definite per realizzare il microBlog sono,  vediamo quali probabilmente dobbiamo modificare:

        connect()         - indica ad Apache di connettersi a mySQL
   	Cambiare qualcosa? Forse no, questa semplicemente realizza la conessioen al DB;
display_public() - cra il codice html per mostrare lato client i post salvati nel db Cambiare qualcosa? Forse si, se ora vogliamo mostrare anche l'immagine di ogni post;
display_form() - per mostrare il modulo da compilare lato client per scrivere un post Cambiare qualcosa? Forse si, il modulo deve mostrare ora un campo per permettetre l'upload di un file grafico. Per fortuna html prevede ciò (trova come)
write() - per salvare i dati provenienti dal modulo (= un post) nella tabella del database Cambiare qualcosa? SI, questa la modifica più complessa. In breve devi: (*) creare una cartella nel web server dove salvare le immagini; (**) capire come l'ingegneria di http e di PHP trasmette le informazioni dal client al server (cerca di capire cosa sia $_FILES); (***) modificare le tabella del db in modo che per ogni record (post) si possa archiviare anche il nome del file uploaded;
display_admin() - per mostrare i post esistenti nel db, con icone/pulsanti di Edit e Delete Cambiare qualcosa? Dipende, Si se vuoi mostrare l'immagine di ogni post nel pagina di amministrazione;
display_edit() - per mostrare il modulo da compilare per editare un post Cambiare qualcosa? Si, il modulo di editing deve mostrare l'immagine e permettere di associarne un altra al post;
update() - per aggiornare un post nella tabella del database Cambiare qualcosa? Si, la query di update deve essere modificata essendo stata modificata la tabella del db;
delete() - per eliminare un post dalla tabella del database Cambiare qualcosa? Forse No, l'azione di delete cancella un record, qualsiasi siano i campi definiti
Vediamo meglio */ function connect($host,$username,$password,$db,$port='3306') { $link = mysqli_connect($host,$username,$password,$db,$port) or die(" Could not connect. " . mysqli_error()); return $link; } /* display_public($table, $link) - - */ function display_public($link,$table) { $q = "SELECT * FROM ".$table." ORDER BY created"; $r = mysqli_query($link,$q); $entry_display=''; if ( $r !== false && mysqli_num_rows($r) > 0 ) { while ( $a = mysqli_fetch_assoc($r) ) { $title = stripslashes($a['title']); $subtitle = stripslashes($a['subtitle']); $bodytext = stripslashes($a['bodytext']); $firma = stripslashes($a['firma']); $comment = stripslashes($a['comment']); /* Attenzione, qui sopra avrai un nuovo caso, corrispondente al nuovo campo della tabella del db, e qui sotto dovrai inserire un frammento di html <img>...
*/ $entry_display .= " <div class= \"post\"> <h2> $title </h2> <p> $subtitle </p> <p> $bodytext </p> <p> $comment </p> <p id=\"firma\"> $firma </p> </div> "; } /* chiudo ciclo WHILE */ } /* chiudo IF */ else { $entry_display = ' <h2> This Page Is Under Construction </h2> <p> No entries have been made on this page. Please check back soon, or click the link below to add an entry! </p> '; } // chiudo ELSE $entry_display .= <<<ADMIN_OPTION <p class="admin_link"> <a href="{$_SERVER['PHP_SELF']}?admin=1">Add a New Post</a> </p> <p class="admin_link"> <a href="{$_SERVER['PHP_SELF']}?admin=3">Admin posts</a> </p> ADMIN_OPTION; return $entry_display; } /* display_form() - - */ function display_form() { /* Attenzione, devi scrivere il codice tale che il modulo comprenda anche un campo+pulsate per l'upload di un file. Vedi qui Nota: non funzionarà: se non metti anche < ... enctype="multipart/form-data" ... >
*/ return <<<ADMIN_FORM <form action="{$_SERVER['PHP_SELF']}?admin=2" method="post"> <label for="title">Title:</label><br /> <input name="title" id="title" type="text" maxlength="150" /> <div class="clear"></div> <label for="subtitle">SubTitle:</label><br /> <input name="subtitle" id="subtitle" type="text" maxlength="150" /> <div class="clear"></div> <label for="bodytext">Body Text:</label><br /> <textarea name="bodytext" id="bodytext"></textarea> <div class="clear"></div> <label for="comment">Comment:</label><br /> <input name="comment" id="comment" type="text" maxlength="75" /> <div class="clear"></div> <label for="firma">Firma:</label><br /> <input name="firma" id="firma" type="text" maxlength="75" /> <div class="clear"></div> <input type="submit" value="Create and Sign This Entry! " /> </form> <br /> <a href="index.php?admin=0">Back to Home, Ciao</a> ADMIN_FORM; } /* function write($p, $table, $link) - - */ function write($p, $table, $link) { /* ATTENZIONE, Qui il punto più difficile. Studia con attenzione PHP 5 File Upload. Nota: A w3schools.com trovi come salvare il file uploaded dal lato client, il punto (**) sopra. */ $pp = array(); foreach ($p as $key=>$value){if ( $p[$key] ){ $pp[$key]= mysqli_real_escape_string($link, $p[$key]);}} if ( $pp['title'] && $pp['subtitle'] && $pp['firma']) { $created = date("m.d.y"); /* ATTENZIONE, Qui devi modificare la query: devi considerare il nome del file uploaded - che trovi in $FILES[' ...']? - e inserirlo al posto giusto nella query! */ $sql = "INSERT INTO `".$table."` (`title`, `subtitle`, `bodytext`, `firma`, `comment`, `created`) VALUES ('".$pp['title']."', '".$pp['subtitle']."', '".$pp['bodytext']."', '".$pp['firma']."', '".$pp['comment']."', '".$created."')"; echo $sql; return mysqli_query($link, $sql); } else { return false; } } /* display_admin($link, $table) - - */ function display_admin($link, $table) { /* Qui modifiche simili a quella di display_public sopra */ $q = "SELECT * FROM ".$table." ORDER BY created DESC LIMIT 10"; $r = mysqli_query($link, $q); $entry_display=''; if ( $r !== false && mysqli_num_rows($r) > 0 ) { while ( $a = mysqli_fetch_assoc($r) ) { $id = stripslashes($a['id']); $title = stripslashes($a['title']); $subtitle = stripslashes($a['subtitle']); $bodytext = stripslashes($a['bodytext']); $firma = stripslashes($a['firma']); $comment = stripslashes($a['comment']); $entry_display .= <<<ENTRY_DISPLAY <div class="post"> <p> $id &nbsp;<b>$title</b> &nbsp; $subtitle &nbsp; $firma <a href="{$_SERVER['PHP_SELF']}?admin=4&id=$id"><img src="if_Edit_Yes_58665.png" width="25px"></a> <a href="{$_SERVER['PHP_SELF']}?admin=6&id=$id"><img src="if_Symbol_-_Delete_58688.png" width="25px"></a> </p> </div> ENTRY_DISPLAY; } } else { $entry_display = <<<ENTRY_DISPLAY <p> Non ci sono ancora post.<br> </p> ENTRY_DISPLAY; } $entry_display .= <<<ADMIN_OPTION <a href="index.php?admin=0">Back to Home, Ciao</a> ADMIN_OPTION; return $entry_display; } /* display_edit($link, $table, $id) - - elabora codice html per modulo per editare post la cui id è $id $table = tabella $link = connessione $id = id post da editare */ function display_edit($link, $table, $id){ /* Qui modifiche simili a quella di display_form sopra, ma devi mostrare anche l'immagine già associata al post da editare */ $q = "SELECT * FROM ".$table." WHERE `id`='".$id."' ORDER BY created DESC"; //echo $q; // to debug, mostra query $r = mysqli_query($link, $q); $entry_display=''; if ( $r !== false && mysqli_num_rows($r) > 0 ) { while ( $a = mysqli_fetch_assoc($r) ) { $id = stripslashes($a['id']); $title = stripslashes($a['title']); $subtitle = stripslashes($a['subtitle']); $bodytext = stripslashes($a['bodytext']); $firma = stripslashes($a['firma']); $comment = stripslashes($a['comment']); $entry_display .=<<<ADMIN_FORM <h3> Edita record con id: $id</h3> <form action="{$_SERVER['PHP_SELF']}?admin=5" method="post"> <label for="title">Title:</label><br /> <input name="title" id="title" type="text" maxlength="150" value="$title"/> <div class="clear"></div> <label for="subtitle">SubTitle:</label><br /> <input name="subtitle" id="subtitle" type="text" maxlength="150" value="$subtitle"/> <div class="clear"></div> <label for="bodytext">Body Text:</label><br /> <textarea name="bodytext" id="bodytext">$bodytext</textarea> <div class="clear"></div> <label for="comment">Comment:</label><br /> <input name="comment" id="comment" type="text" maxlength="75" value="$comment"/> <div class="clear"></div> <label for="firma">Firma:</label><br /> <input name="firma" id="firma" type="text" maxlength="75" value="$firma"/> <div class="clear"></div> <input type="hidden" name="id" value="$id" /> <input type="submit" value="Edita la pagina! " /> </form> ADMIN_FORM; } } else { $entry_display = <<<ENTRY_DISPLAY <h2> Ops, non vedo il post da editare con id $id</h2> ENTRY_DISPLAY; } return $entry_display; } /* function update($p, $id, $table, $link) - - */ function update($p, $id, $table, $link) { /* Qui modifiche simili a quella di write() sopra, quindi da fare con ATTENZIONE */ $pp = array(); foreach ($p as $key=>$value){if ( $p[$key] ){ $pp[$key]= mysqli_real_escape_string($link, $p[$key]);}} /* Come in write(), qui devi modificare la query */ $sql = "UPDATE `".$table."` SET `title` = '".$pp['title']."', `subtitle` = '".$pp['subtitle']."', `bodytext` = '".$pp['bodytext']."', `comment` = '".$pp['comment']."', `firma` = '".$pp['firma']."' WHERE `".$table."`.`id` = ".$id.""; return mysqli_query($link, $sql); } /* function delete($id, $table, $link) - - */ function delete($id, $table, $link) { $sql = "DELETE FROM `".$table."` WHERE `".$table."`.`id` = $id"; return mysqli_query($link, $sql); } ?>

Accademia Albertina Torino, Scuola NTA, a.a. 2024-2025
Insegnamenti ABTEC40
a cura di mario chiari