New Computation // Problem:Ingen undersøger om form-variablen kroner indeholder et tal"> New Computation // Problem:Ingen undersøger om form-variablen kroner indeholder et tal">

Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Databasestøttet Webpublicering1 Databasestøttet Webpublicering, Efterår 2005 Lektion 5, Mandag 26/9 : Web-programmering med PHP Hvad er gennemgået? Værdien.

Lignende præsentationer


Præsentationer af emnet: "Databasestøttet Webpublicering1 Databasestøttet Webpublicering, Efterår 2005 Lektion 5, Mandag 26/9 : Web-programmering med PHP Hvad er gennemgået? Værdien."— Præsentationens transcript:

1 Databasestøttet Webpublicering1 Databasestøttet Webpublicering, Efterår 2005 Lektion 5, Mandag 26/9 : Web-programmering med PHP Hvad er gennemgået? Værdien af validering af input fra brugere (form variable) Regulære udtryk/mønstre (expressions/patterns) PHP funktionen ereg Eksempler på validering af form-variable Biblioteksfunktioner til vaidering af form-variable Andre anvendelser af regulære udtryk Anvend ereg til udtræk af data fra web-sider Introduktion til øvelserne

2 Databasestøttet Webpublicering2 Gennemgået indtil nu Variable, tal, strenge og tabeller (arrays) Udregninger if-konstruktioner og løkker Funktioner og genbrug af kode Modtagelse af brugerens data vha. forms

3 Databasestøttet Webpublicering3 Værdien af en validering af form-variable Uden en validering af bruger-input er vore Web-programmer ikke robuste! F.eks. : Currency exchange service —exchange.html Exchange Bank Enter value in kroner: Filen exchange.php: Exchange Bank <? $kroner = $_POST[’kroner’] ; $rate = 8.43; $fee = 20.0; $dollars = ($kroner - $fee) / $rate; $dollars = number_format($dollars, 2, ",", "."); echo "For DKr. $kroner you receive \$$dollars"; ?> New Computation // Problem:Ingen undersøger om form-variablen kroner indeholder et tal

4 Databasestøttet Webpublicering4 Hvad kan gå galt, hvis vi ikke validerer form variablene? Forskellige slags af fejl kan optræde i den fortsatte udregning baseret på fejlagtig bruger-input: Kosmetiske fejl: Programmet returnerer ikke-velformet HTML kode til browseren Semantiske fejl: Programmet returnerer velformet HTML kode, som ser ud til at være korrekt – men ikke er det! Meget grove fejl: Data slettes fra databasen fordi manglende validering kan resulterer i tilgang fra hackere Ved at validere input fra brugerne kan undgå det fleste typer fejl

5 Databasestøttet Webpublicering5 Mange slags form–variable Vi har set behovet for kunne afgøre om en form-variabel indeholder et tal. Der er mange andre typer af data vi kan bede brugerne om at indtaste: Decimaltal (kommatal) E-mail adresser Tal i et bestemt interval (f.eks., postnumre) URLadresser Farver (red, green, blue) Datoer... Vi har brug for et sprog til at beskrive strenge med et bestemt mønster Sproget vi behøver kaldes regulære udtryk regular expressions, eller mønstre patterns.

6 Databasestøttet Webpublicering6 Syntaks af regulære udtryk 1. del Et mønster m kan have forskellige former, incl.:. matcher et hvert andet tegn c matcher tegnet c; tegnet. skrives: \. m1m2 et sekventielt match af m1 og m2. F.eks.: mønsteret ‘a.c’ matcher strengen ‘abc’ m* matches af 0 eller flere sekventielle forekomster af tegnfølgen, som matcher mønsteret m. F.eks.: strengen ‘abbbbbba’ og ‘aa’ matcher mønsteret ‘ab*a’ (m) matches af strenge som matcher m. eks: Strengen ‘cababcc’ matcher mønstret ‘c(ab)*cc’ m+ matches af 1 eller flere sekventielle forekomster af tegnfølger, som matcher mønstret m. Eks: mønstret ‘ca+b’ matches af strengen ‘caaab’ men ikke strengen ‘cb’ m? matches af 0 eller 1 forekomst af tegnfølgen, som matcher mønsteret m. F.eks.: Møntret ‘abc?’ matches af både strengene ‘abc’ og ‘ab’.

7 Databasestøttet Webpublicering7 Syntax af regulære udtryk, 2. del Et mønster m kan have forskellige former, incl.: m1 | m2 matches af tegnfølgen, som matcher m1 eller m2. F.eks.: mønstret ‘(hi|hello)’ matches af tegnfølgen ‘hi’ og tegnfølgen ’hello’ [...] matches af tegn i den specificerede klasse eller interval. F.eks.: mønsteret [abc1-4]* matches af tegnfølgen bestående af tegnene a, b, c, 1, 2, 3, 4 [ˆ...] matches af alle tegn som IKKE er i denne klasse eller dette interval, f.eks.: mønsteret [ˆabc1-4]* matches af tegnfølgen bestående af ethvert tegn undtagen a, b, c, 1, 2, 3, 4. Så circumflex ˆ betyder “alt andet end” tegnene som følger den.

8 Databasestøttet Webpublicering8 Eksempler på mønstre [A-Za-zÆØÅæøå] : matches af ethvert dansk bogstav [0-9][0-9] : matches af 2 decimale cifre (incl. Foranstillet nul [’0’] ) (hi|hello) : matches af de 2 strenge hi og hello ((a|b)a)* : matches af aa, ba, aaaa, baaa,... (0|1)+ : matches af binære tal dvs., 0, 1, 01, 11, 011101010,..... : matches af 2 vilkårlige tegn (red|green|blue) : matches af farverne red, green and blue ([1-9][0-9]*)/([1-9][0-9]*) : matches af heltals kvotienter, f.eks., 1/8, 32/5645, 45/6,... Matcher strengen 012/54 det sidste mønster? Matcher strengen 2/0 match det sidste mønster?

9 Databasestøttet Webpublicering9 PHP funktionen ereg Den indbyggede funktion ereg kan anvendes til at bestemme om et mønster m matches af en delstreng af en streng s. Et kald til ereg(m,s) returnerer 1 (TRUE) hvis mønsteret m matches af en delstreng af s. Ellers returnerer den 0 (FALSE). Hvis mønsteret m begynder med ‘^’ skal den matchende delstreng være et prefix af s, dvs., begynde ved det første tegn af s. Tilsvarende, hvis mønsteret m afsluttes med et ‘$’ skal den matchende delstring være et suffix af s. Eksempler: Funktionskald: Resultater: ereg(’[0-9]+’, "aa38AA") 1 ereg(’^[0-9]+’, "aa99") 0 ereg(’^[0-9]+’, "77AA")1 ereg(’^[0-9]+$’, "aa87AA")0 NotaBene: Vi vil som hovedregel anvende ^ og $ som det første og sidste tegn i mønstret, når man validerer bruger input Vi vil angive strengmønstre i PHP med ’...’ for at undgå den specielle betydning af $ i strenge af formen "..."

10 Databasestøttet Webpublicering10 Eksempler på brugen af PHP funktionen ereg FunktionskaldResult ereg(’[a-zA-Z]+’, "Allan Hansen") _____ ereg(’^[a-zA-Z]+$’, "Ulla Jensen")_____ ereg(’^[a-zA-Z]+$’, "")_____ ereg(’^[0-9][0-9]-[0-9][0-9]-[0-9]+$’, "12-22-1969")______ ereg(’^[0-1][0-9]-[0-3][0-9]-[0-9]+$’, "31-12-02")______ ereg(’^(red|green|blue)$’, "red")_______ ereg(’^(red|green|blue)$’, "redblue")_______ ereg(’^(a|bb)*b$’, "bbab")_______ ereg(’^(a|bb)+b*$’, "b")_______

11 Databasestøttet Webpublicering11 Eks. :Webprogrammet pattern.php Vi bygger en ”mønster-matcher” til at eksperimentere med mønstre--pattern.php: Pattern matcher <? $r =$_POST[’r’]; $s =$_POST[’s’]; if ( $r != "" ) { if ( ereg("^($r)\$", $s) ) { echo " Success: The string ’$s’ matches pattern ’$r’ "; } else { echo " Failure: The string ’$s’ does NOT match pattern ’$r’ "; } echo " Pattern: String: ";?> Note:Vi anvender funktionen ereg til at bestemme om en streng matcher et mønster

12 Databasestøttet Webpublicering12 Forbedring af valutaveksling med validering af formvariablen Vi kan forbedre vores ”vautaveksler” ved validering af bruger-input—exchange2.php: Currency Exchange Service Currency Exchange Service (version 2) <? $kroner = $_POST [’kroner’]; if ( ereg(’^(0|[1-9][0-9]*)$’, $kroner) ) { $rate = 8.43; $commission = 20.0; if ( $kroner > $commission ) { $dollars = ($kroner - $commission) / $rate; $dollars = number_format($dollars, 2, ",", "."); echo "In exchange for kr. $kroner you will receive \$$dollars"; } else { echo "You cannot change an amount less than the commission!"; } } else { echo "Please go back and enter a number!"; } ?> // Spørgsmål: //Hvordan reagerer programmet på forskellige slags bruger input?

13 Databasestøttet Webpublicering13 Funktion til at undersøge e-mail adresser Vi kan undersøge om en indtastet e-mailadresse har den forventede form ved at anvende mønsteret: [-0-9a-zA-Z!#$%&*+/=?^_‘{|}~.]+@[-0-9a-zA-Z!#$%&*+/=?^_‘{|}~.]+ Den følgende funktion tager en streng som argument og undersøger om strengen ser ud som en e-mailadresse: function chk_email ( $email ) { if ( ereg(’^[-0-9a-zA-Z!#$%&*+/=?^_‘{|}~.]+’.’@[-0-9a-zA-Z!#$%&*+/=?^_‘{|}~.]+$’, $email) == 0 ) { error("You must enter a valid email address"); } } // Note: Funktionen garanterer ikke, at e-mailadressen eksisterer! Vi anvender en generisk funktion error til at vise en fejlmeddelelse: function error ( $msg ) { echo " Error: $msg "; exit; // Don’t continue the script! } Den eksakte definition af e-mailadresse kan findes i RFC2822 på www.ietf.org www.ietf.org

14 Databasestøttet Webpublicering14 Et bibliotek af funktioner til validering af form-variable Vi kan konstruere en fil formvars.php som indeholder en liste af funktioner til validering af form-variable Derefter kan vi inkludere filen formvars.php (anvend include function) i scripts som læser form-variable. På denne måde bliver det let at validere form-variable. Eksempel: exchange3.php Currency Exchange Service Currency Exchange Service (version 3) <? $kroner = $_POST= [’kroner’]; $rate = 8.43; $commission = 20.0; if ( $kroner > $commission ) { $dollars = ($kroner - $commission) / $rate; $dollars = number_format($dollars, 2, ",", "."); echo "In exchange for kr. $kroner you will receive \$$dollars"; } else { echo "You cannot change an amount less than the commission!"; } ?>

15 Databasestøttet Webpublicering15 Biblioteksfunktioner til validering af form-variable—fortsat Filen formvars.php: <? function error ( $msg ) { echo " Error: $msg "; exit; // Don’t continue the script! } function chk_email ( $email ) { if ( ereg(’^[-0-9a-zA-Z!#$%&*+/=?^_‘{|}~.]+’.’@[-0-9a-zA-Z!#$%&*+/=?^_‘{|}~.]+$’, $email) == 0 ) { error("You must enter a valid email address"); } function chk_integer ( $number ) { if ( ereg(’^(0|[1-9][0-9]*)$’, $number) == 0 ) { error("You must enter an integer number"); } } ?>

16 Databasestøttet Webpublicering16 Andre anvendelser af regulære udtryk Regulære udtryk kan også anvendes til andre opgaver end evaluering af input fra brugere Eksempler: Til at finde mønstre i en tekst Søg og erstat i en tekst Hente data fra fremmede web-sites: I web-teknologi, kan regulære udtryk bruges til at finde relevant information i tekst, som downloades automatisk fra Internettet, f.eks.: Dagens nyheder fra Reuters Valutakurser Aktiemarkedets kurser, indeks og bevægelser Vejrudsigten Pollental

17 Databasestøttet Webpublicering17 Hent data fra fremmede web-sites med PHP som værktøj Den følgende funktion kan anvendes til at ”loade” en fremmed web-site i en streng til PHP: function fetchurl ( $url ) { $fp = fopen($url, ’r’); if ( ! $fp ) return "No page"; for ($t = "" ; !feof($fp) ; ) $content.= fread($fp, 8192); fclose($fp); return $content; } ereg funktionen kan også anvendes til at udtrække information fra en hjemmeside indeholdt i en streng. Hvis man giver ereg et ekstra argument $result, delstrengen som matcher den n te del (i parentes) af mønstret, som er gemt i $result[n]. Når man kalder funktionen ereg($p,$txt,$result) er de 3 argumenter: $p er mønstret, som skal matches teksten for at finde forekomster $txt er teksten i hvilken en delstreng som matcher mønstret er søgt $result er resultatet, en tabel som indeholder den tekst, som matchede, returværdi fra funktionen ereg

18 Databasestøttet Webpublicering18 Eksempel: World population- popclock.php World Population Watch World Population Watch <? function fetchurl ( $url ) { $fp = fopen($url, ’r’); if ( ! $fp ) return "No page"; for ($t = "" ; !feof($fp) ; ) $content.= fread($fp, 8192); fclose($fp); return $content; } $content = fetchurl("http://www.census.gov/cgi- bin/ipc/popclockw"); ereg(" ([0-9,]+) ",$content,$result); echo "There are at present $result[1] people in the world."; ?>

19 Databasestøttet Webpublicering19 Introduktion til øvelser 5 Til øvelserne skal du: Træne i regulære udtryk. Konstruere en forbedret version af BMI (body mass index web service). Konstruere en dollar-valuta-vekslingstjeneste, som udtrækker kursen fra en fremmed web-site og tilbyder ombytning af kroner til dollars og omvendt. Præsentere et brugbart automatisk udtræk af information fra en eller flere web-sites på Internettet og implementere en web-tjeneste, som udnytter denne information — vejrudsigt (rapport fra DMI), aktie markedets index, pollental,...


Download ppt "Databasestøttet Webpublicering1 Databasestøttet Webpublicering, Efterår 2005 Lektion 5, Mandag 26/9 : Web-programmering med PHP Hvad er gennemgået? Værdien."

Lignende præsentationer


Annoncer fra Google