DSDS - ps, Opgavesæt 9

Sidst opdateret 30-10-2007

DSDS

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

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:

  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 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!

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 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:

Opgave B (30 procent) - Visning af kommentarer

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.

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 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:

Se eventuelt tegningen i opgave D.

PHP-filen 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.

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:

Comments

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.

Filen comment_delete_form.php

Her 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.

Filen 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.


Martin Elsman - mael@itu.dk
Jonas Holbech - holbech@itu.dk

Valid HTML 4.01 Transitional