Paul Tötterman paul.totterman@iki.fi 5. helmikuuta 2008
LAMP SQL
LAMP LAMP L = Linux tai *BSD, Solaris... A = Apache M = MySQL tai... P =, Perl, Python, Ruby... Flickr, Yahoo, Facebook...
: Hypertext Preprocessor Yleiskäyttöinen skriptikieli Avointa lähdekoodia (Open Source)
Sisältö Alkuperäinen kehittäjä Rasmus Lerdorf 1994: Personal Home Page Tools - v1.0 1995: Personal Home Page Tools / Form Interpreter - /FI tai v2.0 Israelilaiset Zeev Suraski and Andi Gutmans jatkoivat 1997: /FI 2 (nimi vaihtui - : Hypertext Preprocessor ) 1998: 3 - Ensimmäinen moderni 2000: 4 (Zend Engine 1.0) 2004: 5 (Zend Engine II) Tuorein versio 5.2.5 (marraskuu 2007)
Sisältö Esikäsittelijä - Preprocessor -lähdekoodi kirjoitetaan HTML:n sekaan.php-tiedoston sisältö: <p>hello <?php echo World!?></p> Selaimelle lähtevä data: <p>h e l l o World!</p> mod php
Sisältö Päiväys ja aika <?php echo d a t e ( r );? > Mon, 28 Jan 2008 14:36:50 +0200 Käyttäjän tietoja <?php echo $ SERVER [ HTTP USER AGENT ]. <br/>. $ SERVER [ REMOTE ADDR ]?> Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en; rv:1.8.1.9) Gecko/20071025 Camino/1.5.3 (MultiLang) 130.233.47.34
Lomake Sisältö <form method= post action= poorhandler. php > <p>nimi : <input name= name type= text s i z e= 40 /> <p>osasto : <s e l e c t name= dep > <o p t i o n v a l u e= t i e t o t e k n i i k k a >T i e t o t e k n i i k k a</ o p t i o n> <o p t i o n v a l u e= kemia >Kemia</ o p t i o n> <o p t i o n v a l u e= puu >Puu</ o p t i o n> <o p t i o n v a l u e= muu >Muu</ o p t i o n> </ s e l e c t> <input type= submit value= OK /> </p> </ form> Nimi: Osasto: Tietotekniikka OK
Lomakkeen käsittely Sisältö <?php $dep = $ POST [ dep ] ; $name = $ POST [ name ] ; echo Nimi :. $name. <br/>. Osasto :. $dep ;?> Nimi: Paul Tötterman Osasto: Tietotekniikka
Parempi lomakke Sisältö <form method= p o s t a c t i o n= b e t t e r h a n d l e r. php > <p>nimi : <input name= name type= text s i z e= 40 /> <p>osasto : <s e l e c t name= dep > <o p t i o n v a l u e= t >T i e t o t e k n i i k k a</ o p t i o n> <o p t i o n v a l u e= k >Kemia</ o p t i o n> <o p t i o n v a l u e= p >Puu</ o p t i o n> <o p t i o n v a l u e= m >Muu</ o p t i o n> </ s e l e c t> <input type= submit value= OK /> </p> </ form> Nimi: Osasto: Tietotekniikka OK
Parempi lomakkeen käsittely <?php $name = ( i s s e t ( $ POST [ name ] ) && ( t r i m ( $ POST [ name ]!= ) ) )? h t m l e n t i t i e s ( $ POST [ name ] ) : TUNTEMATON ; $dep = ( i s s e t ( $ POST [ dep ] ) && ( t r i m ( $ POST [ dep ]!= ) ) )? $ POST [ dep ] : m ; $deps = a r r a y ( t => T i e t o t e k n i i k k a, k => Kemia, p => Puu, m => Muu ) ; i f (! i s s e t ( $deps [ $dep ] ) ) { $dep = m ; } echo Nimi :. $name. <br/>. Osasto :. $deps [ $dep ] ;?>
Form method: POST vai GET <form method= p o s t a c t i o n= h a n d l e r. php > <form method= g e t a c t i o n= h a n d l e r. php > http://host/handler.php $ POST [ f o o ] http://host/handler.php?foo=bar&bah=baz $ GET [ f o o ] Pidemmälle datalle, lomakkeille, muutoksille Käyttäjä ei näe esim. hidden-fieldejä Lyhyemmälle datalle, kirjanmerkit, ei muutoksia Helpompi debugata
Sessiot Sisältö Jokainen sivulataus erillinen, sessio säilöö datan latausten välillä // J o k a i s e n s i v u n a l u s s a o l t a v a s e s s i o n s t a r t ( ) ; // M u u t t u j i e n varaaminen s e s s i o n r e g i s t e r ( name ) ; // M u u t t u j i e n t e s t a a m i n e n s e s s i o n i s r e g i s t e r e d ( name ) ; // M u u t t u j i e n a s e t t a m i n e n $ SESSION [ name ] = Teemu T e e k k a r i ; // M u u t t u j i e n p o i s t a m i n e n s e s s i o n u n r e g i s t e r ( name ) ; // S e s s i o n tuhoaminen s e s s i o n d e s t r o y ( ) ; Sessiot ovat rajoitettuja kooltaan ja heikkoja turvaltaan
Funktiot ja moduulit Sisältö Koodia kannattaa pilkkoa Usein kutsuttu koodi funktioihin Funktiot moduuleihin/kirjastoihin/includeihin MVC - Model, View, Controller Model - tietomalli Controller - logiikka View - näkymä, vain vähän :tä HTML:n sekaan
Model-View esimerkki Sisältö model.inc: <?php f u n c t i o n g e t c o u r s e s ( $dep ) { $data = a r r a y ( t => a r r a y ( T 111.4360, T 76.1143 ), s => a r r a y ( S 88.1110, S 87.3190 ) ) ; r e t u r n $data [ $dep ] ; }?> view.php: <?php r e q u i r e o n c e ( model. i n c ) ; $ c o u r s e s = g e t c o u r s e s ( t ) ;?> <ul> <?php f o r e a c h ( $ c o u r s e s as $ c o u r s e ) {?> <l i ><?php echo $course?></ l i > <?php }?> </ul>
PEAR Sisältö Extension and Application Repository Valmista koodia jaettuna luokkiin: Tietokantarajapinta Sähköposti Krypto jne. Koodausstandardi ja pakettien jakelujärjestelmä Ei kannata keksiä pyörää uudelleen Frameworkit Symfony, Cake...
Hyödyt ja haitat Sisältö Laajalti tuettu Helppo oppia Paljon dokumentaatiota Tutorial http://php.net/trim Paljon valmista koodia Paljon työvoimaa Monesti vain 4.x Vaikea hallita Työvoiman, dokumentaation ja koodin laatu Tietoturvahistoria Unicode-tuki
SQL Structured Query Language IBM:n 1970-luvulla kehittämä relaatiotietokantojen deklaratiivinen kyselykieli ANSI ja ISO -standardi Valmistajilla kuitenkin omat laajennuksensa Käytetyin tietokantastandardi T-76.1143 Tiedonhallintajärjestelmät
SQL Ingres - UC Berkeley 1970 ja -80 -luvuilla Post-Ingres 1985 POSTGRES 1988-93 Postgres95: Andrew Yu ja Jolly Chen lisäsivät SQL -tulkin 1997-8.3 julkaistu 4. helmikuuta 2008
SQL Hyvin standardinmukainen Open Sourcea, BSD Laadukas dokumentaatio ACID - Atomicity, Consistency, Isolation, Durability MVCC - Multi-Version Concurrency Control Funktiot (useilla kielillä), monipuoliset indeksit, triggerit, tietotyypit, periyttäminen... pgadmin
SQL Taulujen luonti CREATE TABLE o r g a n i z e r s ( i d SERIAL PRIMARY KEY, name TEXT NOT NULL, phone TEXT NOT NULL ) ; CREATE TABLE c o u r s e s ( i d SERIAL PRIMARY KEY, code TEXT NOT NULL UNIQUE, name TEXT NOT NULL, c r e d i t s INTEGER NOT NULL CHECK ( c r e d i t s > 0 ), o r g a n i z e r INTEGER REFERENCES o r g a n i z e r s ( i d ) ) ;
SQL Tiedon lisäys INSERT INTO o r g a n i z e r s ( name, phone ) VALUES ( Pia Ojanen, 555 123456 ) ; INSERT INTO o r g a n i z e r s ( name, phone ) VALUES ( P e t r i Vuorimaa, 555 654321 ) ; INSERT INTO o r g a n i z e r s ( name, phone ) VALUES ( Timo K i r a v u o, 555 123123 ) ; INSERT INTO c o u r s e s ( code, name, c r e d i t s, o r g a n i z e r ) VALUES ( T 111.4360, WWW p a l v e l u n s u u n n i t t e l u, 4, 1 ) ; INSERT INTO c o u r s e s ( code, name, c r e d i t s, o r g a n i z e r ) VALUES ( T 111.2350, M u l t i m e d i a t e k n i i k k a, 4, 2 ) ; INSERT INTO c o u r s e s ( code, name, c r e d i t s, o r g a n i z e r ) VALUES ( T 110.4200, T i e t o t u r v a l l i s u u s t e k n i i k k a, 3, 3 ) ; INSERT INTO c o u r s e s ( code, name, c r e d i t s, o r g a n i z e r ) VALUES ( T 110.5100, Johdatus t i e t o l i i k e n t e e s e e n, 5, 3 ) ;
SQL Haku - SELECT SELECT FROM o r g a n i z e r s ORDER BY i d ; id name phone 1 Pia Ojanen 555-123456 2 Petri Vuorimaa 555-654321 3 Timo Kiravuo 555-123123 SELECT FROM courses ORDER BY id ; id code name credits organizer 1 T-111.4360 WWW-palvelun suunnittelu 4 1 2 T-111.2350 Multimediatekniikka 4 2 3 T-110.4200 Tietoturvallisuustekniikka 3 3 4 T-110.5100 Johdatus tietoliikenteeseen 5 3
SQL Liittäminen - JOIN SELECT c. code, c. name, o. name, o. phone FROM c o u r s e s AS c, o r g a n i z e r s AS o WHERE c. o r g a n i z e r=o. i d ORDER BY c. code ; c.code c.name o.name o.phone T-110.4200 Tietoturvallisuustekniikka Timo Kiravuo 555-123123 T-110.5100 Johdatus tietoliikenteeseen Timo Kiravuo 555-123123 T-111.2350 Multimediatekniikka Petri Vuorimaa 555-654321 T-111.4360 WWW-palvelun suunnittelu Pia Ojanen 555-123456 SELECT code, phone FROM c o u r s e s JOIN o r g a n i z e r s ON c o u r s e s. o r g a n i z e r=o r g a n i z e r s. i d ORDER BY code ; code phone T-110.4200 555-123123 T-110.5100 555-123123 T-111.2350 555-654321 T-111.4360 555-123456
SQL Lisää kyselyjä SELECT SUM( c r e d i t s ) FROM c o u r s e s WHERE o r g a n i z e r IN (SELECT i d FROM o r g a n i z e r s WHERE name ILIKE %timo% ) ; 8 UPDATE o r g a n i z e r s SET phone= 555 555555 WHERE i d =2; DELETE FROM c o u r s e s WHERE o r g a n i z e r =3 LIMIT 1 ;
SQL pg * -funktiot Vaikea vaihtaa tietokantaa Vanha API MDB2 Tietokantariippumaton Oliopohjainen API
SQL Hakuesimerkki <?php r e q u i r e o n c e MDB2. php ; $mdb2 =& MDB2 : : c o n n e c t ( p g s q l : / / u s e r : passwd@dbhost /dbname ) ; i f (PEAR : : i s E r r o r ( $mdb2 ) ) { d i e ( $mdb2 >getmessage ( ) ) ; } $res =& $mdb2 >query ( SELECT code, name FROM courses ; ) ; i f (PEAR : : i s E r r o r ( $ r e s ) ) { d i e ( $ r e s >getmessage ( ) ) ; }?> <ul> <?php while ( $row = $res >fetchrow (MDB2 FETCHMODE ASSOC) ) {?> <l i ><a h r e f= /<?php echo $row [ code ]?>/ ><?php echo $row [ name ]?></a></l i > <?php }?> </ul> <?php $mdb2 >disconnect ( ) ;?>
SQL Muokkausesimerkki <form method= post action= dbhandler. php > <p>nimi : <input name= name type= text /></p> <p>puhelinnumero : <input name= phone type= text /></p> <p><input type= submit value= OK /></p> </ form> <?php r e q u i r e o n c e c o n n e c t. i n c ; i f (! ( ( i s s e t ( $ POST [ name ] ) && ( t r i m ( $ POST [ name ] )!= ) ) && ( i s s e t ( $ POST [ phone ] ) && ( t r i m ( $ POST [ phone ] )!= ) ) ) ) { d i e ( I n v a l i d i n p u t ) ; } $ s t h = $mdb2 >p r e p a r e ( INSERT INTO o r g a n i z e r s ( name, phone ) VALUES ( : name, : phone ), a r r a y ( t e x t, t e x t ), MDB2 PREPARE MANIP ) ; $sth >e x e c u t e ( a r r a y ( name => $ POST [ name ], phone => $ POST [ phone ] ) ) ; $mdb2 >disconnect ( ) ;?>
SQL Miksei näin? Why not like this? $mdb2 >e x e c ( INSERT INTO o r g a n i z e r s ( name, phone ) VALUES (. $ POST [ name ].,. $ POST [ phone ]. ) ; ; Mitä jos käyttäjältä tuleva data on:, ); DELETE FROM organizers; -- SQL-kysely kokonaisuudessaan: INSERT INTO o r g a n i z e r s ( name, phone ) VALUES (, ) ; DELETE FROM o r g a n i z e r s ;, ) ;