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.<?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 <b>$title</b>
$subtitle
$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);
}
?>