Data load og udtræk 2. iteration: implmentation (test af backend) 1 PHP mysql Loade og parse XML (SimpleXML, Xpath) Filhåndtering i PHP JSON 2
Data udtræk PHP mysql: Processen 1. Forbind til MySQL server 2. Vælg database 3. Byg query string 4. Send query 5. Hent resultat og vis data 3 <?php $hostname='localhost'; $username='root'; $password='root'; Login script $connection = mysql_connect($hostname,$username,$password); if(!$connection) { print("failed to establish connection to mysql server!"); exit();?> Sikkerhed. Genbrugelighed. 4
<?php require_once 'connect.php'; Load login script med include el. require?> //Select the database $db = mysql_select_db('mydb'); //Run the query $response=mysql_query('select * FROM users'); if(!$response) { print("query Error: ".mysql_error()); mysql_query() returnerer en speciel datatype (resource) mysql_error() returnerer en fejlmeddelelse fra databasen (sidste kald) 5 Indkapsler query i en metode så den kan kaldes med nye queries: function query($database, $querystr){ $db = mysql_select_db($database); //Run query $response=mysql_query($querystr); if(!$response) { print("query Error: ".mysql_error()); return $response; 6
MySQL resource data Metoder der anvender resource data mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_field mysql_fetch_object mysql_fetch_lengths mysql_set_charset mysql_result (læs om alle metoderne: http://dk.php.net/manual/en/ref.mysql.php) 7 mysql_fetch_row <?php include 'query.php'; $result = query("demo","select * FROM users"); while($row = mysql_fetch_row($result)){ echo $row[0]. ': '. $row[1] ;?> 8
Array datatypen En beholder til en samling variable Numeric Array: værdier er knyttet til et index nummer. Tilføje et element: $my_array[]="jacob"; 0 1 2 Hugo Kasper Mads Associative array: en værdi er knyttet til hvert index. Tilføje et element: $my_array[ moderator ]="Jacob"; admin edit read Hugo Kasper Mads 9 mysql_fetch_array <?php include 'query.php'; $result = query("demo","select * FROM users"); while($array = mysql_fetch_array($result,mysql_both)){ echo $array[0]. ' : '. $array['name'] ;?> Dette er ikke nævneværdigt langsommere end fetch_row metoden 10
mysql_fetch_object <?php include 'query.php'; $result = query("demo","select * FROM users", "array"); while ($object = mysql_fetch_object($result)) { echo $object->id. ': '. $object->name;?> 11 PHP Variable i query "SELECT * FROM users WHERE id='$id'" "SELECT". $field." FROM users WHERE id='$id'" 12
Strukturer koden function getusername($id){ [...] function displayusername($id){ $result = getusername($id); [...] displayusername(2); function getproducts($category){ [...] function displayproducts($category) { $result = getproducts($category); [...] displayproducts(); displayproducts("cat2"); 13 PHP og XML: Processen 1. load XML filen 2. find navnet på det første element 3. skriv et loop, der kører for hver childnode 4. output element-navn og data for hver childnode 14
SimpleXML en klasse i php til at loade og læse XML getname() children() attributes() <node attribut1="foo" attribut2="bar" > <childnode> </childnode> <childnode> </childnode> <childnode> </childnode> </node> 15 Simpelt XML dokument test.xml <?xml version="1.0" encoding="iso-8859-1"?> <note> <to>tove</to> <from>jani</from> <heading>reminder</heading> <body>don't forget me this weekend! </body> </note> 16
Load XML som string og konverter til XML: $xmlstr = file_get_contents("test.xml"); $xml = simplexml_load_string($xmlstr); Load en XML fil som XML: $xml = simplexml_load_file("test.xml"); Variablen $xml er instans af SimpleXMLElement klassen. Load ved at instansiere SimpleXMLElement: $xml = new SimpleXMLElement("test.xml",null,true); 17 Parse data i SimpleXMLElement objekter Relativt: $xml->getname(),$xml->children() Absolut: {$xml->body->content 18
Parse attributter Absolut: {$xml['lan'] Relativt: $xml->attributes() 19 test2.xml Komplex XML <?xml version="1.0" encoding="iso-8859-1"?> <note att1="foo" att2="bar" lan="english" > <to>tove</to> <from>jani</from> <heading>reminder</heading> <body> <content>don't forget me this weekend!</content> <footer><contact>contact me@domaine.com</contact> <disclaimer>lorem ipsum...</disclaimer></footer> <item>some item</item> </body> <date>03/09/10</date>> </note> 20
Rekursiv metode 1) Sørg for at der er en udvej (exit condition) - en del af metoden kan beregnes uden et nyt rekursivt kald. 2) Hvert rekursive kald skal være forskelligt fra det forrige. 3) Tro på at det virker :) pseudokode: function traverse_dir($node) { loop through array foreach node as $subnode { do something with $subnode traverse_dir($subnode) 21 Rekursiv parsing <?php $xml = simplexml_load_file("test.xml"); displaychildrenrecursive($xml); function displaychildrenrecursive($xmlobj,$depth=0) {?> foreach ($xmlobj->children() as $child) { echo $child->getname().': '.$child; displaychildrenrecursive($child,$depth+1); $child sendes med som argument i det rekursive kald 22
Xpath XPath: sprog til at søge efter bestemte elementer i et XML dokument <a> <b> <c>text</c> <c>stuff</c> </b> <d> <c>code</c> </d> </a> $result = $xml->xpath('/a/b/c'); Firkantede paranteser bruges til at knytte prædikater til en query: $result = $xml->xpath('/a/b/c[1]'); 23 Xpath syntax Tutorial til Xpath: http://www.w3schools.com/xpath/default.asp 24
Tilgå dynamisk data fra en textfil $fh = fopen("textfile.txt", 'r'); $line = fgets($fh); $characters = fread($fh,filesize ("textfile.txt")); $fh = file_get_contents("textfile.txt"); 25 tekst vs. XML vs. Database Lagringstype Fordele Ulemper tekstfil let, enkelt og intuitivt utilstrækkeligt ved større kompleksitet, sandsynlighed for fejl XML relativ enkelthed, genkendelighed, selvdokumenterende, læsbart, stringent syntax og parsing. mange ord, redundant, fylder meget, bruger meget båndbredde, svært at parse ujævne strukturer. MySql hurtigt at loade, skal ikke parses, reducerer redundans, konsistent, sikkerhed. svært at læse og editere 26
Data fra webservices Det mest almindelige responseformat er XML og JSON JSON = Javascript object Notation Et tekst format/serialiseringssprog, der bygger på universelle datastrukturer som Objekter og arrays. 27 { Et JSON Eksempel "type":"user", "count":1, "results": [ { "user_name":"testusername", "user_id":123456, "url":"http:\/\/www.etsy.com\/profile.php?user_id=123456", "image_id":78910, "image_url_25x25":"http:\/\/ny-image0.etsy.com\/iusa_25x25.78910.jpg", "city":"walla Walla, WA" ], "params": { "user_id":123456, "detail_level":"low", "type":"user" 28
{ JSON:Eksempel "type":"user", "count":1, "results": [ { "user_name":"testusername", "user_id":123456, "url":"http:\/\/www.etsy.com\/profile.php?user_id=123456", "image_id":78910, etsyresponse:object type:string count:int params:object "image_url_25x25":"http:\/\/ny-image0.etsy.com\/iusa_25x25.78910.jpg", "image_url_30x30":"http:\/\/ny-image0.etsy.com\/iusa_30x30.78910.jpg", "image_url_50x50":"http:\/\/ny-image0.etsy.com\/iusa_50x50.78910.jpg", user_id:int "image_url_75x75":"http:\/\/ny-image0.etsy.com\/iusa_75x75.78910.jpg", detail_level:string "join_epoch":1229379928.06, "city":"walla Walla, WA" ], "params": { results:array "user_id":123456, "detail_level":"low", 29 JSON:php parser json_decode ($json) $response = json_decode($json); echo $response->results[0]->city; 30
Øvelser Jvf. øvelser i sidste uge: Sørg for at I har en god (normaliseret) database med masser af test data. Opret et sikkert login script, sådan at forbindelse til databasen kun oprettes ét sted. Planlæg: Find ud af hvilke data der skal hentes ud af jeres database forskellige steder i systemet. (Fx - vis alle produkter, vis alle produkter inden for en given kategori eller vis alle brugernavne ). Lav gerne en liste, eller notér datakravene på en ny version af jeres sitemap. Skriv en query for hvert datakrav I har i jeres system. Det kan være en god idé at indkapsle hver query i en metode, så querien kan kaldes uvilkårligt. Brug en fetch metode til at hente resultatet og udskriv for at tjekke at det er den rigtige data I har fået fat i. Kig på Jeres wireframe. Skriv statisk interface data (copy, menupunkter, labels) i en tekstfil eller et XML dokument (hvis I ikke allerede har gjort det) og test at I kan få fat i det med PHP. 31 Ressourcer Tutorial om SimpleXML: http://debuggable.com/posts/parsing-xml-using-simplexml: 480f4dfe-6a58-4a17-a133-455acbdd56cb XPATH: http://www.w3schools.com/xpath/xpath_syntax.asp JSON: http://www.json.org/ 32