| Fra opgavesæt af Martin Elsman og Niels Hallenberg | sidst rettet 5. nov, 2002 |
Du må selv bestemme det emne som skal klassificeres, dvs. det behøver ikke at være restauranter.
Hovedsiden for servicen som ønskes konstrueret skal give et overblik over restauranter, sorteret efter brugeres vurderinger af kvaliteten. Indgangsbilledet kan eksempelvis se således ud:
En bruger har mulighed for
Ved et klik på linket med restaurantens navn ses de kommentarer som brugere af servicen har skrevet om restauranten:
Restauranterne klassificeres løbende efter hvordan brugere af systemet vurderer restauranterne. Der er ingen brugerkontrol, og dermed heller ikke kontrol med om en bruger rater den samme restaurant flere gange. Fra hovedsiden skal der således være links til en side til indtastning af kommentar og rating for en restaurant. Der skal også være en mulighed for at rate, dvs. oprette, en ny restaurant.
Øvelsen er opdelt i de fire sædvanlige opgaver:
Den anden tabel skal knytte brugerindtastede kommentarer og ratings til restauranterne. Der skal som minimum være mulighed for at gemme en kommentartekst, navn, email og rating.
En datamodel, helt uden detaljer, kan f.eks. se således ud:
Du skal huske at overveje
Restaurant men ikke nødvendigvis i
tabellen svarende til Rating.
varchar(...) og integer.
Det er f.eks. nærliggende at have et felt rating af type integer
som angiver antal stjerner restauranten får.
not null.
unique
Gem din datamodel i filen oevelse10/rating.sql sammen med sql-kode
for indsættelse af to restauranter med tilhørende klassificeringer i tabellerne.
Endelig skal du udføre sql-kommandoerne
insert into rating (restaurant_id, text, email, fullname, rating) values (1, 'It is a great place for a snack!', 'nh@it.edu', 'Niels Hallenberg', 9);
SELECT restaurant.res_id, restaurant.name, avg(rating) AS average, count(*) AS ratings FROM restaurant LEFT JOIN rating ON restaurant.res_id = rating.res_id GROUP BY restaurant.res_id, restaurant.name ORDER BY average DESCTilpas ovenstående transaktioner til din datamodel og opskriv eksempler på SQL-kommandoer for følgende transaktioner:
select)
Det kan anbefales at du nu sikrer dig - ved brug af MyAdmin - at de ovenstående
transaktioner virker på din datamodel. Specielt er det vigtigt at select
kommandoen, som benytter sig af group by funktionaliteten, virker
efter hensigten; se eventuelt www.mysql.com
for information omkring group by funktionaliteten.
Gem SQL-kommandoerne i en fil oevelse10/transaktioner.sql
Kasserne repræsenterer HTML-kode, som brugeren ser.
Pilene repræsenterer PHP-programmer som f.eks opdaterer databasen og
genererer friske HTML-sider til brugeren
Kasserne i diagrammet repræsenterer det webbaserede rating-systems tilstande for hvilke HTML-kode vises i en brugers browser. Pilene repræsenterer links til en ny tilstand. På hver pil skriver vi navnet på det PHP-program, som vi kalder samt de form-variabler der overføres. Nogle pile repræsenterer transaktioner for hvilke databasen opdateres (se opgave B) og brugeren ser en ændring i sin browser.
Indgangssiden til klassificering af restauranter er vist som en kasse øverst i diagrammet, som skal implementeres som en PHP-fil, idet restauranter hentes fra databasen. De resterende kasser (tilstande) i diagrammet skal også implementeres som PHP-filer, da disse kasser repræsenterer dynamiske sider (d.v.s., hvad brugeren ser i sin browser afhænger af indholdet i databasen og af eventuelle form-argumenter).
Det er din opgave at gøre tegningen ovenfor færdig. Der er to pile, hvor PHP-programmet
rating_add kaldes. Du skal angive de form-variabler der mangler.
Derudover er der en pil, hvor der slet ikke er angivet noget program.
I den vejledende løsning indgår 4 filer:
rating.php, som viser alle restauranter i databasen
restaurant_add.php, som tilføjer en restaurant til databasen,
hvis den ikke findes i forvejen. I den vejledende løsning, checkes først for,
om der findes en form-variabel restaurant_id i hvilket tilfælde,
at navnet på restauranten hentes fra databasen. Hvis restaurant_id
ikke findes, da checkes for om form-variablen name findes. Hvis
name findes, betyder det at en bruger vil oprette en ny restaurant.
Hvis den "nye" restaurant findes i forvejen, så hentes navn og restaurant_id
ud fra databasen. Hvis den "nye" restaurant ikke findes i forvejen, så indsættes
den i databasen. Under alle omstændigheder, så returneres en form til brugeren,
hvor brugeren indtaster sin rating af restauranten. Formen indeholder i alle
tilfælde restaurant_id som skjult variabel.
rating_add.php, som tilføjer en rating til en given restaurant.
restaurant_show.php, som viser alle kommentarer og ratings
til en given restaurant.
Det anbefales, at du laver en tegning svarende til den ovenfor. På alle pile skal der være annoteret en php-fil samt de form-variable, som overføres til php-filen.
Til denne opgave skal du aflevere
oevelse10/struktur.txt,
eller som en tegning svarende til den ovenfor, hvor der på alle pile er noteret
både PHP-program og de form-variable som overføres. Hvis du vælger at aflevere
en tegning, så kan du evt. scanne en tegning skrevet i hånden, og overføre
filen til som oevelse10/struktur.gif.
Det er en god ide at begrænse ratings til tal mellem 0 og 10. Til rapportering af ratings kan følgende php-funktion bruges:
function genstars(n) {
if($n==0) {
echo ""
} else {
echo "*".genstars($n - 1)
}
}
Ved at kalde funktionen genstars med tallet 5 som argument,
returneres en streng bestående af 5 stjerner. Rigtige stjerner såsom
må meget gerne benyttes.
Vink: I filen rating.php har du brug for at afrunde et
kommatal til et heltal. Dette kan du gøre med php-kommandoen round.
Du anvender en select-kommando til at beregne snittet af alle ratings
pr. restaurant. Dette gennemsnit skal omformes til et heltal for at kunne anvende
funktionen genstars. Antag at kommatallet er i variablen $average:
$iAverage = round($average *100),0)