Opgavesæt 8: Kommentarservice - databasetransaktioner via web-forms

for Databasestøttet Webpublicering

Fra opgavesæt af Martin Elsman og Niels Hallenberg sidst rettet 21. oktober, 2002


I denne øvelse skal du konstruere en kommentarservice, som giver læsere af dine sider på Internettet mulighed for at kommentere siderne. Servicen implementeres på dit sædvanlige website
www.it-c.dk/~[ditloginnavn]/w2/oevelse8/

, men der er mulighed for at siderne der kommenteres er placeret andre steder på Internettet.

Øvelsen er opdelt i fire opgaver:

  1. Konstruktion af datamodel og indsættelse af testdata
  2. Mulighed for visning af kommentarer
  3. Mulighed for indtastning af nye kommentarer
  4. Mulighed for sletning af kommentarer (ved brug af password)

Den første opgave handler udelukkende om SQL og om oprettelse af data i din MySQL-database via brugergrænsefladen på mysql.it-c.dk/myadmin. De tre sidste opgaver har til formål at tilgå databasen via en browser på Internettet. Lige som i det sidste opgavesæt skal du skrive SQL-kommandoer, som via PHP-programmer på webserveren sendes til mysql.it-c.dk. Tilsvarende skal du skrive PHP-kode som genererer HTML-og derved viser de 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 til én og kun én url.

Det er vigtigt at forstå, at denne kommentar-service kan håndtere kommentarer for et vilkårligt antal HTML-sider!

I opgavesættet lægges er vægt på:

- at ALLE mysql-operationer valideres, og giver meddelelse ved fejl. Dvs efter hver af PHP-funktionerne mysql_connect(), mysql_select_db(), mysql_query(), mysql_close() skal der testes for om de returnerer FALSE.
- at man ALDRIG må sende ufuldstændig html til brugeren (heller ikke
ved die() eller andre måder at fejlmeddele på.

Spørgeskema

Opgave A (20 procent) - Datamodellen

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:

Du skal nu oprette comments-tabellen i din MySQL-database. Login på mysql.it-c.dk/myadmin og indtast her din create table-kommando.

Indsæt nu en kommentar i tabellen.

  insert into comments (url, name, email, text)
  values ('www.it-c.dk/~[ditloginnavn]/et/eller/andet/', 
          'Et Skribentnavn', 'skribent@nn.dk', 'Virkelig god side!');

Bemærk:
- feltet id har attributten AUTO_INCREMENT og indsættes derfor automatisk
- feltet insertdate har datatypen TIMESTAMP som tilsvarende sørger for at data tilføjes ved insert.

Som besvarelse af opgaven skal du gemme din create table-kommando og din version af insert-kommandoen i filen /oevelse8/comments.sql

Du kan få MyAdmin til at generere begge dele ved at vælge knappen Strukturen og data i tabellens vindue og klikke Udfør. Se ill.:



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 oevelse8/comments.sql. Du skal give eksempler på følgende fire transaktioner. Skriv kommentarer til hver af dem:

Bemærk at TIMESTAMP-formatet skal formateres før det kan vises. Brug denne MySQL-syntaks : SELECT id, url date_format(insertdate,'%m %e, %Y')...etc... eller læs videre på www.mysql.com.

Note: Se de forskellige syntakser der findes for at skrive kommentarer i MySQLs SQL-kommandoer:
 http://www.mysql.com/doc/en/Comments.html

Opgave B (30 procent) - Visning af kommentarer

Du skal nu konstruere en webside - i form af et PHP-script comments.php. Filen skal kunne vise kommentarer i databasen tilhørende en bestemt url. Dette skal den gøre ved at hente indholdet af tabellen comments ud af databasen og vise dette indhold i form af HTML-kode, som sendes tilbage til brugerens browser.

PHP-filen forventer en form-variabel url som angiver, hvilke kommentarer der skal returneres.

Kommentarerne ønskes opstillet som en ikke-nummereret liste. Her er en skabelon til filen:

Skriv min. en linies overvejelse over, hvad man kan forvente at alle URL'er har til fælles og lad dette være rammen for dit validitetstjek.

Du kan anvende ereg() til at checke syntaksen af form-variablen url (den svære løsning):
( Læs mere om regulære udtryk på
- http://www.php.net/manual/en/function.ereg.php.
- i opgavesæt 5 opg. B
- s. 250 i "Beginning PHP.."

eller du kan validere på om den indsendte url er en streng (og !="" eller !is_numeric)

Du skal returnere en passende tekst i det tilfælde, at der ikke er nogen kommentarer til den angivne url.

Gem filen comments.php i mappen oevelse8/ og indsæt et link til filen fra bunden af din index.html-side

Det skulle nu være muligt via din index.html-side at se kommentaren som du indsatte i tabellen tidligere i opgaven.

Opgave C (30 procent) - Indsættelse af kommentarer

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:

  1. Ændring af comments.php til at give mulighed for indtastning af en kommentar.
  2. Konstruktion af en php-fil comments_add.php til opdatering af databasen ved indtastning af en kommentar.

Ændring af comments.php

Inden du starter på opgaven kopier da filen oevelse8/comments.php til filen oevelse8/comments_backup.php

Du skal nu indsætte en form i filen /oevelse8/comments.php med formfelter til indtastning af email-adresse, navn og brugerens kommentar. Filen comments_add.php bruges som action for formen.

Formen skal have følgende input-felter:


Formen skal sende med POST-metoden

php-filen comments_add.php

Filen comments_add.php forventer name, email, text og url som form-variabler, og skal indsætte dem i tabellen comments, således at kommentaren er registreret til HTML-siden angivet ved url.

Konstruer filen comments_add.php udfra følgende skabelon:

Gem filen i mappen W2/oevelse8/

Afprøv muligheden for at indsætte kommentarer.

Opgave D (20 procent) - Sletning af 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 "Læs eller skriv kommentarer" er et link til comments.php med url lig den HTML-side som kommenteres.

Boksen til højre viser resultatet (HTML-siden) af comments.php, hvor man bl.a. har mulighed for at klikke på linket "Slet". Linket kalder php-programmet delete_form.php med form-variablerne url og id; dvs. unik information på den kommentar som ønskes slettet.

php-programmet delete_form.php returnerer en HTML side med en form, (hvor form-variablerne url og id er skjulte) - HTML siden giver yderligere mulighed for at indtaste dit administratorpassword. Formen kalder php-programmet delete.php, som checker at passwordet er korrekt, og hvis det er tilfældet slettes kommentaren angivet ved id.

Start med at ændre filen comments.php således at der udskrives et "Slet"-link sammen med hver kommentar. Linket kan passende se således ud i php-koden:

  <a href=\"delete_form.php?id=$id&url=$url\">Slet</a>;
Herefter skal du konstruere en fil delete_form.php, som skal spørge brugeren om et password, og en fil delete.php, som skal teste om det indtastede password er korrekt og i så fald slette den udvalgte kommentar. Herefter skal delete.php redirigere brugeren til kommentarsiden.

Filen delete_form.php

Her følger en skabelon til filen:

	writeHTMLHeader
	<form action=\"delete.php\" method = \"get\">
		<input type=\"password\" name=\"password\">
		<input type=\"hidden\" name=\"id\" value=\"$id\">
		<input type=\"hidden\" name=\"url\" value=\"$url\">
<input type=\"submit\" value=\"Slet\"> </form> ... writeHTMLFooter

Filen delete.php

Formålet med filen 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 det som du beslutter dig for.
Her er en skabelon til filen delete.php:

	header("Location: http://www.it_c.dk/~[ditnavn]/w2/oevelse8/comments.php?url=$url")
	exit;
 

Gem filerne i mappen w2/oevelse8


mejner@it-c.dk