Webformularer, PHP og databaser et crash-kurs

Like dokumenter
Systemarkitektur. Webformularer, PHP og databaser et crash-kurs. Hva skal applikasjonsprogrammet gjøre? PHP

Systemarkitektur. Webformularer, PHP og databaser et crash-kurs. Hva skal applikasjonsprogrammet gjøre? PHP

Systemarkitektur. Webformularer, PHP og databaser. Hva skal applikasjonsprogrammet gjøre? PHP. Ta i mot data fra brukergrensesnittskjermbildet

Webformularer, PHP og databaser

INF1050-php-2. Databasenavn. Institutt for informatikk Gerhard Skagestein 23. februar /~brukernavn/ maskinnavn PHP. Internet Explorer, Opera...

Webformularer, PHP og databaser

Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006

$antall_maaneder =12; Variablene $pris og $antall_maaneder i eksemplet ovenfor har

HØGSKOLEN I SØR-TRØNDELAG

while-løkker while-løkker gjentar instruksjonene så lenge en betingelse er oppfylt Eksempel 1: en enkel while-løkke

En enkel while-løkke. 1 of :28. 2 of :28. while-løkker gjentar instruksjonene så lenge en betingelse er oppfylt

Webprogrammering høsten 2017

}?> <!DOCTYPE... <html xmlns=" <head>... </head> <body> <p>nå skal vi printe hallo:</p> <?php //funksjonskall

Et forsøk på definisjon

$i < 5 forsettelsesbetingelsen - false => Løkken slutter.

Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006

Tilgjegelighet av XHTML-forms

Et forsøk på definisjon

1.2 Dynamiske, tjenerbaserte og interaktive nettsteder

Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006

HØGSKOLEN I SØR-TRØNDELAG

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

HØGSKOLEN I SØR-TRØNDELAG

Innhold. Innledning... 13

Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006

Del 1 En oversikt over C-programmering

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Kapittel 1 En oversikt over C-språket

</html> </head> <form action= rtkst.php > <p> Fornavn? <input type= text name= fornavn <input type= submit />

JSP - 2. Fra sist. Hvordan fungerer web? Tjenerside script HTML. Installasjon av Web-tjener Et enkelt JSP-script. Ønsker dynamiske nettsider:

Et forsøk på definisjon. Eksempel 1

HØGSKOLEN I SØR-TRØNDELAG

Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006

Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

UNIVERSITETET I OSLO

Introduksjon til objektorientert programmering

Aritmetiske operasjoner. Litt om forrige times øvelsesoppgaver

Utførelse av programmer, metoder og synlighet av variabler i JSP

Universitetet i Oslo Institutt for informatikk. avmystifisert i INF102. Kvile

while-økker while-løkker gjentar instruksjonene så lenge en betingelse er oppfylt Eksempel 1: en enkel while-løkke

MAT-INF 1100: Obligatorisk oppgave 1

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Utvikling av dynamiske nettsteder med PHP og databaser, våren 2009

Programmeringsspråket C

2 Om statiske variable/konstanter og statiske metoder.

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

UNIVERSITETET I OSLO

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Når en bruker skriver sitt navn ("Ole") i et form-element med name="fornavn" som attributt. klikker på submit-knappen

TDT4110 IT Grunnkurs Høst 2015

Introduksjon til programmering og programmeringsspråk. Henrik Lieng Høgskolen i Oslo og Akershus

Markeringsspråk og XML Nettsider og XHTML

Del 4 Noen spesielle C-elementer

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Programmeringsspråket C Del 2

Forelesning inf Java 5

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

UNIVERSITETET I OSLO

lagring med HTML5 Offline lagring Offline Informasjonsteknologi 2 Gløer Olav Langslet Sandvika VGS

Forelesning inf Java 5

Løse reelle problemer

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

Python: Variable og beregninger, input og utskrift. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Testsituasjon Resultat Kommentar. Fungerer som det skal!

Verdier, variabler og forms

Dette er en demonstrasjonsside som vi skal bruke for å se litt nærmere på HTTP protokollen. Eksemplet vil også illustrere et par ting i PHP.

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Programmeringsspråket C Del 2

Programmeringsspråket C Del 2

Tilkobling og Triggere

Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Et forsøk på definisjon. Eksempel 1

HØGSKOLEN I SØR-TRØNDELAG

Web-programmering med JSP Løsningsforslag leksjon 3

Utførelse av programmer, funksjoner og synlighet av variabler (Matl.)

Web-programmering med JSP Løsningsforslag leksjon 4

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

MAT-INF 1100: Obligatorisk oppgave 1

En bedre verden med AJAX

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Tuva Kristine Thoresen

Utvikling fra kjernen og ut

Utvikling fra kjernen og ut

SVARFORSLAG : Eksamen i IBE102 Webutvikling Våren 2017.

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Klasser. Webprogrammering høsten Objekter. Eksempelklasser og -objekter. 2 of :56. 1 of :56

Forelesning inf Java 4

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Databaser kort intro. Tom Heine Nätt

Nybegynnerkurs i C. Øyvind Grønnesby. 14. oktober Introduksjon Typer Operatorer Kontrollstrukturer Pekere Makroer Lenker

Transkript:

Webformularer, PHP og databaser et crash-kurs Jfr. Fra kjernen og ut, fra skallet og inn Appendix B INF1050-php-1

Systemarkitektur Virkeligheten (interesseområdet) Dynamisk nettside bygges evt. opp på grunnlag av spørring mot databasen Nettleser HTTP/ PHP WWWtjener SQL Database Databasetjener (Oracle) Firefox, Internet Explorer, Opera... http:// maskinnavn /~brukernavn/ Maskinnavn Databasenavn INF1050-php-2

Hva skal applikasjonsprogrammet gjøre? Ta i mot data fra brukergrensesnittskjermbildet Finne ut hva som skal gjøres og gjøre det Hvis det som skal gjøres omfatter en spørring mot eller en oppdatering av en database: o Bygg en egnet SQL-kommando o Åpne databasen, send SQL-kommandoen til databasen, ta i mot resultatet, lukk basen Utføre beregninger etc. (hvis nødvendig) Bygg opp nettsiden som skal vises frem i brukergrensesnittet, i form av en XHTML-tekst Dette innebærer mye tegnstrenghåndtering! INF1050-php-3

PHP PHP er et skriptspråk designet for å kunne utvikle dynamiske nettsider. PHP kan i en nettside brukes side om side med XHTML. PHP er open source. PHP: PHP Hypertext Preprocessor (et rekursivt akronym ) PHP-nettsted: http://www.php.net INF1050-php-4

Vanlig XHTML-fil På filen ~inf1050/php/helloworld.html <html> <head> <title>php Hello World</title> For enkelhets skyld utelater vi de innledende XHTML-besvergelsene inntil videre! </head> <body> <h1>hello World</h1> <p>hello World</p> </body> </html> INF1050-php-5

XHTML-fil med innbakt PHP På filen ~inf1050/php/helloworld.php <html> <head> <title>php Hello World</title> </head> <body> <h1>hello World fra PHP</h1> <?php print( <p>hello World</p>");?> </body> </html> INF1050-php-6

Hva skjer? Når vi gjennom en nettleser aksesserer en nettside med PHP-kode, vil følgende skje: Webjeneren mottar forespørsel fra klienten Nettsiden letes opp på webtjeneren Webtjeneren utfører instruksjonene i PHP-koden, og eventuelle utskrifter blir integrert i nettsiden (dette forutsetter at webtjeneren skjønner PHP) Nettsiden sendes tilbake over nettet til nettleseren For nettleseren vil siden se ut som en helt vanlig XHTML-kodet side INF1050-php-7

XHTML-fil med innbakt PHP På filen ~inf1050/php/sirkelomkretsfast.php <head> Generert XHTML-fil <title>php sirkelberegning</title> </head> <body> <h1>php sirkelberegning</h1> <p> <?php define("pi",3.1415926535897932); $radius = 1.0 ; <p> print("radius er ".$radius); Radius er 1?> <br /> <?php $omkrets = 2 * $radius * PI; print("omkrets er ".$omkrets);?> </p> </body> </html> <html> <head> <title>php sirkelberegning</title> </head> <body> <h1>php sirkelberegning</h1> <br/> Omkrets er 6.2831853071796</p> </body> </html> INF1050-php-8

PHP-språket Definere konstanter: define("pi",3.1415926535897932); Det er vanlig å bruke store bokstaver for konstant-navn. Variable: Variable er dynamisk typet en variabel kan tilordnes en verdi av en hvilken som helst type Variabelnavn begynner alltid med tegnet $. Variablen opprettes første gang den nevnes. Tilordning skjer ved hjelp av tilordningsoperatoren = Eksempel: $radius = 1.0; Aritmetiske uttrykk: Eksempel: 2 * $radius * PI; Skjøte sammen tekststrenger: Sammenskjøtingsoperatoren. (punkt) INF1050-php-9

PHP-språket <?php define("pi",3.1415); $radius = 1.0; print("radius er ".$radius);?> <?php $omkrets = 2 * $radius * PI; print("omkrets er ".$omkrets);?> // definisjon av en konstant // deklarer og initialiser $radius // skriv en streng // beregn $omkrets // skriv en streng INF1050-php-10

PHP-språket IF-setninger IF-setninger if ($antallkronblader % 2 == 1){ print ("Elsker!"); } if ($antallkronblader % 2 == 1){ print ("Elsker!"); } else { print ("Elsker ikke "); } == er en sammenlikningsoperator (comparison operator). Se en komplett liste på http://no2.php.net/manual/en/language.operators.comparison.php INF1050-php-11

PHP-språket Løkker FOR-løkker for ( $i = 1; $i <= $antall; $i++ ) {.. } WHILE-løkker while ($i <= $antall) {.. $i = $i + 1; } INF1050-php-12

PHP bruker assosiative arrayer Elementene i et assosiativt array består av nøkkel-verdi-par ( key-value-pairs ) Som nøkler kan brukes heltall (analogt med indekser i andre språk) og tekststrenger. Array med heltallsnøkler (indekser), eksempel: $mittarray = array(0 => 6, 1 => 13, 2 => 'Per', 3 => 'Gro', 4 => 3.14); $mittarray[5] = 2.71; $element3 = $mittarray[3]; // tilordner verdien Gro til $element3 Dersom det ikke er gitt noen eksplisitt nøkkel, brukes eksisterende maksimumsverdi + 1. Initialverdien er 0. Vi kan derfor også skrive $mittarray = array(6, 13,'Per','Gro', 3.14); Array med tekststrenger som nøkler, eksempel: $mittarray = array('etternavn'=>'dal', 'fornavn'=>'gro'); $mittarray['adresse'] = 'Nygaten 123' ; $fornavn = $mittarray['fornavn']; // tilordner verdien 'Gro' Array med både heltall og tekststrenger som nøkler, eksempel: $mittarray = array(6, 13, 'fornavn'=>'per', 3.14); var_dump($mittarray) gir: array(4) { [0]=> int(6) [1]=> int(13) ["fornavn"]=> string(3) "Per" [2]=> float(3.14) } INF1050-php-13

Tekststrenger Tekststrenger avgrenses med apostrof ' eller anførselstegn " o Ved bruk av ' bearbeides ikke tekststrengen o Ved bruk av " bearbeides tekststrengen, for eksempel konverteres \n til symbolet for linjeskift Hvis tekststrengen inneholder avgrensningssymbolet, må escape-symbolet \ settes inn i forkant: print("\" Jeg elsker deg!\", sa han"); For å unngå escape-symbolet, bruk (hvis det lar seg gjøre) avgrensningssymboler som ikke forekommer i tekststrengen: print("'jeg elsker deg!', sa han"); print('"jeg elsker deg!", sa hun'); INF1050-php-14

Hente parametre fra brukeren På filen ~inf1050/php/sirkelomkrets.php <html> <head> <title>php sirkelberegning</title> </head> <body> <h1>php sirkelberegning</h1> <p><?php define("pi", 3.1415926535897932); $radius = $_GET['radius']; print("radius er ".$radius);?> <br /> <?php $omkrets = 2 * $radius * PI; print("omkrets er ".$omkrets);?></p> </body> </html> Inndataene legges i arrayet $_GET OBS! INF1050-php-15

Webformularer, parametre og scripts skjermbilde nettleser send nettleser http://...... /form.html xhtml-tekst med form http://......?parametre xhtml-tekst med svar webtjener webtjener Script xhtml-fil Database INF1050-php-16

Et enkelt webformular INF1050-php-17

XHTML-kode for webformularet GET På filen ~inf1050/php/sirkelform.html <head> <title>sirkelformular</title> </head> sirkelomkrets.php $radius=$_get['radius']; print("radius er ".$radius); <body> <h1>beregning av omkretsen til en sirkel</h1> <hr /> <form method="get" action="sirkelomkrets.php"> <p>skriv inn radius <input type="text" size = "10" name="radius"/></p> <p><button type="submit" name="submit">beregn omkrets</button> <button type="reset" name="reset">tøm inndatafelt</button></p> </form> <hr /> <address>laget av NN dato</address> </body> sirkelomkrets.php?radius= </html> INF1050-php-18

XHTML-kode for webformularet POST På filen ~inf1050/php/sirkelformpost.html sirkelomkretspost.php <head> <title>sirkelformular</title> $radius=$_post['radius']; print("radius er ".$radius); </head> <body> Inndataene <h1>beregning av omkretsen til en sirkel</h1> legges i arrayet <hr/> $_POST <form method="post" action="sirkelomkretspost.php"> <p>skriv inn radius<input type="text" size = "10" name="radius"/></p> <p><button type="submit" name="submit">beregn omkrets</button> <button type="reset" name="reset">tøm inndatafelt</button> </form> <hr /> <address>laget av NN dato</address> </body> </html> sirkelomkretspost.php INF1050-php-19

XHTML-formular og PHP på samme fil På filen sirkelberegning.php: <?php define("pi",3.1415926535897932); if(isset($_post['radius'])) $radius = $_POST['radius']; else $radius = 0; $omkrets = 2 * $radius * PI; $resultat = "Omkrets er ".$omkrets;?> <html> <head> <title>php sirkelberegning</title> </head> <body> <h1>beregning av omkretsen til en sirkel</h1> <hr /> <form method="post" action="sirkelberegning.php"> <p>skriv inn radius <input type= text" size = "10" name="radius" value="<?php print($radius);?>" /> <br /> <button type="submit" name="submit">beregn omkrets</button> <button type="reset" name="reset">tøm inndatafelt</button> </p> </form> <p> <?php print($resultat);?> </p> <hr /> <address>laget av NN dato</address> </body> </html> Husk at php-koden blir kjørt før brukeren har fått mulighet til å se skjermbildet! Derfor isset-testen! INF1050-php-20

XHTML-formular og PHP på samme fil - resultat av kjøring INF1050-php-21

PHP og XHTML Vær oppmerksom på at PHP-prosessorer kan mistolke de innledende XML besvergelser i XHTML-filer! Her et eksempel: På filen helloxhtml.php: <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3c.org/tr/xhtml1/dtd/xhtml1-strict.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml"> <head> <title>php Hello World</title> </head> <body> <h1>hello World fra PHP</h1> <?php print("<p>hello World</p>");?> </body> </html> INF1050-php-22

PHP og XHTML (forts.) Skriv derfor ut xhtml-besvergelsene med php! På filen helloxhtml1.php: <?php print(' <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3c.org/tr/xhtml1/dtd/xhtml1-strict.dtd"> <html xmlns = "http://www.w3.org/1999/xhtml"> ');?> <head> <title>php Hello World</title> </head> <body> <h1>hello World fra PHP</h1> <?php print("<p>hello World</p>");?> </body> </html> INF1050-php-23

Sessions Hvordan overføre data fra en klient-tjener-interaksjon til den neste: Åpne en session med funksjonskallet session_start( ); Meld inn variable hvis verdier skal overføres: session_register('bruker'); session_register('passord'); Gjør variablene og deres verdier tilgjengelig i andre tjenerprogrammer med session_start( ); En session varer til nettleseren tas ned eller til timeout Dataene ligger på et beskyttet område på tjeneren pekeren til dette området overføres ved hjelp av en cookie INF1050-php-24

PHP mot databaser De fleste skriptspråk tilbyr god støtte for kobling mot databaser PHP har støtte for bl.a. MySQL og Oracle Innebygde funksjoner for kobling mot Oracle o OCILogon o OCILogoff o OCIExecute o INF1050-php-25

authenticate() Kjekt åha pådb.inc setter opp en dialogboks der brukeren blir invitert til å skrive inn brukernavn og passord. Verdiene legges i $bruker og $passord som er registrert i en session $conn = baselogon($bruker, $passord) logger inn i databasen IFIORA som brukeren $bruker med $passord. Funksjonen vil returnere en kobling mot databasen ($conn). baselogoff($conn) vil stenge koblingen $conn og logge ut av databasen. $stmt = basequery($conn, $query) sender SQL-spørringen $query til databasen med koblingen $conn. Returnerer en peker til en buffer med resultatet av spørringen ($stmt). byggupdatequery, bygginsertquery, byggdeletequery funksjoner for å bygge SQL-spørringer (se dokumentasjon) INF1050-php-26

Kjekt åha pågui.inc $html = function lagselectmeny($nokkel, $nrows, $results) returnerer XHTML-kode for en nedtrekksmeny $html = function vistabell($stmt, $pkattributter) returnerer XHTML-kode for å vise fram tabellen som ligger i spørreresultatet $stmt. $html = function vistabellmedlink($stmt, $pkattributter, $hreffil) returnerer XHTML-kode tilsvarende vistabell, men med en ekstra kolonne med en aktiv link til en web-side $hreffil. $html = function lagoppdateringsformular($stmt, $pkattributter) returnerer XHTML-kode som lager et formular som gjør det mulig å endre, legge til, eller fjerne linjer i tabellen som ligger i spørreresultatet $stmt. $html = function laginnleggingsformular($stmt, $pkattributter) returnerer XHTML-kode som lagoppdateringsformular, men med tomme felter INF1050-php-27

<?php include "inc/db.inc"; include "inc/gui.inc"; session_start( ); Eksempel på SQL-spørring med etterfølgende fremvisning $query = "SELECT fylkenr, fylkenavn FROM Fylke ORDER BY fylkenavn"; // print($query); $conn = baselogon($bruker, $passord); // Sender query til databasen, resultatet legges i $stmt// $stmt = basequery($conn, $query); baselogoff($conn); // formater en vakker html-tabell av resultatet // $html = vistabell($stmt, array('fylkenr')); print($html);?> INF1050-php-28

Om feil og sikkerhet Eksempelprogrammene forutsetter happy day scenario Fullstendig kontroll av alle mulige feilsituasjoner med tilhørende diagnosemeldinger vil kreve atskillig mer programkode Den viktigste feilkilden (og den største sikkerhetsrisikoen) ligger imidlertid i gale data fra brukergrensesnittet. Derfor: Sjekk disse! o Ser tabellnavn ut som tabellnavn? o Ser numeriske verdier ut som numeriske verdier? o Finnes det umotiverte (dvs. Oracle SQLkommentartegn)? se www.php.net/manual/en/security.database.php INF1050-php-29

PHP og objekter PHP 5 har klasser og objekter tilsvarende Java. Eksempel: <html> <head> <title>classtest</title> </head> <body> <?php // Declare a simple class class TestClass { const PI = 3.1415926 ; private $foo; public function construct($foo){ $this->foo = $foo; // -> tilsvarer Java. (sin) } public function tostring() { return $this->foo; } } Hebraisk for $class = new TestClass('Hello'); dobbeltkolon print ($class); print (TestClass::PI); // Scope resolution operator (Paamayim Nekudotayim)?> </body> </html> Se dokumentasjon på http://www.php.net/manual/en/language.oop5.php INF1050-php-30

Noen fakta: Et godt råd til slutt o PHP-programmer utføres uten forutgående kompilering. o Variabler deklareres ikke, de opprettes første gang de nevnes. o Variabler er svakt typet. Konklusjon: o Det meste er tillatt, men ikke nødvendigvis riktig! Den vanligste reaksjonen fra et feilaktig PHP-program er at overhodet intet skjer! Moral: o Endre og teste i meget små skritt da vet du hvor feilen er! Lykke til! INF1050-php-31