[Kurssidene] [ ABI - fagsider bibin ] Michael Preminger (michaelp@hio.no) 07/09-15 Vi holder orden på verdier med hjelp av variabler Vi lagrer verdier i variabler. Variabelnavn uttrykker verdienes rolle i programmet, og bør få beskrivende navn. Navngitte form-elementer henger sammen med variabler av samme navn i målprogrammet Målprogrammet mottar verdier fra HTML-forms bruker disse til å tilpasse innholdet på websiden til brukernes behov <form action= "respons_tekst.php"> Respons på tekstelementet: <input type="text" name= "fornavn" <?php /> print( $_GET['fornavn'] ); <input type="submit"?> /> <input type="reset" /> tekst.htm (utdrag) respons_tekst.php(utdrag) 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 $_GET['fornavn'] i PHP-programmet som er henvist til fra Action-elementet 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 1 of 12 07.09.2015 14:27 2 of 12 07.09.2015 14:27
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. Ved flere variabler overføres også flere "parameterpar", adskilt med '&'. Eksempel 13 fra forrige gang: En større form som sender flere parametre (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? <form action= "respons_stor.php" method="get"> tekstfelt <input type="text" name= "fornavn" /> radioknapprekke Er du student? name= "erstudent" value=""/> Ja name= "erstudent" value=""/> Nei nedtrekksmeny Din favorittforfatter? <select name= "favorittfor"> <option> Henrik Ibsen</option> <option> Knut Hamsun</option> <option> Henrik Wergeland</option> <option selected="selected" > Jonas Lie</option> <option> Ivar Åsen</option> <option> Erlend Loe</option> <option> Aleksander Kjelland</option> </select> knapper <input type="submit" name="submit" /> <input type="reset" name="reset"/> Ved klikk på "submit"-knappen, sendes URL'en http://bibin.hio.no/~s123456/uke_35/respons_stor.php erstudent= fornavn=michael favorittfor=jonas+lie til PHP-programmet listet nedenfor. 1. Takk for din respons: Ditt fornavn er: 2. <?php 3. print ( $_GET['fornavn'] ); 4.?> 5. 6. 7. <?php 8. print ("din favorittforfatter er{$_get['favorittfor']}"); 9.?> 10. 11. og på spørsmålet om du var student, svarte du 12. <?php 13. print( $_GET['erStudent'] ); 14.?> 15. 16. takk og på gjensyn! respons_stor.php 3 of 12 07.09.2015 14:27 4 of 12 07.09.2015 14:27
Eksempel 1 Enkle if-setninger if-else strukturer if-elseif-else enkle og sammensatte logiske uttrykk Nøsting av if- og else-grener Våre programmer tar beslutnninger basert på valgalternativer. 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 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. == 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 som er mindre enn en annen verdi (<) en verdi som er større enn en annen verdi (>), osv. en verdi som er ulik en annen verdi (!=), osv. Logiske uttrykk kan knyttes til tall, men også til tekststrenger Anta at variablene $_GET['fornavn'], $_GET['$etternavn'] og $_GET['antallBarn'] nedenfor er sent inn fra en HTML-form 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,{$_get['fornavn']} {$_GET['$etternavn']}!") ; 4. if ($_GET['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å $_GET['antallBarn']. instruksjonen i linje 5 utføres deretter, bare dersom $_GET['antallBarn']er større enn 0. Vedkommende får bare anledning til å registrere barn hvis han / hun har noen. instruksjonene i linje 7 utføres til slutt, uansett verdi på $_GET['antallBarn']. Eksempel 2: et valg basert på data fra en radioknapprekke. Student? <form action= "respons_radio.php"> Student? 1. <h1>respons på name="erstudent" value= "" radioknapper:</h1> /> 2. Er jeg student? 3. <?php 4. if ($_GET['erStudent'] == ""){ 5. print ("Du er student! name="erstudent" "); value="" /> 7.?> <input type="submit"> 8. Takk og farvel! respons_radio.php(utdrag) verdien av variabelen $_GET['erStudent'] bestemmer om setningen "Du er student" skal skrives til nettleseren eller ikke. Dersom verdien er "" - får vi "Du er student!" i nettleseren, etterfulgt av "Takk of farvel!". Dersom verdien er "" - får vi bare "Takk og farvel!". 5 of 12 07.09.2015 14:27 6 of 12 07.09.2015 14:27
Et logisk uttrykk kan stilles på forskjellige måter PHP har flere testoperatorer som kan brukes i logiske uttrykk: == om en variabelverdi er lik en bestemt verdi; eksempler: ($student == "" ) er true hvis variabelen $student har verdien "" ) ( $tall1 == $tall2 ) er sant hvis begge variabler har samme verdi) 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!= om en variabelverdi er ulik (forskjellig fra) en bestemt verdi ($student!= "" ) er true hvis variabelen $student har f.eks. verdien "" < 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 ). Om ordbruk: if-gren, else-gren osv. Iblant bruker vi ordet "gren" om et kjørealternativ og innholdet i det. Det stedet hvor programmet skal beslutte om å følge den ene eller den andre kjørevei kalles en forgrening, og en slik mulig kjørevei kalles en gren. Eksempel 3 : legger en else-gren til forrige eksempel 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 ($_GET['erStudent'] == ""){ 5. print ("Du er student! "); 7. else{ 8. print ("Du er ikke student!"); 9. } 10.?> 11. Takk og farvel! respons_radio_else.php(utdrag) 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 å bestemme programmets gang. 7 of 12 07.09.2015 14:27 8 of 12 07.09.2015 14:27
Eksempel 4 - konferansepåmelding Tenk deg et PHP-program som støtter webbasert påmelding til en konferanse. Programmet skal, bl. a. prise konferansedeltagelsen slik: halvpris for pensjonister fullpris 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 $_GET['alder']. I programmet testes så$_get['alder'] mot en fast tallverdi, som representerer pensjonsalderen: 2. if ($_GET['alder'] > 65){ 3. $pris=250; 4. } 5. else{ 6. $pris=500; 7. } 8. print("vennligst innbetal konf.avgift, kr. $pris snarest!"); 9.?> Hvis alderen oppgis til å være 66 eller mer, settes $pris lik 250. (linje 3) Hvis alderen oppgis til å være 65 eller mindre, settes $pris lik 500 (linje 6) Med formen: Til tider ønsker vi å utføre en handling bare hvis en variabel ikke har en viss verdi. Eksempel 5 (tulleeksempel...) 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 ($_GET['fornavn']!=''){ /* '' 2 enkle gåseøyne */ print ($_GET['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 ( lagt inn en verdi i form-elementet. ), betyr det at brukeren har faktisk else-grenen representerer kjøres hvis brukeren har glemt å oppgi fornavn. Alder? <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 {$_GET['fornavn']}!"); if ($_GET['alder']>65){ $pris=250; } else{ $pris=500; } print ("Vennligst Betal kr. $pris");?> 9 of 12 07.09.2015 14:27 10 of 12 07.09.2015 14:27
Eksempel 10: Forskjellige priskategorier på en tjeneste: Barn og pensjonister får tjenesten billigst 2. if ($_GET['alder'] > 65){ 3. $pris=250; 4. } 5. elseif($_get['alder'] <18){ 6. $pris=200; 7. } 8. else{ 9. $pris=500; 10. } 11. print("vennligst innbetal konf.avgift, kr. $pris snarest!"); 12.?> Vi kan ha så mange elseif ledd vi vil mellom if og else " En betingelse inne i en annen betingelse": tester på en betingelse bare hvis en annen betingelse stemmer Eksempel 7: testing på èn betingelse bare dersom en annen betingelse er oppfylt. 2. if($_get['fornavn']!= ''){//hvis brukeren la inn et navn 3. if ($_GET['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.?> Verdien i variabelen $_GET['fornavn'] kommer fra forms. Linje 3 til 9 blir bare utført dersom det ble lagt inn en verdi i elementet med navn "fornavn". 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 ( ($_GET['alder'] > 65) && ($_GET['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 ( ($_GET['barnealder'] >= 2) && ($_GET['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 ( ($_GET['alder']> 65) ($_GET['kjonn']=="kvinne")){ 3. $pris=250; 4. } else { 5. $pris=500; 7. print("vennligst innbetal konf.avgift, kr. $pris snarest!"); 8.?> Vi øver litt mer på forms og verdioverføring betinget utføring. litt XHTML-validering Sist oppdatert 07/09-15 av Michael Preminger, michaelp@hio.no Linje 12 blir utført dersom brukeren ikke tastet inn et navn før han klikket "submit" 11 of 12 07.09.2015 14:27 12 of 12 07.09.2015 14:27