Page 1 Page 2 [Kurssidene] [ JBI] [ ] Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006 PHP og databaser IV Eksempel 1: koden for nedtrekksmenyen (kopi av eksempel 3 fra uke 43) Michael Preminger (michaelp@hio.no) Tilbakeblikk Idag Forbindelse mot database Sending av søk Gjennomgang av resultatsett Brukerstyrte søk Søk mot flere tabeller (joins) Fortsettelse grunnleggende kommunikasjon mot databaser: Løsning av oppgave 2 fra uke 43 Oppfrisking av SQL fra vårsemesteret bruk av aliaser for tabellnavn Repetisjon - oppgaver uke 43 Vi har vist hvordan søkeresultat fra databasen kan benyttes for å fylle en nedtrekksmeny. Valget gjort i denne menyen kan brukes for å avgrense et søk, som gir oss bøker skrevet av valgt forfatter. Vi tenker oss et følgende mulig interaksjonsmønster: 1. 2. $sql= <<<SLUTTSQL 3. SELECT Etternavn FROM Forfatter 4.SLUTTSQL; 5. $resultatsett=mysql_query($sql); 6. print <<<ENDFORMSTART 7. <form action="respons.php"> 8. <p> 9. <select name="valgt"> 10.ENDFORMSTART; 11. $enrad=mysql_fetch_assoc($resultatsett); 12. while($enrad!= false){ 13. print <<<OPTIONSLUTT 14. <option>{$enrad['etternavn']}</option> 15.OPTIONSLUTT; 16. $enrad = mysql_fetch_assoc($resultatsett); 17. } //end while 18. print <<<ENDFORMSLUTT 19. </select> 20. </p> 20. <p><input type="submit" value="send søk"/></p> 21. </form> 22.ENDFORMSLUTT; <form> <select name = "valgt" ><option>allende</ option> <option>ambjørnsen</option> <option>dahl</option> <option>hagerup</option> <option>lindgren</option> <option>newth</option> <option>newth</option> <option>smith</option> <option>faldbakken</option>... flere slike </select> <input type = "submit" value = "send søk" /> </form> Allende send søk Linjer 2-5 formulerer og gjennomfører søket etter alle forfattere. Linjer 6-10 skriver ut starten på formen og nedtrekksmenyen. På linjene 11-17 ser vi løkken som skriver ut <option> taggene med etternavnene som hentes fra databasen (navn etter navn). Linjer 19-22 avslutter menyen og formen. Vi hopper foreløpig over boks nr. 1 Boksene 2 (foreløpig uavgrenset), 3 og 4 kan konkretiseres som på figuren nedenfor: Ved klikk på submit-knappen starter programmet "respons.php. På linje 9 ser vi at forfatteretternavnet som brukeren velger legges i variabelen som heter $valgt i dette programmet.
Page 3 Page 4 Eksempel 2: Boks 5, utskrift av resultattabellen etter valg av forfatter fra listen (eksempel 4 fra forrige uke) ser ut slik: 1. 2. 3. $sql=<<<sluttsql 4. SELECT Bok.Tittel as Tittel, 5. Forfatter.Etternavn as Forfatternavn 6. FROM Bok, Forfatter, Utgivelse 7. WHERE 8. Bok.ISBN = Utgivelse.ISBN 9. AND Utgivelse.ForfatterID=Forfatter.ForfatterID 11. AND Forfatter.Etternavn='$valgt' 12.SLUTTSQL; 14. $resultatsett = mysql_query($sql); 15. if($resultatsett == false) { 16. die("feil i spørsmålet: $sql". mysql_error()) ; 17. } 18. $antallraderhentet = mysql_num_rows($resultatsett) ; 19. if($antallraderhentet == 0){ 20. die("ingen rader hentet ". mysql_error()) ; 21. } 22. print <<<TABELLSTARTSLUTT 23. <table> 24. <tr> 25. <th>tittel</th> <th>forfatternavn</th> 26. </tr> 27.TABELLSTARTSLUTT; 28. $enrad = mysql_fetch_assoc($resultatsett); 29. while ($enrad!=false){ 30. print <<<TRSLUTT 31. <tr> 31. <td> {$enrad['tittel']}</td> 32. <td> {$enrad['forfatternavn']} </td> 33. </tr> 34.TRSLUTT; 35. $enrad = mysql_fetch_assoc($resultatsett); 36. } 37. print <<<TABELLSLUTTSLUTT 38. </table> 39.TABELLSLUTTSLUTT; 40. <table> td> <tr> <th>tittel</th> <th>etternavn</th> </tr> <tr> </tr> <tr> <td> Rubinen i røyken </td> <td> Pullman </td> <td> Jakob og fugleskremselet </ <td>pullman</td> </tr> </table> Tittel Rubinen i røyken Jakob og fugleskremselet Etternavn Pullman Pullman Linje 3-21 foretar selve søket, og henter resultatene. Se spesielt linje 11: Menyvalget fra eksempel 1 brukes for å avgrense søket. Linje 22-27 skriver tabelloverskriften Linje 28-36 henter radene fra resultattsettet en etter en, og skriver radene til tabellradene (data til tabellcellene) Linje 37-39 avslutter tabellen.
Page 5 Page 6 Avgrensing av menyinnførslene Et lite tillegg til systemet blir å avgrense menyen før den vises (boks 1). Vi tenker noe slikt: 1. $sql= <<<SLUTTSQL 2. SELECT Etternavn FROM Forfatter 3. WHERE Etternavn LIKE '$etternavn%' Vi starter men en form som inneholder et tekstelement som brukeren kan bruke til å avgrense menyvalgene. For eksempel: bare forfattere som begynner med 'P' 4.SLUTTSQL; Deretter er systemet helt likt det foregående, men menyen har et begrenset og overkommelig antall inførsler. Resten av filen som genererer nedtrekksmenyen er, altså det samme som i eksempel 1 ovenfor For å få til dette, introduserer vi en form med et tekstelement som en inngang til systemet. Koden er følgende: Oppgi(starten på) Etternavnet på forfatteren: Submit Reset <form action= "form_med_ meny.php"> <p> <label for="etternavn_id2"> Oppgi (starten på) Etternavnet på forfatteren: </label> <input type="text" name= "etternavn" id="etternavn_id2" /> </p> <p> <input type="submit" /> <input type="reset"/> </p> </form> form_med_ meny.php (eksempel 1.) form_med_ meny.php I filen form_med_meny.php (eksepmel 1) forandrer vi SQL-søket, slik at den tar med avgrensningen på etternavnet som kommer fra formen ovenfor
Page 7 Page 8 Lenker I tabellvisningen i eksemplet ovenfor legger vi en ekstra kolonne (linje 34-40 nedenfor:) Vi bruker lenker når vi navigerer mellom websider (se i XHTML-kurset) Lenker kan brukes på mange forskjellige måter. Det går an å lenke til XHTML-sider, PHP-programmer og bilder En lenke til et PHP-program kan se ut som følger: <a href="bibliotek.php?fornavn=michael">bibliotek</a> Et klikk på lenken kjører programmer bibliotek.php, med "Michael" som verdi i variabelen fornavn. Tilsvarer en form, med action="bibliotek.php", en tekstboks med name="fornavn" og en submit-knapp Bruk av frimerkebilder som lenke-ankre Som en siste utvidelse av vårt lille system, forsøker vi å plassere frimerkebilder i tabellen over bøker, slik at brukeren, om ønskelig, kan klikke seg til et større bilde av bokomslaget For dette formålet har vi plassert frimerkebilder i databasen i en egen kolonne. Vi plasserer en lenke, med frimerkebildet som anker, og brukeren kan dermed klikke denne for å se på et større bilde 29. while ($enrad!=false){ 30. print <<<TRSLUTT 31. <tr> 32. <td> {$enrad['tittel']}</td> 33. <td> {$enrad['forfatternavn']} </td> 34. <td> <a href="$url_mappe{$enrad['bildefil']}"> 35. <img 36. src= "$frimerke_mappe{$enrad['frimerkefil']}" 37. alt = "bokomslag" 38. /> 39. </a> 40. </td> 41. </tr> 42. TRSLUTT 43.} På linje 34 (<a> taggen) starter vi en HTML lenke, med henvisning til en billedfil. Den lukkes på linje 39, (</a>). Ankeret, linje 35-38, er et bilde - altså vårt frimerkebilde. Lenkets referanse, altså filen som vises ved klikk (href-attributtet linje 34) er en større versjon av bildet. Resten er det samme som i eksempel 4 ovenfor.
Page 9 Page 10 9. Litt mer om SQL-søk Aliaser for tabellnavn Vi husker (?) fra databasekurset at vi kan tilordne aliaser til våre tabeller. Dette kan gjøre komplekse søk litt lettere å formulere. En alias tilordnes ved at tabellnavnet i FROM-setningen etterfølges av et "istedenfor-navn" SELECT... FROM Forfatter F F ovenfor er aliasen til tabellnavnet Forfatter. Aliasen kan brukes i hele søket, istedenfor tabellnavnet. Eksempel 3: Vi forsyner våre tabeller med aliaser, og gjør vårt søk mer leselig SELECT F.Etternavn, Forfatternavn B.ISBN AS ISBN FROM Forfatter F, Utgivelse U, Bok B WHERE F.ForfatterID=U.ForfatterID AND U.ISBN=B.ISBN AND Etternavn='Allende' Aliasene gir oss færre bokstaver å skrive søket blir lettere å lese hindrer en del potensielle skrivefeil Med løkker kan programmet gjenta handlinger for grupper av objekter, for eksempel rader i databaser. Vi innførte while-løkker og for-løkker. Arrayer tillater oss å behandle grupper av studenter, tall, matvarer osv. på en systematisk måte. tallindekserte arrayer: opprettes for eksempel slik $byer[0]="oslo"; $byer[1]="bergen"; $byer[2]="trondheim"; og kan gjennomgås systematisk slik (med en while-løkke): $antallbyer = count($byer); $i=0;//initialisering av tellervariabel while( $i < $antallbyer ){ print("<p>$i: $byer[$i]</p>"); $i = $i + 1 ; //avansement av tellervariabel } 0: Oslo 1: Bergen 2: Trondheim Kort tilbakeblikk Emner vi har gjennomgått Tjenerbaserte, dynamiske, interaktive websider med PHP PHP tolkes på tjeneren. Tolkningen genererer (X)HTML dynamisk Variabler og forms Forms muliggjør henting av data fra brukere Variabler gjør det mulig for oss å eller slik (med en for-løkke): $antallbyer = count($byer); for($i=0 ; $i < $antallbyer; $i = $i + 1 ){ print("<p>$i: $byer[$i]</p>"); } 0: Oslo 1: Bergen 2: Trondheim mellomlagre data for bruk i programmet hente data fra forms Vi bruker betinget utføring for å styre programmets gang. Med betinget utføring handler programmet litt annerledes, utfra forskjellige data og andre forskjellige faktorer. 1. 2. if ($alder > 65){ 3. $pris=250; 4. } 5. else{ 6. $pris=500; 7. } 8. print("vennligst innbetal konf.avgift, kr. $pris snarest!"); assosiative arrayer //Oppretter arrayen $fodselsdager["niels"] = "11. desember"; $fodselsdager["jens"] = "12. juni"; $fodslesdager["mari"] = "21. oktober"; Resultatrader fra databaserader ble stort sett hentet som assosiative arrayer Vi så på funksjoner
Page 11 innebygde PHP-funksjoner enkle funksjoner som strlen og trim som mottar parametre mysql-funksjoner egendefinerte funksjoner, som vi bruker for oppgaver vi utfører ofte, eller for å dele opp kompliserte oppgaver inn i enkle bestanddeler Databaseforbindelse søking og behandling av søkeresultater innlegging av data Sist oppdatert 30/10-06 av Michael Preminger, michael.preminger@jbi.hio.no