Dagens menu HTML og PHP: Baglæs fra output til input PHP: Variable, strenge og arrays Funktioner, oprettelse og kald (og variable på tværs af funktioner) echo vs return? if-else konstruktioner MySQL: Hvad returnerer mysql_query(): true/false/resultatsæt? mysql_fetch_row(), mysql_error() Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 1 HTML, PHP, SQL, webserver, hvad er hvad?? Begrebsafklaring: Sprog: HTML, PHP, SQL Sprog: HTML Hardware: Browser Hardware: Browser, webserver, databaseserver, database PHP Webserver Databaseserver PHP-filer på webserveren skal tale PHP med databaseserveren, SQL med databasen, og returnere HTML til browseren SQL Database Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 2 1
HTML og PHP, baglæns fra output til input (1) Det nemme eksempel: Ønskes: <p>krig er skidt, PHP er godt</p> Laves: <? echo <p>krig er skidt, PHP er godt</p> ;?> Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 3 HTML og PHP, baglæns fra output til input (2) Det lidt sværere eksempel: Ønskes: Camilla ckj@it-c.dk Lasse xls@it-c.dk Laves: <table> <tr><td>camilla</td><td>ckj@it-c.dk</td></tr> <tr><td>lasse</td><td>xls@it-c.dk</td></tr> </table> <table> <? $result = mysql_query( SELECT navn,email FROM table1 ); while ($row = mysql_fetch_row($result) { echo <tr><td>. $row[0]. </td>. <td>. $row[1]. </td></tr> ;?> </table> Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 4 2
HTML og PHP, baglæns fra output til input (3) Uklart output = ukendt proces = famlende programmering Derfor: Hvis du er i tvivl så start bagfra Hvordan ser det endelige resultat ud (visuelt)? Hvordan ser det endelige resultat ud i kildekoden (html) Hvilke dele går tilsyneladende igen (kunne tyde på løkker) <tr><td>navn</td><td>email</td></td></tr> Hvilke dele kommer fra databasen Camilla, ckj@it-c.dk, Lasse, xls@it-c.dk Hvilke andre dele kan identificeres? Hvordan laves det i php? Camilla Lasse ckj@it-c.dk xls@it-c.dk Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 5 Variable og strenge En variabel er en dims med et navn og en værdi (info inde i boksen). Værdien kan være En tekststreng $var = her er noget tekst ; Et tal $var = 36; En boolean $var = true; m.m. Quiz: Hvad er følgende? $var1 = -237; $var2 = 945 ; $var3 = $var1; $var4 = false ; $var5 = array( Lasse, xls@it-c.dk ); Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 6 3
Arrays (1) Et array er en samling af værdier Der findes to typer arrays: Associative $arr1 = array ( navn => Camilla, email => ckj@it-c.dk ); $arr2[ navn ] = Camilla ; $arr2[ email ] = ckj@it-c.dk ; Indexikale $arr1 = array ( Camilla, ckj@it-c.dk ); $arr2[0] = Camilla ; $arr2[1] = ckj@it-c.dk ; Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 7 Arrays (2) Et array kan forståes som en liste: Man navigerer et array ad x-aksen, derfor er $array[1] det samme som ckj@it-c.dk... Camilla, ckj@it-c.dk Arrays kan være flerdimensionelle, fx 2D, og kan nu bedre forstås som et skema: Man navigerer først ad x-aksen, derefter ad y-aksen, derfor er $array[0][1] det samme som ckj@it-c.dk... Camilla Lasse ckj@it-c.dk xls@it-c.dk Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 8 4
Funktioner (1) En funktion er en samling af en eller flere processer/kommandoer. Funktioner kaldes også for procedurer. Opret en simpel procedure: function bingohat() { echo <p>krig er skidt, PHP er godt</p> ; Kald/aktivér/eksekvér funktionen: bingohat(); Resultat: Krig er skidt, PHP er godt OBS: Oprettelse og kald af funktion er IKKE det samme! Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 9 Funktioner (2), argumenter En funktion kan tage argumenter som input function bingohat($arg1, $arg2) { echo <p>krig er. $arg1., PHP er. $ARG2. </p> ; Argumenter kan være i form tekststrenge, variabler, arrays, m.m. $klaphat = godt ; bingohat( skidt, $klaphat); Resultat: Krig er skidt, PHP er godt Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 10 5
Funktioner (3), echo eller return? En funktion bør gøre brug af ENTEN echoeller return function multiplicer_ver1($tal1,$tal2) { echo <p>. $tal1. gange. $tal2. er lig. ($tal1*$tal2). </p> ; multiplicer_ver1(12,4); function multiplicer_ver2($tal1,$tal2) { $result = <p>. $tal1. gange. $tal2. er lig. ($tal1*$tal2). </p> ; return $result; $regnetal = 16; $res = multiplicer_ver1($regnetal,3); echo $res; Resultat: 12 gange 4 er lig 48 16 gange 3 er lig 48 Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 11 Funktioner (4), echo eller return? Hvad er forskellen på echo og return? Return en bredere anvendelig fordi echo skriver direkte til brugeren, mens return giver mulighed for videremanipulation, inden der skrives til brugeren (hvis der overhovedet skal skrives til brugeren...) function multiplicer_ver2($tal1,$tal2) { return ($tal1*$tal2); $res = multiplicer_ver2(16,3); if ($res > 50) {... else {... Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 12 6
Funktioner (5), variable på tværs af funktioner Variable eksisterer ikke både i og udenfor rammerne af en funktion function multiplicer_ver2($tal1,$tal2) { $resultat = $tal1*$tal2; multiplicer_ver2(16,3); echo $resultat; Resultat: [ ] Fejl: $resultat er oprettet inde i funktionen, men ikke givet med ud (return $resultat), opsamlet ($res = multiplicer_ver2(16,3)) for herefter at være tilgængelig også udenfor... Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 13 Funktioner (6), quiztime Quiz: Find 5 fejl!! function multiplicer_ver1($tal1,$tal22) { echo <p>. $tal1. gange. $tal2. er lig. (tal1*$tal22). </p> ; multiplicer_ver1($regnetal,4); function multiplicer_ver2($tal1,$tal2) { $result = <p>. $tal1. gange. $tal2. er lig ($tal1*$tal2). </p> ; return $result $regnetal = 16; multiplicer_ver1(16,3); echo $result; Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 14 7
If-else konstruktioner Ofte bruges if-else blot i små passager fx ifm formvalidering if ($submitknap) { $pattern = "^[A-Za-z0-9_-\.]+@[A-Za-z0-9_-]+\.[A-Za-z0-9_-\.]+$ ; $mailok = ereg($pattern,$email); if ($mailok) { // alt i orden, toget kører videre else { // dårlig mail, fætter, prøv igen NB: Har brugeren klikket på submit? Se http://www.it-c.dk/people/xls/w2/ under rettelser til opgavesæt 5... Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 15 If-else konstruktioner (2) Men if-else konstruktioner kan også bruges til fx at omkranse et helt script og dermed være med til at styre udfaldet af et gennemløb... function executesql($strsql) { if (!$link = mysql_connect(......)) { echo "<p>ingen server.<br>". mysql_error()."</p>"; return false; else { if (!mysql_select_db(..,$link)) { echo "<p>ingen database.<br>". mysql_error()."</p>"; return false; else { $res = mysql_query($strsql, $link); if (!$res = mysql_query($strsql, $link)) { echo "<p>query fejlede.<br>". mysql_error()."</p>"; return false; else { return $res; mysql_close($link); Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 16 8
Hvad returner mysql_query() / executesql()? mysql_query() kan returnere 3 forskellige ting, alt afhængig af forespørgselstypen. Der findes grundlæggende to forskellige slags databaseforespørgsler, dem der returnerer data ( resultatsæt ) og dem, der ikke gør. Førstnævnte returner enten data eller false, sidstnævnte returnerer true eller false Eksempler på SQL-kommandoer, der returnerer data: SELECT, COUNT, DESCRIBE... Eksempler på SQL-kommandoer, der IKKE returnerer data: CREATE, INSERT, UPDATE, DELETE, DROP, ALTER... Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 17 Validering af mysql_query() Udfaldet af mysql_query bør testes, enten internt i executesql() eller ved kaldstedet fx inden resultatsættet gives videre til mysql_fetch_row(). if ($res = executesql( SELECT navn,email FROM brugere )) { if (mysql_num_rows($res) > 0) { while ($row = mysql_fetch_row($res)) { echo... else { echo <p>forespørgslen returnerede ingen rækker</p> ; else { echo <p>forespørgslen fejlede...</p> ; Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 18 9
Fejlmeddelelser med mysql_error() Ved validering af mysql-operationer kan man hvis operationen fejler få mysql-databasens egen fejlmeddelelse vha funktionen mysql_error(). function executesql($strsql) { if (!$link = mysql_connect(......)) { echo "<p>ingen server.<br>". mysql_error()."</p>"; return false; else {... Se yderligere forklaring på http://www.php.net/manual/en/function.mysql-error.php Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 19 Online resourcer W2: http://www.it-c.dk/people/xls/w2/ PHP: http://www.webcafe.dk/artikler/php/ http://www.webcafe.dk/artikler/sql/ http://hotwired.lycos.com/webmonkey/programming/php/ http://www.zend.com/zend/tut/ MySQL: http://www.php.net/manual/en/ref.mysql.php http://hotwired.lycos.com/webmonkey/99/21/index2a.html SQL: http://www.w3schools.com/sql/default.asp Lasse Steensgaard[xls] Opsamlende forelæsning på W2, 2. april 2003 slide 20 10