I dette opgavesæt skal du konstruere en kommentarservice, som giver læsere af dine sider på Internettet mulighed for at kommentere siderne. Servicen implementeres ved brug af PHP og MySQL på ITU's web-server, men der er mulighed for at siderne der kommenteres er placeret andre steder på Internettet. Opgavesættet består af fire opgaver:
Den første opgave handler udelukkende om SQL og om oprettelse af data
i MySQL-databasen på maskinen mysql.itu.dk. De tre sidste
opgaver har til formål at tilgå databasen via en browser på
Internettet. Du skal skrive SQL-kommandoer (transaktioner), som via
PHP-scripts på webserveren sendes til MySQL-databasen. Tilsvarende
skal du skrive PHP-kode til HTML-formatering af eksisterende data i
databasen.
Servicen virker ved, at du indsætter et link på de HTML sider som skal
kommenteres. Linket indeholder en form-variabel url der
angiver den side kommentarerne vedrører. Denne url gemmes i databasen
sammen med kommentarerne, således at alle kommentarer er knyttet op på
en og kun en url.
Det er vigtigt at forstå, at denne kommentar-service kan håndtere kommentarer for et vilkårligt antal HTML-sider!
Formålet med denne opgave er at konstruere datamodellen for
kommentarservicen. Datamodellen skal bestå af en enkelt tabel
comments til bruger-indtastede kommentarer knyttet til
html-sider. Tabellen skal have følgende kolonner:
id -- et heltal som unikt identificerer kommentaren;
brug datatype int og MySQL's auto_increment til
generering af unikke heltal ved indsættelse af nye rækkerurl -- url-adressen for siden der kommenteres; højest 200 tegninsertdate -- indsættelsesdato; brug datatypen datetimename -- forfatter til kommentaren; højest 100 tegnemail -- forfatterens email-adresse; højest 100 tegntext -- den egentlige kommentar; brug datatypen text
Du skal nu oprette comments-tabellen i
MySQL-databasen. Indtast din create table-kommando fra
mysql prompten på f.eks. ssh.itu.dk.
Inden du fortsætter med øvelsen skal du indsætte en kommentar i tabellen - udskift login med dit login:
insert into comments (url, insertdate, name, email, text)
values ('http://www.itu.dk/people/login/DSDS/index.html', now(),
'Martin Elsman', 'mael@itu.dk', 'Great page!');
MySQL-funktionen now() returnerer dagsdato.
Som besvarelse af opgaven skal du gemme din create
table-kommando og din version af insert-kommandoen i filen
DSDS/ps9/comments.sql i dit web-bibliotek på ITU's
netværk.
Endelig skal du give mindst 4 bud på fornuftige legale transaktioner
på datamodellen. Opskriv dine bud i form af eksempler på
SQL-kommandoer og gem disse sammen med beskrivende kommentarer i
slutningen af filen DSDS/ps9/comments.sql. Du bør
f.eks. overveje følgende transaktioner:
Du skal nu konstruere en web-transaktion - i form af en PHP-fil
comments.php - til visning af kommentarer tilhørende en
bestemt url. PHP-filen comments.php har til formål at
hente indholdet af tabellen comments ud af databasen og
vise dette indhold i form af HTML-kode, som sendes tilbage til
klienten, en browser.
PHP-filen forventer en form-variabel url, som bestemmer de
kommentarer, der skal returneres.
Kommentarerne ønskes opstillet som en ikke-numereret liste. Her er en
skabelon til filen, hvor biblioteket mydb.php er taget fra
forelæsningsplancherne:
<?php
include "mydb.php";
// Check the validity of the url-address
// ...
mydb_connect();
// The select-query
$rows = mysql_query ("select insertdate, email, name, ...
from ...
where url = ...");
// Loop through the rows
$comments = "";
while ( $row = mysql_fetch_array($rows) ) {
// Append a comment to the PHP-variable $comments
$comments = $comments . "<li> ... \n";
}
// Return a page with the comments to the user - the perfect
// solution returns a message "no reader comments" if there are
// no comments associated with the page
echo "<html>...</html>";
?>
Du bør anvende ereg til at checke syntaksen af
form-variablen url. Ydermere bør der returneres en
passende tekst i det tilfælde, at der ikke er nogen kommentarer til
den angivne url.
Gem filen comments.php i biblioteket
DSDS/ps9/ på ITU's web-server og indsæt et link til
filen fra bunden af din DSDS/index.html-side:
<center> <a href="http://www.itu.dk/people/login/DSDS/ps9/comments.php?url=http://www.itu.dk/people/login/DSDS/index.html">Readers Comments</a> </center>
Det skulle nu være muligt via din index.html-side at se
kommentaren som du indsatte i tabellen tidligere i opgaven.
Vi skal nu give læsere af din index.html-side mulighed
for at indsætte kommentarer til siden. Opgaven deler sig i to dele:
comments.php til at give mulighed for
indtastning af en kommentar.comments_add.php til
opdatering af databasen ved indtastning af en kommentar.comments.php
Inden du starter på opgaven kopier da filen
DSDS/ps9/comments.php til filen
DSDS/ps9/comments_backup.php.
Du skal nu indsætte en form i filen
DSDS/ps9/comments.php med formfelter til
indtastning af email-adresse, navn og den egentlige kommentar. Filen
comments_add.php bruges som action for formen.
Formen skal have følgende input-felter:
urlSe eventuelt tegningen i opgave D.
comments_add.php
Filen comments_add.php forventer name,
email, text og url som
form-variable, og skal indsætte dem i tabellen comments,
således at kommentaren er registreret til web-siden angivet ved
url.
Konstruer filen comments_add.php udfra følgende
skabelon:
<?php
include "mydb.php";
$url = $_REQUEST['...'];
$text = ....
// Test the content of the form variables with ereg
// ...
mydb_connect();
// Insert a row in the comments table
mysql_query ("insert into comments (url, ..., text, insertdate)
values ('$url', ..., '$text', now())");
# Redirect to the Show-comments page
header ("Location: comments.php?url=$url");
?>
Du bør anvende ereg til at
checke dine form-variable.
Bemærk, hvorledes vi anvender header("Location:
comments.php?url=$url") til at returnere resultatet af at køre
comments.php igen, hvilket også inkluderer den nyligt
indsatte kommentar.
Gem filen i biblioteket DSDS/ps9/ i dit web-bibliotek
på ITU's web-server.
Afprøv muligheden for at indsætte kommentarer.
I denne opgave skal du ved brug af en simpel password-mekanisme gøre det muligt for dig som administrator at slette kommentarer til en side. Her er en skitse over udvidelsen:
Det første link "Readers Comments" er et link til
comments.php med url lig den HTML side som
kommenteres.
Boksen til højre viser resultatet af comments.php, hvor
man blandt andet har mulighed for at klikke på linket
delete. Linket henviser til PHP-scriptet
comment_delete_form.php med form-variablerne url og
id, som unikt identificerer den kommentar som ønskes
slettet.
PHP-scriptet delete_form.php returnerer en HTML side
med en form, hvor de to form-variabler url og
id er skjulte samt med mulighed for at indtaste et
password. Formen kalder PHP-scriptet comment_delete.php, som
checker at passwordet er korrekt, og hvis det er tilfældet sletter
kommentaren identificeret ved id.
Start med at ændre filen comments.php således at der
udskrives et delete-link sammen med hver kommentar. Linket kan
passende se således ud i PHP-koden:
<a href=\"comment_delete_form.php?url=$url&id=$id\">delete</a>
Herefter skal du konstruere en fil comment_delete_form.php, som
skal spørge brugeren om et password, og en fil
comment_delete.php, som skal teste om det indtastede password er
korrekt og i så fald slette den udvalgte kommentar; herefter skal
comment_delete.php redirigere brugeren til kommentarsiden.
comment_delete_form.phpHer følger en skabelon til filen:
<?php
// Testing of form-variables `id' and `url'
// ...
// Returning a page to the user
echo "
<html>
<head><title>Comment Service Password Request</title></head>
<body bgcolor=white>
<h2>Comment Service Password Request</h2>
To delete the comment enter the administrator password:
<form action=comment_delete.php>
<input type=password name=password>
<input type=hidden name=url value=\"$url\">
<input type=hidden name=id value=$id><p>
<input type=submit value=\"Delete Comment\">
</form>
<hr>
...
</html>";
?>
Du bør anvende ereg til at checke dine form-variabler.
comment_delete.php
Formålet med filen comment_delete.php er at foretage den endelige
sletning af kommentaren identificeret ved form-variablen
id. Inden kommentaren slettes undersøger vi om passwordet
der blev indtastet passer med et du beslutter dig for. Her er en
skabelon til filen comment_delete.php:
<?php
// Test of form variables `id', `url', and `password'
// ...
if ( $password != "--your password--" ) {
echo "The password you entered is incorrect..."
exit;
}
// The password is correct - connect to the database and delete comment
mydb_connect();
mysql_query ("delete from comments where ...");
// Redirect the user to the comments page
header ("Location: comments.php?url=$url");
?>
Du bør anvende ereg til at checke dine form-variabler.
Gem filerne i biblioteket DSDS/ps9/ i dit
web-bibliotek på ITU's web-server.
Husk at teste dine filer.