Werken met bestanden 1
Vakopzet C 1 2 3 4 5 6 7 8 9 WC TOETS
Lessen Lesweek 1 (47)Vakoverzicht en introductie Lesweek 2 (48)Doornemen Ch3 (40p) Lesweek 3 (49)Deeltoets 1, Doornemen Ch4+Ch5 (72p) Lesweek 4 (50)Doornemen Ch6+Ch7 (74p) [Ch 8] Lesweek 5 (51)Doornemen Ch9+Ch10 (60p) Lesweek 6 (2) Deeltoets 2, Doornemen Ch11 (32p) Lesweek 7 (3) Doornemen Ch13+Ch14 (52p) [Ch 12+Ch15] Lesweek 9 (5) Deeltoets 3 Maandag voor 12:00 's middags inleveren
Inhoudsopgave 1: What Is PHP And Why Should I Care? 2: Getting Ready to Work with PHP 3: How to Write PHP Scripts 4: Lightening Your Workload with Includes 5: Bringing Forms to Life 6: Uploading Files 7: Using PHP to Manage Files 8: [Generating Thumbnail Images] 9: Pages That Remember: Simple Login and Multipage Forms 10: Getting Started with MySQL 11: Connecting to MySQL with PHP and SQL 12: [Creating a Dynamic Online Gallery] 13: Managing Content 14: Formatting Text and Dates 15: [Pulling Data from Multiple Tables] 16: [Managing Multiple Database Tables] 17: [Authenticating Users with a Database]
Vragen?
Werken met bestanden 6
Bestandsrechten user, group, world 644 / 755 / 600 0: geen rechten 4: lezen 5: lezen en uitvoeren 6: lezen en schrijven 7: lezen, schrijven en uitvoeren
Manieren van openen met fopen() r w x Open in lees modus Open in schrijf modus Open in schrijf modus, maak het bestand aan als het nog niet bestaat, zet de schrijfkop aan het begin van het bestand, als het bestand bestaat geeft fopen() false terug a- Open in schrijf modus, maak het bestand aan als het nog niet bestaat w+ Open in lees-en-schrijf modus, zet de kop aan het begin van het bestand, wis de inhoud van het bestand als die bestaat, maak het bestand aan als het nog niet bestaat r+ Open in lees-en-schrijf modus, zet de kop aan het begin van het bestand a+ Open in lees-en-schrijf modus, zet de kop aan het eind van het bestand, maak het bestand aan als het nog niet bestaat x+ Open in lees-en-schrijf modus, zet de kop aan het begin van het bestand, als het bestand bestaat geeft fopen() false terug
les4/gastenboek/index.php 1. Open het bestand met fopen, deze functie geeft een file handle terug, de manier van openen wordt meegegeven 2. Zolang het bestand inhoud heeft 3. Vul een variabele met de inhoud van het bestand in chunks van 5000 bytes
les4/gastenboek/index.php 1. Open het bestand met fopen, let op de modus! 2. Schrijf iets naar het bestand 3. Sluit het bestand
Potentieel dodelijk?! unlink('file.txt'); unlink('file.php'); unlink('.htaccess');
git clone https://github.com/lbrt/ CMD-SSS-2013-2014.git
Uploaden van bestanden 13
Versturen van informatie post/ get INFORMATIE HTTP REQUEST HTTP RESPONSE $_POST['naam'] $_GET['naam'] PHP MySQL Mongo [...]
Upload formulier $_FILES['form_veld_naam'] ['name'] ['type'] ['tmp_name'] ['error'] ['size'] bestandsnaam MIME-Type verwijzing naar tijdelijke map op de server
Upload formulier 0: Upload succesvol 1: Bestand is te groot (waarde uit php.ini) 2: Bestand is te groot (waarde uit formulier) 3: Bestand is maar gedeeltelijk geüploaded 4: Formulier verstuurd zonder bestand 5: Niet gedefinieerd 6: Tijdelijke map bestaat niet 7: Mag niet schrijven naar tijdelijke map
Bestanden genereren 17
PHP genereert tekst Database (MySQL) Etiam porta sem malesuada magna mollis euismod. Etiam porta sem malesuada magna mollis euismod. Cras mattis consectetur purus sit amet fermentum. Curabitur blandit tempus porttitor. Cras mattis consectetur purus sit amet fermentum. Vestibulum id ligula porta felis euismod semper. Nulla vitae elit libero, a pharetra augue. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Donec sed odio dui. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nulla vitae elit libero, a pharetra augue. Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Sed posuere consectetur est at lobortis.
HTTP-request
GET request GET /les2/voorbeelden/showvars.php?gettest=wauw%20het%20werkt%20echt!! HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en,nl;q=0.7,en-us;q=0.3 Accept-Encoding: gzip, deflate DNT: 1 Referer: http://localhost/les2/voorbeelden/showvars.php Connection: keep-alive Hogeschool van Amsterdam CMD - Serverside Scripting 20
POST request POST /les2/voorbeelden/showvars.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en,nl;q=0.7,en-us;q=0.3 Accept-Encoding: gzip, deflate DNT: 1 Referer: http://localhost/les2/voorbeelden/showvars.php Connection: keep-alive Content-Length: 56 Content-Type: application/x-www-form-urlencoded achternaam=de+vries&achternaam=jan&verstuurknop=stuur%21 Hogeschool van Amsterdam CMD - Serverside Scripting 21
HTTP-response
GET response HTTP/1.1 200 OK Date: Sun, 08 Dec 2013 18:20:22 GMT Server: Apache X-Powered-By: PHP/5.3.20 Content-Length: 1152 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/tr/xhtml1/dtd/ xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>overzicht van GET en POST vars</title> <link href="/style/style_normal.css" rel="stylesheet" type="text/css" media="all" /> </head> <body> Hogeschool van Amsterdam CMD - Serverside Scripting 23
POST response HTTP/1.1 200 OK Date: Sun, 08 Dec 2013 18:25:29 GMT Server: Apache X-Powered-By: PHP/5.3.20 Content-Length: 1167 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/tr/xhtml1/dtd/ xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>overzicht van GET en POST vars</title> <link href="/style/style_normal.css" rel="stylesheet" type="text/css" media="all" /> </head> <body> Hogeschool van Amsterdam CMD - Serverside Scripting 24
HTTP (80) vs HTTPS (443)?
Tekstformaten
MIME-types Multipurpose Internet Mail Extensions
Default PHP MIME-type output: text/html
HTML <!DOCTYPE html> <html> <head> <title>paginatitel</title> <link href="stylesheet" rel="stylesheet" type="text/css" /> </head> <body> de inhoud van de pagina komt hier </body> </html>
MIME-types
RSS 2.0 <?xml version="1.0"?> <rss version="2.0"> <channel> <title>titel van de RSS feed</title> <link>http://link_naar_de_bron_website</link> <description>beschrijving van de website</description> <language>nl</language> <pubdate>sat, 26 Dec 2010 16:06:00 GMT</pubDate> <lastbuilddate>sat, 26 Dec 2010 16:06:00 GMT</lastBuildDate> <docs>http://blogs.law.harvard.edu/tech/rss</docs> <generator>weblog Editor 2.0</generator> <managingeditor>editor@example.com</managingeditor> <webmaster>webmaster@example.com</webmaster> <item> <title>titel van het artikel</title> <link>http://link_naar_het_volledige_artikel</link> <description>hier een beschrijving van het artikel</description> <pubdate>tue, 03 Jun 2003 09:39:21 GMT</pubDate> <guid>http://liftoff.msfc.nasa.gov/2003/06/03.html#item573</guid> </item> </channel> </rss>
MIME-type aanpassen via header();
header('content-type: application/rss+xml');
JSON {"menu": { "id": "file", "value": "File", }} "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"} ] }
header('content-type: application/json');
XML <menu id="file" value="file"> <popup> <menuitem value="new" onclick="createnewdoc()" /> <menuitem value="open" onclick="opendoc()" /> <menuitem value="close" onclick="closedoc()" /> </popup> </menu>
header('content-type: application/xml');
CSV naam, kamer, expertise Walter Giannuzzi, 01a36, techniek Bart-Jan Steerenberg, 01a36, design Charlie Mulholland, 01a36, marketing Sonja Rouwhorst, 01a36, techniek Hein Bijvoet, 01a36, nederlands Jos Kok, 01a36, marketing Justus Sturkenboom, 01a36, techniek Marie Meussen, 01a36, nederlands etc...
header('content-type: text/csv');
Tekstmanipulatie
Tekstmanipulatie
Tekstmanipulatie
Tekstmanipulatie Form-invoer bewerken lowercase over gebruikersinvoer splitten op punten ucfirst op elke zin weer achter elkaar plakken wordwrappen op 80 tekens emailen
Patroonherkenning
Regular expressions (regexp/preg)
Regular expressions
les4/introtekst/index.php 1. knip de tekst op basis van de eerste punt, vraagteken of uitroepteken. het resultaat van preg_match( ) komt terug als array 2. geef het 2 e resultaat in de array weer
les4/introtekst/index.php 1. neem de eerste 100 tekens en breek af op het einde van een woord (of zin) het resultaat van preg_match( ) komt terug als array 2. geef het eerste resultaat in de array weer
Formvalidatie datum: /^(19 20)\d\d[- \/.](0[1-9] 1[012])[- \/.](0[1-9] [12][0-9] 3[01])$/ alpha: /^([ \u00c0-\u01ffa-za-z.'\-])+$/ alphanum: /^([ \u00c0-\u01ff0-9a-za-z.'\-])+$/ postcode (int): /^[ a-za-z0-9]+$/ postcode (nl): /^[0-9]{4}\s?[a-zA-Z]{3}+$/ (checken) phone: /^((\+ 00)[1-9](-\d+ \d*))?(\(\d+\))?\d+(-\d+)*$/ email: /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
Server side validatie
Tekst naar HTML
Automatisch hyperlinken $link_rxp= ' (?<!href=")(https?://[a-za-z0-9+\-=._/*(),@\'$:;&!?%]+) i'; preg_replace($hrefpattern, '<a href="$1">$1</a>', $string); In stukjes: andere delimiter omdat slashes voorkomen in url's ( start van een patroon, komt in $0?<!href=" lookbehind, mag niet voorkomen ) ( start van een patroon, komt in $1 https?:// zoek op http, 0 of 1 keer s en :// [A-Za-z0-9+\-=._/*(),@\'$:;&!?%] + mag meerdere keren voorkomen ) i hoofdletter ongevoelig
Bestanden van servers ophalen
Links destilleren? $page = $_REQUEST["page"]; # weggeknipt: controle op validiteit van de meegestuurde URL $data = file_get_contents($page); preg_match_all(' <a\s[^>]*href="([^"]+)" i', $data, $matches); $all_links = array(); $js_links = array(); $full_links = array(); $local_links = array(); foreach ($matches[1] as $link) { } if ($all_links[$link]) { continue; # wait.. what? } $all_links[$link] = true; if (preg_match('/^javascript:/', $link)) { $js_links[] = $link; } elseif (preg_match('/^https{0,1}:/i', $link)) { $full_links[] = $link; } else { $local_links[] = $link; }
Links destilleren? $page = $_REQUEST["page"]; # weggeknipt: controle op validiteit van de meegestuurde URL $data = file_get_contents($page); preg_match_all(' <a\s[^>]*href="([^"]+)" i', $data, $matches); $all_links = array(); $js_links = array(); $full_links = array(); $local_links = array(); foreach ($matches[1] as $link) { } if ($all_links[$link]) { continue; # wait.. what? } $all_links[$link] = true; if (preg_match('/^javascript:/', $link)) { $js_links[] = $link; } elseif (preg_match('/^https{0,1}:/i', $link)) { $full_links[] = $link; } else { $local_links[] = $link; } Gevaarlijk
Bouw een scraper 1. Maak een script dat een HTML-pagina van een externe server ophaalt en alleen alle links van die opgehaalde pagina toont. 2. Filter de links uit opdracht 1 zodat alleen de linkjes getoond worden die naar externe sites verwijzen en verstuur de output als JSON.
Huiswerk Bestuderen: 9: Pages That Remember: Simple Login and Multipage Forms 10: Getting Started with MySQL