Page 1 Page 2 [Kurssidene] [ JBI] [ ] Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006 Introduksjon til kontrollstrukturer Michael Preminger (michaelp@hio.no) 07/09-06 I denne forelesningen En liten repitisjon Betinget utføring: Enkle if-setninger if-else strukturer enkle og sammensatte logiske uttrykk Ole Når en bruker skriver sitt navn ("Ole") i et form-element med name="fornavn" som attributt klikker på submit-knappen... legges verdien "Ole" i variabelen $fornavn i PHP-programmet som er henvist til fra Actionelementet PHP-programmet kan bruke den verdien på mange forskjellige måter. Her, for eksempel, printes den til nettleseren. Vi har sett tilsvarende verdioverføring fra radioknapper og nedtrekksmenyer Magien bak verdioverføringen Variabelverdier overføres fra HTML-formen til php-programmet som parametre en klikk på "submit"-knappen utløser en URL, som ser slik ut: http://bibin.hio.no/~s123456/uke_35/respons_tekst.php?fornavn=ole altså: URLen til programmet etterfølges av parametre. parametre kommer i par: variabelnavn=verdi. Repitisjon fra forrige gang Vi holder orden på verdier med hjelp av variabler Vi lagrer verdier i variabler. Variabler uttrykker verdienes rolle i programmet, og bør få beskrivende navn. Navngitte form-elementer henger sammen med variabler av samme navn Våre programmer mottar verdier fra HTML-forms bruker disse til å tilpasse innholdet på websiden til brukernes behov Reset <form action= "respons_ tekst.php"> <input type="text" name= "fornavn" id="id_fornavn" /> <input type="submit" /> <input type="reset" /> Respons på tekstelementet: <?php print( $fornavn );?> tekst.htm (utdrag) respons_tekst.php(utdrag)
Page 3 Page 4 Ved flere variabler overføres også flere "parameterpar", adskilt med '&'. 8. print ("din favorittforfatter er $favorittfor "); Eksempel 13 fra forrige gang: Et større skjema som sender flere parametre 9.?> 10. (merk at her har vi, for å spare plass, plassert slik at den starter rett under visningen og fortsetter i neste kolonne.) Er du student? Ja Nei Din favorittforfatter? Jonas Lie Reset <form action= "respons_stor.php" method="get"> tekstfelt <input type="text" name= "fornavn" /> radioknapprekke Er du student? name= "erstudent" value=""/> Ja name= "erstudent" nedtrekksmeny Din favorittforfatter? <select name= "favorittfor"> option> <option> Henrik Ibsen</option> <option> Knut Hamsun</option> <option> Henrik Wergeland</option> <option selected="selected" > Jonas Lie</ <option> Ivar Åsen</option> <option> Erlend Loe</option> <option> Aleksander Kjelland</option> </select> knapper <input type="submit" name="submit" /> <input type="reset" name="reset"/> 11. og på spørsmålet om du var student, svarte du 12. <?php 13. print( $erstudent ); 14.?> 15. 16. takk og på gjensyn! respons_stor.php Kontrollstrukturer - introduksjon Betinget utføring: if-test Våre programmer foretar beslutnninger basert på valgalternativer. If- testen Variabler gir oss mulighet til å foreta meningsfylte valg i våre programmer. Slike valg foretas ofte ved hjelp av kontrollstrukturer og variabelverdier. Betinget utføring er hjertet av programmeringen. datamaskiner / dataprogrammer "tenker" ikke datamaskiner / programmer tar beslutninger (foretar valg), basert på klart formulerte betingelser. En "betingelse" uttrykkes ved hjelp av et logisk uttrykk. If-testen tester om et logisk uttrykk er sant Det logiske uttrykket (mellom klammer, rett etter if - ordet) kan være enten sant eller usant. (engelsk: true eler false) Hvis uttrykket er sant, blir instruksjonene som står mellom krøllparentesene utført. value=""/> Nei Ved klikk på "submit"-knappen, sendes URL'en http://bibin.hio.no/~s123456/uke_35/respons_ stor.php?fornavn=michael&erstudent=&favorittfor=jonas+lie til PHP-programmet listet nedenfor. 1. Takk for din respons: Ditt fornavn er: 2. <?php 3. print ( $fornavn ); 4.?> 5. 6. == leses "er lik": "Hvis $tall er lik 0" Et logisk uttrykk kan ta forskjellige former. Ofte knyttes det til at en variabel har en bestemt verdi, (==) en verdi mindre enn noe (<) en verdi større enn noe (>), osv. Logiske uttrykk kan knyttes til tall, men også til tekststrenger 7. <?php
Page 5 Page 6 Eksempel 1 == om en variabelverdierlik en annen variabelverdi; eksempel: Anta at variablene $fornavn, $etternavn og $antallbarn nedenfor er sent inn fra et HTMLskjema på folkeregisterets nettsted, og personene registrerer seg med fornavn, etternavn og antall barn. 1. //verdier for variablene $fornavn, $etternavn og $antallbarn kommer fra en form 2. <?php 3. print("goddag, $fornavn $etternavn!") ; 4. if ($antallbarn > 0){ 5. print("vennligst klikk her for å registrere dine barn "); 7. print("takk for din registrering"); 8.?> Programmet utføres sekvensielt, instruksjon etter instruksjon. Først utføres instruksjonen i linje 3, uansett verdi på $antallbarn. instruksjonen i linje 5 utføres deretter, bare dersom $antallbarn er større enn 0. instruksjonene i linje 7 utføres til slutt, uansett verdi på $antallbarn. ( Vedkommende får bare anledning til å registrere barn hvis han / hun har noen. ) Eksempel 2: et valg basert på data fra en radioknapp. ( $tall1 == $tall2 ) er sant hvis begge variabler har samme verdi) < om en variabelverdi er mindre enn en annen; eksempler: ( $tall1 < 5 ) er true hvis verdien i $tall1 er eks. -1, 0, 4, 4.9. false hvis $tall1 har verdien 5) ( $tall2 < $tall3 ) er true når verdien i $tall2 er mindre enn verdien i $tall3 > om en variabelverdi er større enn en annen; eksempler: ( $tall1 > 7 ) er true når $tall1 er eks. 10, 40, 1000000. false når $tall1 er lik 7 ( $tall2 > $tall1 ) er true når verdien i $tall2 er større enn verdien i $tall1 >= om en variabelverdi er større enn eller lik en annen; eksempler: ( $var1 >= 0 )(true når $var1 er eks. 1, 5, 9; true også når $var1 har verdien 0. false for negative verdier i $var1) <= om en variabelverdi er mindre enn eller lik en annen; eksempler: ($var3 <= 1) (true hvis $var3 er eks. -1, 0, 1) Et logisk uttrykk puttes alltid i klammer (se for eksempel linje 4 i eksempel 4). Bemerk: Noen PHP-bøker bruker "test-uttrykk" på det jeg kaller "logisk uttrykk". Igjen: Et logisk uttrykk er et utsagn som er "sant" eller "usant" (engelsk: true eller false ). Student? <form action= "respons_radio.php"> Student? name="erstudent" value= "" /> name="erstudent" value="" /> <input type="submit"> 1. <h1>respons på radioknapper:</ h1> 2. Er jeg student? 3. <?php 4. if ($erstudent == ""){ 5. print ("Du er student!</ p>"); 7.?> 8. Takk og farvel! respons_radio.php(utdrag) verdien av variabelen $erstudent bestemmer om setningen "Du er student" skal skrives til nettleseren eller ikke. Dersom verdien er "Ja" - får vi "Du er student!" i nettleseren, etterfulgt av "takk of Farvel!". Dersom verdien er "Nei" - får vi bare "Takk og farvel!". Et logisk uttrykk kan, som sagt, stilles på forskjellige måter PHP støtter flere testoperatorer som kan brukes i logiske uttrykk: == om en variabelverdi er lik et bestemt tall; eksempler: ($tall == 0) er true hvis $tall er lik 0 i testøyeblikket ($student == "" ) er true hvis variabelen $student har verdien "")
Page 7 Page 8 if - else strukturen Eksempel 4 - konferansepåmelding Ofte trenger programmet vite eksplisitt hva det skal gjøre dersom det logiske utrykket er usant (og bare da): Dette ordnes med en else-gren som settes rett etter if-grenen Tenk deg et PHP-program som støtter webbasert påmelding til en konferanse. Programmet skal, bl. a. prise konferansedeltagelsen slik: halv pris for pensjonister full pris for alle andre Den påmeldte bes oppgi sin alder. Alderen (si 66) skrives i et tekst-element med navn "alder", verdien overføres til et PHP-program, og lagres i en variabel med navn $alder. I programmet testes så $alder mot en fast tallverdi, som representerer pensjonsalderen: Eksempel 3 : legger en else-gren til forrige eksempel 2. if ($alder > 65){ 3. $pris=250; 4. } 5. else{ 6. $pris=500; 7. } 8. print("vennligst innbetal konf.avgift, kr. $pris snarest!"); 9.?> Student? <form action= "respons_radio_else.php"> Student? name="erstudent" value= "" / > name="erstudent" value="" /> <input type="submit"> radio_else.htm(utdrag) 1. <h1>respons på radioknapper:</h1> 2. Er jeg student? 3. <?php 4. if ($erstudent == ""){ 5. print ("Du er student!</ p>"); 7. else{ 8. print ("Du er ikke student!"); 9. } 10.?> 11. Takk og farvel! respons_radio_else.php(utdrag) Alder? Hvis $alder oppgis til å være 66 eller mer, settes $pris lik 250. (linje 3) Hvis $alder oppgis til å være 65 eller mindre, settes $pris lik 500 (linje 6) Med formen: Reset <form action="respons_tekst.php"> <br /> <input type="text" name="fornavn" /> <br /> <input type="text" name="alder" size="5"/> <input type="submit"/><input type="reset"/> <?php print ("Velkommen $ fornavn"); if ($alder>65){ $pris=250; } else{ $pris=500; } print ("Vennligst Betal kr. $ pris");?> Her blir enten linje 5 eller linje 8 utført, avhengig av valgt alternativ. Legg merke til at vi, både her og ved forrige eksempel, benytter data fra brukere til noe annet enn bare å printe de ut. Data fra brukeren er her med på å bestemme programmets gang.
Page 9 Page 10 Teste på motsatt (negert) betingelse:!= - operatoren Til tider ønsker vi å utføre en handling bare hvis en variabel ikke har en viss verdi. Eksempel 5 if ($forfatter!= "Ibsen"){ } print ("Dette er ikke et Ibsen-drama"); Eksempel 6 (meget typisk: Sjekk at brukeren har fylt inn en verdi i et tekst-element: <form action="respons_tekst_if.php"> <br /> <input type="text" name="fornavn" /> <br /> <input type="submit"/> tekst_if.htm(utdrag) <?php if ($fornavn!=''){ /*2 enkle gåseøyne */ print ($fornavn); } else{ }?> print("du må oppgi fornavnet"); respons_tekst_if.php(utdrag) Hvis brukeren glemmer å legge inn en verdi i tekstfeltet, blir verdien i variabelen lik tom, som kan representeres ved 2 enkle gåseøyne skrevet ved siden av hverandre: '' Hvis variabelen får en verdi forskjellig fra tom (!= ''), betyr det at brukeren har faktisk lagt inn en verdi i form-elementet. else-grenen representerer det første tilfellet, og kjøres hvis brukeren har glemt å oppgi fornavn. Nøsting av if tester Med "Nøsting av betingelser" menes at vi tester på en betingelse bare hvis en annen betingelse stemmer Dette får formen av "en betingelse inne i en annen betingelse", derav ordet nøsting. Eksempel 7: testing på èn betingelse bare dersom en annen betingelse er oppfylt. 2. if($fornavn!= ''){//hvis brukeren la inn et navn 3. if ($fornavn == "Michael"){ 4. print ("Du heter Michael<br />"); 5. } 6. else{ 7. print("du heter ikke Michael<br />"); 8. } 9. print("et navn var lagt inn<br />"); 10. } 11. else{ 12. print("du må skrive inn ditt fornavn<br />"); 13. } 14. print ("Denne linjen skrives uansett"); 15.?> Anta at verdien i variabelen $fornavn kommer fra et tekst-element i et XHTML-form. Linje 3 til 9 blir bare utført dersom det ble lagt inn en verdi i elementet med navn "fornavn". Linje 12 blir utført dersom brukeren ikke tastet inn et navn før han klikket "submit"
Page 11 Sammensatte logiske uttrykk Av og til er våre uttrykk litt mer kompliserte enn en enkel test kunne uttrykke: Vi ser på to tilfeller: && (logisk og): to eller flere betingelser som skal stemme samtidig (logisk eller): minst én av to eller flere betingelser skal stemme. Eksempel 8: Dersom den påmeldte er en pensjonist samtidig som hun er en dame... 2. //... fortsettelse av eksempel 7. 3. if ( ($alder > 65) && ($kjonn=="kvinne")){ 4. print("som en kvinnelig pensjonist får du også en blomst når du kommer"); 5. } 6. print("vennligst innbetal konf.avgift, kr. $pris snarest!"); 7.?> Eksempel 8a: Hvis alderen er mellom 2 og 5... (en sammensatt test på en variabel) 2. //... fortsettelse av eksempel 7. 3. if ( ($barnealder >= 2) && ($barnealder <= 5 )){ 4. print("barnet ditt er i barnehagealderen "); 5. } 6.?> Eksempel 9: Hvis den påmeldte er enten en kvinne eller en pensjonist (eller begge deler), får den en redusert pris 2. if ( ($alder > 65) ($kjonn=="kvinne")){ 3. $pris=250; 4. } else { 5. $pris=500; 7. print("vennligst innbetal konf.avgift, kr. $pris snarest!"); 8.?> Ukens lab-oppgaver Følgende skal øves inn: Vi øver litt mer på forms og verdioverføring betinget utføring. Sist oppdatert 07/09-06 av Michael Preminger, michael.preminger@jbi.hio.no