OSA III PHP:n käyttö. Oppitunti

Samankaltaiset tiedostot
Lomake kannattaa asemoida taulukkoon: table. Silloin selitteet ja kentät saadaan sarakkeisiin. Kenttien ulkoasu voidaan määritellä tyyleillä.

Taustaa. CGI-ohjelmointi

ICT1TN004. Lomakkeet. Heikki Hietala

OPPITUNTI 11 DBM-funktioiden käyttö

OPPITUNTI 20 Tilan tallentaminen istuntofunktioilla

OPPITUNTI 3 Ensimmäinen skripti

Palvelinpuolen ohjelmointi

Harjoitustyö: virtuaalikone

SSH Secure Shell & SSH File Transfer

OPPITUNTI 5 Ohjelman kulku

6. Funktiot 85. Kuinka funktioita määritellään ja kutsutaan. Kuinka funktioille viedään arvoja ja niistä palautetaan arvoja

Digitaalisen median tekniikat xhtml - jatkuu

Digitaalisen median tekniikat xhtml - jatkuu Harri Laine 1

Tietokantasovellus (4 op) - Web-sovellukset ja niiden toteutus

8. Oliot 123. Kuinka luokkia luodaan ja olioita saadaan aikaan. Kuinka luodaan ja käsitellään ominaisuuksia ja metodeja

OPPITUNTI15 Päivämäärien käsittely

GroupWise Calendar Publishing Host User

Lomakkeet HTML5. Elina Ulpovaara. Testaus: IE9 Firefox7 Opera11 Chrome

Digitaalisen median tekniikat, k2004 HY/TKTL, palvelinohjelmointi_1 21/04/2004. Harri Laine 1. Palvelinohjelmointi. Staattinen www-sivu

OPPITUNTI 21 Palvelinympäristö

Digitaalisen median tekniikat. Palvelinohjelmointi Harri Laine 1

Digitaalisen median tekniikat. Palvelinohjelmointi

Harri Laine 1. Digitaalisen median tekniikat, s2007 HY/TKTL, palvelinohjelmointi_1. Palvelinohjelmointi

OSA I Aloitetaan. Oppitunti. 1. PHP: Kotisivusta portaaliin 2. PHP:n asentaminen 3. Ensimmäinen skriptisi. 17 Johdanto

TIETOJENKÄSITTELY/PIKATAIVAL2 Tehtävä G

T Hypermediadokumentin laatiminen. Sisältö. Tavoitteet. Mitä on www-ohjelmointi? Arkkitehtuuri (yleisesti) Interaktiivisuuden keinot

13. Pintaa syvemmältä 233

7. Taulukot 105. Kuinka taulukoiden tietoa käsitellään ja lajitellaan

OPPITUNTI 19 Tilan tallentaminen evästeiden ja kyselymerkkijonojen avulla

Julkinen. Suomen Pankin ja Finanssivalvonnan suojattu sähköposti: ulkoisen käyttäjän ohje

EKP:N HANKINTAMENETTELYJEN VERKKOPALVELU OSALLISTUMINEN HANKINTAMENETTELYIHIN

OSA II Kieli. Oppitunti. 4. Rakennuslohkot 5. Ohjelman kulku 6. Funktiot 7. Taulukot 8. Oliot

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Erittäin nopea tapa saada kehitysympäristö php:lle pystyyn Voidaan asentaa muistitikulle

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

AJAX-konsepti AJAX. Asynkronisuus. Nykyisten web-ohjelmien ongelmia. Asynchronous JavaScript And XML

Julkinen. Suomen Pankin ja Finanssivalvonnan suojattu sähköposti: ulkoisen käyttäjän ohje

Written by Administrator Monday, 05 September :14 - Last Updated Thursday, 23 February :36

Ohjelmoinnin perusteet Y Python

Opas administraattori-tason käyttäjille. MANAGERIX -ohjelman esittely... 2 Kirjautuminen... 2

Contact Form 7 -lomakkeen yhdistäminen Timeline Manageriin

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

2 3 LIITE 2. Index.php 1 (10) 4 5 <?php 6 7 /*! \mainpage Artikkelihallintaohjelma 8 * 9 * \section intro_sec Introduction 10 * 11 * Tämän on

Digitaalisen median tekniikat xhtml - jatkuu

SeaMonkey pikaopas - 1

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Järjestelmäarkkitehtuuri (TK081702)

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

EK:n palkkatiedustelun asiointipalvelu ja SFTPtiedonsiirto. Ohje

SQL Buddy JAMK Labranet Wiki

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

JavaScript alkeet Esimerkkikoodeja moniste 2 ( Metropolia)

TALLENNETAAN MUISTITIKULLE JA MUISTIKORTILLE

Flash ActionScript osa 4

Luento 3. Jouni Ikonen - Jouni.Ikonen lut.fi

OPPITUNTI 24 Esimerkki (Osa 2)

Verkkojulkaiseminen Minna Väisänen. HTML5-tehtävä

Jypelin käyttöohjeet» Ruutukentän luominen

ELM GROUP 04. Teemu Laakso Henrik Talarmo

ITKP102 Ohjelmointi 1 (6 op)

811120P Diskreetit rakenteet

Johdatus Ohjelmointiin

Java-kielen perusteet

Harjoitus 3 (viikko 39)

WWW-sivut HTML-kielellä esitettyä hypertekstiaineistoa

Tukipyyntö-toiminnon ohje

Hakemistojen sisällöt säilötään linkitetyille listalle.

Ohjelmoinnin perusteet Y Python

Ryhmäharjoitus I: Google Drive. TIEY4 Tietotekniikkataidot, kevät 2017 Tehdään ryhmäharjoitustunnilla 13.3.

Ohjelmoinnin perusteet Y Python

Alkuun HTML5 peliohjelmoinnissa

Google Forms / Anna Haapalainen. Google Forms Googlen lomake-työkalu

Ohjelmoinnin jatkokurssi, kurssikoe

Tietueet. Tietueiden määrittely

3.1 Mitä tarkoittaan heredoc? Milloin sitä kannattaa käyttää? Kirjoita esimerkki sen käyttämisestä.

Ohjelmoinnin perusteet Y Python

Verkkosivut perinteisesti. Tanja Välisalo

Tuotteiden tiedot: Lisää uuden tuotteen tiedot. Muuta tai poista tuotteen tiedot. Selaa kaikkien tuotteiden tietoja.

Muistitikun liittäminen tietokoneeseen

Paavo Räisänen. WampServer palvelimen asennus ja käyttö Eclipsen kanssa, sekä ensimmäinen FTP yhteys.

Java-kielen perusteet

Hyvinvointikyselyjen toteuttaminen sähköisesti oppilaitoksissa

Ohjelmoinnin perusteet Y Python

Salasanojen turvallinen tallentaminen KeePass ohjelmalla

1 PHP-sovelluksen toiminta

Asko Ikävalko, k TP02S-D. Ohjelmointi (C-kieli) Projektityö. Työn valvoja: Olli Hämäläinen

Zeon PDF Driver Trial

Kieliversiointityökalu Java-ohjelmistoon. Ohje

Tekstinkäsittelyn jatko Error! Use the Home tab to apply Otsikko 1 to the text that you want to appear here. KSAO Liiketalous 1

Osaamispassin luominen Google Sites palveluun

Osoitin ja viittaus C++:ssa

Collector for ArcGIS. Ohje /

Pedanet oppilaan ohje Aleksanteri Kenan koulu Eija Arvola

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Katalogin luominen Coupan toimittajaportaalissa

VERKKOKÄYTTÄJÄN OPAS. Tulostuslokin tallennus verkkoon. Versio 0 FIN

Tekstieditorin käyttö ja kuvien käsittely

Kirjaudu sisään palveluun klikkaamalla Omat kartat -painiketta.

Transkriptio:

OSA III PHP:n käyttö Oppitunti 9. Lomakkeiden käsittely 10. Tiedostojen käsittely 11. DBM-funktioiden käyttö 12. MySQL-tietokantojen integrointi 13. Pintaa syvemmältä 14. Dynaamisten kuvien käsittely 15. Päivämäärien käyttö 16. Tiedon käsittely 17. Merkkijonojen käsittely 18. Säännöllisten ilmausten käyttö 19. Tilan tallentaminen evästeille ja kyselymerkkijonoilla 20. Tilan tallentaminen istuntofunktioilla 21. Palvelimen ympäristön käsittely 22. Vianhaku

9. Lomakkeiden käsittely 151 OPPITUNTI 9 Lomakkeiden käsittely Toistaiseksi kaikista kirjan esimerkeistä on puuttunut eräs tärkeä ulottuvuus. Voimme nyt määritellä muuttujia ja taulukoita, luoda ja kutsua funktioita ja työskennellä olioilla. Kaikki tuo on merkityksetöntä, jos käyttäjät eivät pääse tarjoamaan tietoa kielen ympäristön käyttöön. Tällä tunnilla tutkimme menettelytapoja, joilla siepataan tietoa käyttäjältä ja työskennellään tuolla tiedolla. World Wide Web -maailmassa HTML-lomakkeet ovat peruskeino kerätä tietoa käyttäjältä ja viedä tuo tieto palvelimelle. PHP on kehitetty nimenomaan lomaketiedon käsittelyyn. Tämän tunnin aiheita ovat seuraavat: Kuinka ympäristömuuttujia käytetään Kuinka saadaan tieto lomakekentistä Kuinka työskennellään asiakirjoilla, jotka sisältävät sekä HTML-lomakkeen että PHPkoodin, joka käsittelee sen lähettämisen Kuinka käsitellään monivalintakomponentteja Kuinka tilatietoa tallennetaan piilokenttiin Kuinka käyttäjä ohjataan uudelle sivulle Kuinka rakennetaan HTML-lomakkeita, jotka lataavat tiedostoja palvelimelle ja kuinka kirjoitetaan PHP-koodi, joka käsittelee niitä

152 9. Lomakkeiden käsittely Globaalit muuttujat ja ympäristömuuttujat Ennenkuin todella rakennat lomakkeen ja käytät sitä tiedon sieppaamiseen, sinun on tehtävä pieni kertaus ja palautettava mieleen, mitä globaali muuttuja pitää sisällään. Globaaleista muuttujista puhuttiin ensin luvussa 6, Funktiot. Globaali muuttuja on muuttuja, joka esitellään skriptin ylätasolla eli funktioiden ulkopuolella. Kaikki funktiot pääsevät käsiksi sisäiseen assosiatiiviseen taulukkoon nimeltä $GLOBALS. Se on hyödyllistä listauksessa 9.1, koska voimme päästä käsiksi jokaiseen globaaliin muuttujaan yhden silmukan avulla. Listaus 9.1 $GLOBALS-taulukon tutkiminen 1: <html> 2: <head> 3: <title>listing 9.1 Looping through the $GLOBALS array</title> 4: </head> 5: <body> 6: <?php 7: $user1 = "Bob"; 8: $user2 = "Harry"; 9: $user3 = "Mary"; 10: foreach ( $GLOBALS as $key=>$value ) 11: { 12: print "\$GLOBALS[\"$key\"] == $value<br>"; 13: } 14:?> 15: </body> 16: </html> Esittelemme kolme muuttujaa ja sitten käymme silmukassa läpi sisäisen $GLOBALS-taulukon tulostaen sekä taulukon avaimet että arvot selaimelle. Tulostuksessa voimme paikantaa määrittelemämme muuttujat, mutta saimme esille kauhean paljon muutakin niiden lisäksi. PHP määrittelee automaattisesti paikalliset muuttujat, jotka kuvaavat palvelimen ja asiakkaan ympäristöjä. Riippuen järjestelmästäsi, palvelimestasi ja kokoonpanostasi noiden muuttujien saatavuus voi vaihdella, mutta ne voivat olla todella hyödyllisiä. Taulukko 9.1 esittelee joitakin yleisiä ympäristömuuttujia. Niihin päästään käsiksi $GLOBALS-taulukon kautta tai sitten suoraan nimen perusteella.

9. Lomakkeiden käsittely 153 Taulukko 9.1 Ympäristömuuttujat Muuttuja Sisältää Esimerkki $HTTP_USER_AGENT Asiakkaan nimi ja versio Mozilla/4.6 (X11;I;Linux2.2.6-15apmac ppc) $REMOTE_ADDR Asiakkaan IP-osoite 158.152.55.35 $REQUEST_METHOD Onko kyseessä GET- vai POST POST-pyyntö $QUERY_STRING GET-pyyntöjen kohdalla lomakkeen koodattu tieto $REQUEST_URI $HTTP_REFERER Pyynnön koko osoite mukaan lukien kyselymerkkijono Sen sivun osoite, josta pyyntö tehtiin name=matt&address=un known /matt/phpbook/forms/eg9.14.html?n ame=matt http://www.test. com/a_page.html Ympäristömuuttujien lisäksi PHP laittaa muutamia muitakin globaaleja muuttujia ohjelmoijan saataville. Esimerkiksi muuttuja $GLOBALS[ PHP_SELF ] sisältää nykyisen skriptin polun. Omassa ympäristössäni muuttujassa oli arvo /matt/php-book/forms/eg9.1.php. Tuohon muuttujaan voidaan viitata suoraan nimellä $PHP_SELF. Se voi olla hyödyllistä joissakin tämän kirjan esimerkeissä. Laitamme HTML-lomakkeen usein samalle sivulle kuin PHP-koodin, joka analysoi lomakkeen sisällön. Voimme käyttää $PHP_SELF-muuttujassa olevaa merkkijonoa lomakkeen ACTION-argumentin arvona, jolloin meidän ei tarvitse kirjoittaa itse sivun nimeä ja polkua. PHP:n $GLOBALS-taulukko on myös muilla tavoin hyödyllinen. Skripti, joka sieppaa käyttäjän syöttötiedon Toistaiseksi olemme erottaneet HTML:n PHP-koodistamme. Listauksessa 9.2 muodostetaan suppea HTMLlomake. Listaus 9.2 Suppea HTML-lomake 1: <html> 2: <head> 3: <title>listing 9.2 A simple HTML form</title> 4: </head> 5: <body> 6: <form action="eg9.3.php" method="get"> 7: <input type="text" name="user"> 8: <br> 9: <textarea name="address" rows="5" cols="40"> 10: </textarea> 11: <br> 12: <input type="submit" value="hit it!"> 13: </form>

154 9. Lomakkeiden käsittely 14: </body> 15: </html> Määrittelemme lomakkeen, joka sisältää tekstikentän nimeltä user, tekstialueen nimeltä Address sekä lähetyspainikkeen (submit-napin). Tämän kirjan tarkoituksena ei ole käsitellä HTML:ää yksityiskohtaisemmin. Jos kirjan esimerkit tuntuvat vaikeilta, tutki jotain Samsin HTML-kirjaa tai online-opasta. FORM-elementin ACTION-argumentti viittaa tiedostoon eg9.3.php, joka käsittelee lomakkeen tiedot. Koska olemme laittaneet ACTION-argumenttiin pelkästään tiedoston nimen, tiedoston tulee sijaita samassa kansiossa kuin sivu, jossa lomakekoodi on. Listaus 9.3 luo koodin, joka vastaanottaa käyttäjän syöttämät tiedot. Listaus 9.3 Luetaan listauksen 9.2 lomakkeen tiedot 1: <html> 2: <head> 3: <title>listing 9.3 Reading input from the form in Listing 9.2</title> 4: </head> 5: <body> 6: <?php 7: print "Welcome <b>$user</b><p>\n\n"; 8: print "Your address is:<p>\n\n<b>$address</b>"; 9:?> 10: </body> 11: </html> Tämä on kirjan ensimmäinen skripti, jota ei kutsuta valitsemalla linkki tai kirjoittamalla osoite suoraan selaimen osoitekenttään. Nyt listauksen 9.3 koodi sijoitetaan tiedostoon nimeltä eg9.3.php. Tuota tiedostoa kutsutaan, kun käyttäjä lähettää listauksessa 9.2 määritellyn lomakkeen. Koodi sisältää kaksi muuttujaa nimeltä $user ja $address. Ei liene yllätys, että nuo muuttujat sisältävät lomakkeen tekstikentän user ja tekstialueen address sisällöt. Näin helppoa on lomakkeiden käsittely PHP4-kielellä. Kaikki käyttäjän lähettämä tieto on globaaleissa muuttujissa, joilla on samat nimet kuin lomakkeen kentillä. Monivalintaelementtien käsittely Toistaiseksi lomakkeiden elementit ovat sisältäneet vain yhden yksittäisen arvon. Kuinka sitten teemme, kun yhteen komponenttiin liittyy useampi valittu vaihtoehto? Tällaisia komponentteja ovat SELECT-elementit: käyttäjä voi valita niistä useammankin vaihtoehdon. Jos nimeämme SELECT-elementin paljaalla nimellä, esimerkiksi seuraavasti

9. Lomakkeiden käsittely 155 <select name="products" multiple> vastaanottava skripti pääsee käsiksi vain yhteen arvoon, joka vastaa kyseistä nimeä. Voimme muuttaa käyttäytymistä nimeämällä jokaisen elementin nimellä, jonka loppuun laitetaan hakasulkupari. Listaus 9.4 käyttää tuota menettelyä. Listaus 9.4 HTML-lomake, jossa on SELECT-elementti 1: <html> 2: <head> 3: <title>listing 9.4 An HTML form including a SELECT element</title> 4: </head> 5: <body> 6: <form action="eg9.5.php" method="post"> 7: <input type="text" name="user"> 8: <br> 9: <textarea name="address" rows="5" cols="40"> 10: </textarea> 11: <br> 12: <select name="products[]" multiple> 13: <option>sonic Screwdriver 14: <option>tricorder 15: <option>orac AI 16: <option>hal 2000 17: </select> 18: <br> 19: <input type="submit" value="hit it!"> 20: </form> 21: </body> 22: </html> Skripti, joka käsittelee lomaketietoa, pääsee käsiksi valittuihin vaihtoehtoihin $products-taulukon avulla. Listaus 9.5 esittelee tuota menettelyä.

156 9. Lomakkeiden käsittely Listaus 9.5 Syötetyn tiedon lukeminen listauksen 9.4 lomakkeelta 1: <html> 2: <head> 3: <title>listing 9.5 Reading input from the form in Listing 9.4</title> 4: </head> 5: <body> 6: <?php 7: print "Welcome <b>$user</b><p>\n\n"; 8: print "Your address is:<p>\n\n<b>$address</b><p>\n\n"; 9: print "Your product choices are:<p>\n\n"; 10: print "<ul>\n\n"; 11: foreach ( $products as $value ) 12: { 13: print "<li>$value<br>\n"; 14: } 15: print "</ul>"; 16:?> 17: </body> 18: </html> SELECT-elementti ei ole ainoa, joka sisältää useampia arvoja. Kun valintaruuduille annetaan sama nimi, käyttäjä voi valita useita vaihtoehtoja yksittäisen kentän avulla. Jos kentän nimessä on hakasulkupari, PHP kääntää käyttäjän antamat tiedot taulukkoon. Voimme korvata listauksen 9.4 SELECT-elementin valintaruuduilla saadaksemme aikaa täsmälleen saman toiminnon: <input type="checkbox" name="products[]" value="sonic Screwdriver"> A Sonic Screwdriver<br> <input type="checkbox" name="products[]" value="tricorder">tricorder<br> <input type="checkbox" name="products[]" value="orac AI">ORAC AI<br> <input type="checkbox" name="products[]" value="hal 2000">HAL 2000<br>

9. Lomakkeiden käsittely 157 Kaikkien lomakekenttien käsittely assosiatiivisen taulukon kautta Toistaiseksi käyttämämme tekniikat ovat toimineet aivan hyvin. Ne toimivatkin hyvin niin kauan kuin skripti tietää, minkä nimisiä kenttiä lomakkeissa on. Saatat kuitenkin haluta kirjoittaa koodia, joka mukautuu lomakkeissa tapahtuviin muutoksiin tai palvelee jopa useampaa kuin yhtä lomaketta ilman, että tarvitsisi huolehtia lomakkeiden kenttien nimistä. PHP4:n globaalit muuttujat ratkaisevat tämän ongelman. Riippuen siitä, käytetäänkö lomakkeen lähetystapana POST- vai GET-metodia, voidaan skriptissä viitata lomakkeen kenttiin muuttujan $HTTP_POST_VARS tai $HTTP_GET_VARS kautta. Ne ovat assosiatiivisia taulukoita, jotka sisältävät lähetetyt nimi/arvo-parit. Listaus 9.6 hyödyntää tätä mahdollisuutta listaamalla GET-metodilla lähetetyn lomakkeen tiedot. Listaus 9.6 Lomakkeen tietojen lukeminen $HTTP_GET_VARS-taulukon kautta 1: <html> 2: <head> 3: <title>listing 9.6 Reading input from any form using the $HTTP_GET_VARS A array</title> 4: </head> 5: <body> 6: <?php 7: foreach ( $HTTP_GET_VARS as $key=>$value ) 8: { 9: print "$key == $value<br>\n"; 10: } 11:?> 12: </body> 13: </html> Koodi luettelee kaikkien lähetettyjen kenttien nimet ja arvot. Tietenkään koodi ei vielä ole tarpeeksi älykäs osatakseen käsitellä parametreja, jotka ovat taulukon kautta esillä. Jos käyttäisimme skriptin yhteydessä listauksen 9.4 lomaketta, jossa on SELECT-elementti, saisimme seuraavan tulostuksen: user == Matt Zandstra address == London, England products == Array $products-taulukko on $HTTP_GET_VARS[products]-taulukkoalkiona, mutta emme ole vielä kirjoittaneet koodia ottamaan tätä seikkaa huomioon. Listaus 9.7 testaa kunkin $HTTP_GET_VARS-taulukon alkion tietotyypin ja hoitaa tulostuksen sen mukaan.

158 9. Lomakkeiden käsittely Listaus 9.7 Syöttötiedon lukeminen miltä tahansa lomakkeelta käyttämällä $HTTP_GET_VARS-taulukkoa 1: <html> 2: <head> 3: <title>listing 9.7 Reading input from any form using the $HTTP_GET_VARS A array</title> 4: </head> 5: <body> 6: <?php 7: foreach ( $HTTP_GET_VARS as $key=>$value ) 8: { 9: if ( gettype( $value ) == "array" ) 10: { 11: print "$key == <br>\n"; 12: foreach ( $value as $two_dim_value ) 13: print "...$two_dim_value<br>"; 14: } 15: else 16: { 17: print "$key == $value<br>\n"; 18: } 19: } 20:?> 21: </body> 22: </html> Käytämme edellä foreach-silmukkaa $HTTP_GET_VARS-taulukon tutkimiseen. Funktion gettype() avulla saamme selville, onko jokin sen arvo taulukko. Jos itse arvo on taulukko, käytämme toista foreach()- silmukkaa sen läpikäymiseen ja tulostamme arvot selaimelle.

9. Lomakkeiden käsittely 159 GET- ja POST-lähetysten erotteleminen Toimiakseen joustavasti tietoa vastaanottavan skriptin tulisi saada tietää, onko tieto taulukossa $HTTP_GET_VARS vai $HTTP_POST_VARS. Useimmissa järjestelmissä lähettämistapa saadaan selville ympäristömuuttujasta $REQUEST_METHOD, jonka tulisi sisältää joko teksti post tai teksti get. Voidaksemme olla täysin varmoja siitä, että skriptimme ovat täysin siirrettäviä, voimme hyödyntää sitä tosiseikkaa, että $HTTP_POST_VARS on olemassa vain silloin, kun lähetystapana on post. Listaus 9.8 täydentää jäsentelijäskriptiämme, jotta se toimisi aina oikein. Listaus 9.8 GET- tai POST-lähetyksen tietojen sieppaaminen 1: <html> 2: <head> 3: <title>listing 9.8 Extracting parameters from 4: either a GET or POST request</title> 5: </head> 6: <body> 7: <?php. 8: $PARAMS = ( isset( $HTTP_POST_VARS ) ) 9:? $HTTP_POST_VARS : $HTTP_GET_VARS; 10: foreach ( $PARAMS as $key=>$value ) 11: { 12: if ( gettype( $value ) == "array" ) 13: { 14: print "$key == <br>\n"; 15: foreach ( $value as $two_dim_value ) 16: print "...$two_dim_value<br>"; 17: } 18: else 19: { 20: print "$key == $value<br>\n"; 21: } 22: } 23:?> 24: </body> 25: </html>

160 9. Lomakkeiden käsittely Käytämme edellä ehto-operaattoria asettamaan muuttuja nimeltä $PARAMS. Sisäisen isset()-funktion avulla tarkistamme, onko $HTTP_POST_VARS-taulukko asetettu. Funktio palauttaa arvon true, jos parametrina oleva muuttuja on määritelty. Jos $HTTP_POST_VARS-taulukko on määritetty, $PARAMS saa sen arvon; muutoin muuttuja saa arvon $HTTP_GET_VARS. Nyt voimme käyttää $PARAMS-taulukkoa koodin loppuosassa tarvitsematta huolehtia siitä, onko lähetyksessä käytetty post- vai get-metodia. HTML- ja PHP-koodin yhdistäminen yksittäisellä sivulla Joissakin olosuhteissa saatat haluta sisällyttää lomakkeen jäsentelykoodia samalle sivulle, jossa HTMLlomake on. Sellainen yhdistelmä voi olla hyödyllinen, jos sinun on esitettävä sama lomake käyttäjälle useammin kuin kerran. Saisit tietenkin enemmän joustavuutta, jos kirjoittaisit koko sivun dynaamisesti, mutta silloin menettäisit yhden PHP:n tehokeinoista. Mitä enemmän standardia koodia voit jättää sivuillesi, sitä helpompaa sivujen kehittäjien on täydentää sivua kyselemättä sinulta lisätietoja. Sinun tulisi kuitenkin välttää PHP-koodipalasten sirottelemista useisiin eri asiakirjoihin, koska silloin niitä on vaikea lukea ja ylläpitää. Aina kun on mahdollista, sinun tulisi luoda funktioita, joita voidaan kutsua HTML-koodista ja käyttää uudelleen muissa projekteissa. Seuraavissa esimerkeissä olemme luomassa kuvitteellista sivustoa, joka opettaa perusmatematiikkaa esikoulun lapsille. Skripti ottaa numeron lomakkeen kentästä ja kertoo käyttäjälle, onko se suurempi tai pienempi kuin ennaltamääritetty kokonaisluku. Listaus 9.9 luo HTML:n. Tätä esimerkkiä varten tarvitsemme vain yksittäisen tekstikentän. Laitamme vielä mukaan hieman PHP-koodia. Listaus 9.9 HTML-lomake, joka kutsuu itseään 1: <html> 2: <head> 3: <title>listing 9.9 An HTML form that calls itself</title> 4: </head> 5: <body> 6: <form action="<?php print $PHP_SELF?>" method="post"> 7: Type your guess here: <input type="text" name="guess"> 8: </form> 9: </body> 10: </html> Lomake osaa aina käyttää kutsussa sivun nimeä, koska FORM-elementin ACTION-argumentissa on arvo $PHP_SELF. Huomaa, että emme ole laittaneet lomakkeelle lähetyspainiketta. Useimmat nykyiset selaimet lähettävät lomakkeen, jossa on yksittäinen tekstikenttä, kun käyttäjä painaa Enter-näppäintä. Ota kuitenkin huomioon, että jotkin vanhemmat selaimet eivät tee niin. Listauksen 9.9 skripti ei tuota mitään tulostetta. Listauksessa 9.10 alamme muodostaa PHP-osaa. Ensiksi on määritettävä numero, jota käyttäjä yrittää arvata. Täysin toimivassa versiossa annamme satunnaislukugeneraattorin luoda luvun puolestamme, mutta nyt pidämme asiat vielä yksinkertaisina. Seuraavaksi on määritettävä, onko lomake lähetetty. Muutoin yritämme käyttää muuttujaa, jota ei vielä ole määritetty. Voimme tarkistaa lähettämisen testaamalla, onko $guess-muuttuja määritetty. Tuo $guessmuuttuja on saatavilla globaalina muuttujana, jos skriptille on lähetetty guess -parametri. Jos se ei ole läsnä,

9. Lomakkeiden käsittely 161 voimme luottaa siihen, että käyttäjä on tullut sivulle lähettämättä lomaketta. Jos arvo on olemassa, voimme jatkaa tarkistamalla sen arvon. Listaus 9.10 PHP-skripti, jossa arvataan numeroa 1: <?php 2: $num_to_guess = 42; 3: $message = ""; 4: if (! isset( $guess ) ) 5: { 6: $message = "Welcome to the guessing machine!"; 7: } 8: elseif ( $guess > $num_to_guess ) 9: { 10: $message = "$guess is too big! Try a smaller number"; 11: } 12: elseif ( $guess < $num_to_guess ) 13: { 14: $message = "$guess is too small! Try a larger number"; 15: } 16: else // oltava yhtä suuri 17: { 18: $message = "Well done!"; 19: } 20:?> 21: <html> 22: <head> 23: <title>listing 9.10 A PHP number guessing script</title> 24: </head> 25: <body> 26: <h1> 27: <?php print $message?> 28: </h1> 29: <form action="<?php print $PHP_SELF?>" method="post">

162 9. Lomakkeiden käsittely 30: Type your guess here: <input type="text" name="guess"> 31: </form> 32: </body> 33: </html> Tämän skriptin ydin sisältää if-lauseen, joka määrittää, mikä merkkijono sijoitetaan $message-muuttujaan. Jos $guess-muuttujaa ei ole määritetty, oletamme, että käyttäjä on tullut sivullemme ensimmäistä kertaa ja sijoitamme tervetulotoivotuksen muuttujaan. Muutoin testaamme $guess-muuttujan arvon suhteessa lukuun, joka on muuttujassa $num_to_guess. Tulos laitetaan $message-muuttujaan. Jos $guess ei ole suurempi tai pienempi kuin $num_to_guess, oletamme, että ne ovat samoja ja sijoitamme onnitteluviestin muuttujaan. Nyt meidän on vain tulostettava $message-muuttujan arvo HTML-sivulle. Koodissa on toistaiseksi vain vähän muita lisäyksiä, mutta saatat nähdä, kuinka helppoa sivujen kehittäjän olisi nyt jatkaa sivun täydentämistä. Hänen ei tarvitsisi häiritä ohjelmointia millään tavoin. Piilokenttien käyttö tilan tallentamiseen Listauksen 9.10 skripti ei voi mitenkään tietää, kuinka monta arvausta käyttäjä on tehnyt. Voimme käyttää piilokenttää jäljittämään tätä tietoa. Piilokenttä käyttäytyy täsmälleen samalla tavalla kuin tekstikenttä, paitsi että käyttäjä ei näe sitä ennenkuin hän katsoo asiakirjan HTML-koodia. Listaus 9.11 lisää numeronarvauspeliin piilokentän ja vielä muutakin PHP-koodia, joka käsittelee piilokenttää. Listaus 9.11 Tilan tallentaminen piilokentän avulla 1: <?php 2: $num_to_guess = 42; 3: $message = ""; 4: $num_tries = ( isset( $num_tries ) )? ++$num_tries : 0; 5: if (! isset( $guess ) ) 6: { 7: $message = "Welcome to the guessing machine!"; 8: } 9: elseif ( $guess > $num_to_guess ) 10: { 11: $message = "$guess is too big! Try a smaller number"; 12: } 13: elseif ( $guess < $num_to_guess ) 14: { 15: $message = "$guess is too small! Try a larger number";

9. Lomakkeiden käsittely 163 16: } 17: else // oltava yhtä suuri 18: { 19: $message = "Well done!"; 20: } 21: $guess = (int) $guess; 22:?> 23: <html> 24: <head> 25: <title>listing 9.11 Saving state with a hidden field</title> 26: </head> 27: <body> 28: <h1> 29: <?php print $message?> 30: </h1> 31: Guess number: <?php print $num_tries?> 32: <form action="<?php print $PHP_SELF?>" method="post"> 33: Type your guess here: 34: <input type="text" name="guess" value="<?php print $guess?>"> 35: <input type="hidden" name="num_tries" value="<?php print $num_tries?>"> 36: </form> 37: </body> 38: </html>

164 9. Lomakkeiden käsittely Piilokentälle annetaan nimi num_tries. Sen arvo kirjoitetaan PHP:n avulla. Samalla myös guess -kenttä päivitetään, jotta käyttäjä näkisi viimeisen arvauksensa. Tämä tekniikka on hyödyllinen skripteille, jotka jäsentelevät käyttäjän syöttöä. Jos estämme lomakkeen lähettämisen jostakin syystä, voimme ainakin sallia käyttäjän muokata aiempaa kyselyämme. Kun sinun on tulostettava lausekkeen arvo selaimelle, voit tietenkin käyttää print()- tai echo()-funktioita. PHP:ssä voidaan hyödyntää myös PHP:n lyhyitä PHP-avaustageja. Jos lisäät lyhyeen avaustagiin yhtäsuuruusmerkin (=), sisällä oleva arvo tulostetaan selaimelle. Esimerkki: <? print $test;?> on sama kuin <?=$test?> PHP-pääkoodin sisällä käytetään ehto-operaattoria kasvattamaan $num_tries-muuttujaa. Jos $num_triesmuuttuja on asetettu, lisäämme siihen ykkösen ja käytämme tuota arvoa. Muutoin alustamme muuttujan arvolla 0. HTML-rungossa voimme nyt raportoida käyttäjälle siitä, kuinka monta arvausta hän on tehnyt. Älä luota täysin piilokenttiin. Et tiedä, mitä niiden arvot ovat olleet! Se ei tarkoita sitä, että et voisi käyttää niitä. Ole vain tietoinen siitä, että käyttäjät voivat katsella ja muuttaa lähdekoodia ja huiputtaa sitten skriptiäsi. Käytä piilokenttiä esteettisistä syistä, Niillä ei ole juuri mitään turvallisuusarvoa. Käyttäjän uudelleen ohjaaminen Skriptissämme on vielä yksi suuri heikkous. Lomake tulostetaan uudelleen, arvasipa käyttäjä oikein tai ei. Se, että HTML-koodiin viitataan suoraan, tekee vaikeaksi välttää koko sivun uudelleen tulostumista. Voimme kuitenkin ohjata käyttäjän onnittelusivulle! Kun palvelinskripti keskustelee asiakkaan kanssa, sen tulee ensin lähettää joitakin otsikoita, jotka tarjoavat informaatiota seuraavasta asiakirjasta. PHP hoitaa sen tavallisesti puolestasi automaattisesti, mutta voit myös lähettää omia otsikkorivejäsi käyttämällä PHP:n header()-funktiota. Ennen funktion käyttöä sinun tulee olla varma siitä, että mitään tulostusta ei ole vielä mennyt selaimelle. Kun sisältö lähetetään selaimelle ensimmäistä kertaa, PHP lähettää otsikot, jolloin omien otsikoiden lähettäminen on jo liian myöhäistä. Mikä tahansa asiakirjasta tapahtuva tulostus, pelkkä rivinvaihto tai skriptitagien ulkopuolella oleva välilyönti saa aikaan otsikoiden lähettämisen. Jos aiot käyttää header()-funktiota skriptissäsi, sinun tulee varmistaa, että ennen funktion kutsua ei ole mitään tulostusta selaimelle. Sinun tulee tarkistaa myös kaikki mahdolliset kirjastot, joita käytät skripteissäsi. Listaus 9.12 näyttää tyypilliset otsikot, jotka PHP-koodi lähettää selaimelle.

9. Lomakkeiden käsittely 165 Listaus 9.12 PHP-skriptin lähettämät tyypilliset palvelinotsikot 1: HEAD /matt/php-book/forms/eg9.1.php HTTP/1.0 2: HTTP/1.1 200 OK 3: Date: Sun, 09 Jan 2000 18:37:45 GMT 4: Server: Apache/1.3.9 (UNIX) PHP/4.0 5: Connection: close 6: Content-Type: text/html Voit nähdä otsikot, jotka lähetetään vastauksena pyyntöön käyttämällä telnetasiakasta. Kytkeydy palvelimelle porttiin 80 ja kirjoita sitten komento HEAD /path/to/file.html HTTP/1.0 ja paina Enteriä kaksi kertaa. Otsikoiden pitäisi nyt tulostua. Lähettämällä Location -otsikon PHP:n oletusotsikon sijaan voit saada selaimen ohjautumaan uudelle sivulle: header( "Location: http://www.corrosive.co.uk" ); Olettamalla, että olemme luoneet sopivan onnittelusivun nimeltä congrats.html, voimme muuttaa skriptiämme ohjaamaan käyttäjä tuolle uudelle sivulle, jos hän on arvannut numeron oikein. Koodi on listauksessa 9.13. Listaus 9.13 Header()-funktion käyttäminen omien otsikoiden lähettämiseen 1: <?php 2: $num_to_guess = 42; 3: $message = ""; 4: $num_tries = ( isset( $num_tries ) )? ++$num_tries : 0; 5: if (! isset( $guess ) ) 6: { 7: $message = "Welcome to the guessing machine!"; 8: } 9: elseif ( $guess > $num_to_guess ) 10: { 11: $message = "$num is too big! Try a smaller number"; 12: }

166 9. Lomakkeiden käsittely 13: elseif ( $guess < $num_to_guess ) 14: { 15: $message = "$num is too small! Try a larger number"; 16: } 17: else // oltava yhtä suuri 18: { 19: header( "Location: congrats.html" ); 20: exit; 21: } 22: $guess = (int) $guess; 23:?> 24: <html> 25: <head> 26: <title>listing 9.13 Using header() to send raw headers</title> 27: </head> 28: <body> 29: <h1> 30: <?php print $message?> 31: </h1> 32: Guess number: <?php print $num_tries?> 33: <form action="<?php print $PHP_SELF?>" method="post"> 34: Type your guess here: 35: <input type="text" name="guess" value="<?php print $guess?>"> 36: <input type="hidden" name="num_tries" 37: value="<?php print $num_tries?>"> 38: </form> 39: </body> 40: </html> Koodin if-rakenteen else-osa saa nyt aikaan sen, että selain lataa tiedoston congrats.html. Kaikki tulostus nykyiseltä sivulta keskeytetään exit-lauseella, joka lopettaa jäsentelyn ja tulostuksen, olipa kyseessä HTML- tai PHP-koodia.

9. Lomakkeiden käsittely 167 Tiedoston lataamiseen tarvittava lomake ja skripti Toistaiseksi olemme katsoneet vain yksinkertaisen lomakkeen syöttämistä. Netscape 2 ja Internet Explorer 4 ja niitä uudemmat selaimet tukevat tiedostojen lataamista palvelimelle. Niin tekee myös PHP4. Tässä jaksossa tutkimme niitä PHP:n piirteitä, jotka liittyvät tiedostojen siirtämiseen palvelimelle. Ensin meidän on luotava HTML-sivu. HTML-lomakkeiden, joissa on tiedostojen lataamiseen liittyviä kenttiä, täytyy sisältää ENCTYPE-argumentti: ENCTYPE="multipart/form-data" PHP vaatii myös sen, että piilokenttä on mukana koodissa ennen tiedoston lataamiseen tarkoitettua kenttää. Sitä voidaan kutsua nimellä MAX_FILE_SIZE ja siinä tulisi olla arvo, joka edustaa tiedoston maksimikokoa tavuina. Koko ei voi ylittää sitä maksimikokoa, joka on annettu php.ini-tiedoston kohdassa upload_max_file_size. Oletusarvona on 2 megatavua. Kun tiedoston maksimikoko on annettu, voit lisätä lataamiskentän sivulle. Se on pelkkä tekstikenttä, jonka tyyppinä on file. Kentälle voi antaa minkä tahansa nimen. Listaus 9.14 sisältää kaiken edellä mainitun peruskoodin. Listaus 9.14 Suppea lomake tiedoston lataamiseen 1: <html> 2: <head> 3: <title>listing 9.14 A simple file upload form</title> 4: </head> 5: <body> 6: <form enctype="multipart/form-data" action="<?print $PHP_SELF?>" method=" POST"> 7: <input type="hidden" name="max_file_size" value="51200"> 8: <input type="file" name="fupload"><br> 9: <input type="submit" value="upload!"> 10: </form> 11: </body> 12: </html> Huomaa, että nytkin lomake kutsuu sivua, jolla lomake on. Tämä johtuu siitä, että aiomme lisätä hieman PHP-koodia, joka käsittelee ladattavaa tiedostoa. Rajoitamme tiedoston koon 50 kilotavuun ja annamme lataamiskentälle nimen fupload. Kuten saatat odottaa, tuosta nimestä tulee pian tärkeä. Kun tiedosto ladataan onnistuneesti, sille annetaan uniikki nimi ja se tallennetaan tilapäiskansioon (UNIXjärjestelmissä kansio on /tmp). Tiedoston koko polku on saatavilla globaalissa muuttujassa, jolla on sama nimi kuin lomakekentällä (nyt nimenä on siis $fupload). PHP tallentaa lisäinformaatiota tiedostosta useaan globaaliin muuttujaan. Niissä on muuttujan nimi (joka johdetaan lomakekentän nimestä), jota seuraa alaviiva ja sitten tunnisteet name, size ja type. Taulukko 9.2 näyttää näiden muuttujien merkityksen.

168 9. Lomakkeiden käsittely Taulukko 9.2 Globaalit muuttujat tiedoston lataamisessa Muuttujan nimi Sisältää Esimerkki $fupload Polku tilapäismuuttujaan /tmp/php5pq3fu $fupload_name Ladattavan tiedoston nimi test.gif $fupload_size Ladattavan tiedoston koko tavuina 6835 $fupload_type Ladattavan tiedoston MIME-tyyppi image/gif PHP4 sisältää uuden sisäisen muuttujan, jossa on tietoa ladattavasta tiedostosta taulukkomuodossa. Jos lomakkeen kautta ladataan yksi tai useampi tiedosto, $HTTP_POST_FILES-taulukon indeksoinnissa käytetään aina kunkin ladattavan tiedoston nimeä. Näitä avaimia vastaava arvo on aina oma assosiatiivinen taulukkonsa. Nuo kentät kuvataan taulukossa 9.3. Taulukko9.3 Tiedostojen lataamiseen liittyvät globaalit muuttujat Elementti Sisältää Esimerkki $HTTP_POST_FILES[fupload] Ladattavan tiedoston nimi test.gif [name] $HTTP_POST_FILES[fupload] Ladattavan tiedoston koko 6835 [size] $HTTP_POST_FILES[fupload] [type] Ladattavan tiedoston MIME-tyyppi image/gif Tämän tiedon avulla voimme nyt kirjoittaa pikavauhtia skriptin, joka esittää tietoa ladattavista tiedostoista (katso listausta 9.15). Jos ladattava tiedosto on GIF-muodossa, skripti yrittää jopa esittää sen. Listaus 9.15 Tiedoston lataava skripti 1: <html> 2: <head> 3: <title>listing 9.15 A file upload script</title> 4: </head> 5: <?php 6: $file_dir = "/home/matt/htdocs/uploads"; 7: $file_url = "http://www.corrosive.co.uk/matt/uploads"; 8: if ( isset( $fupload ) ) 9: { 10: print "path: $fupload<br>\n"; 11: print "name: $fupload_name<br>\n"; 12: print "size: $fupload_size bytes<br>\n"; 13: print "type: $fupload_type<p>\n\n"; 14: if ( $fupload_type == "image/gif" )

9. Lomakkeiden käsittely 169 15: { 16: copy ( $fupload, "$file_dir/$fupload_name") or die ("Couldn't copy"); 17: 18: print "<img src=\"$file_url/$fupload_name\"><p>\n\n"; 19: } 20: } 21:?> 22: <body> 23: <form enctype="multipart/form-data" action="<?php print $PHP_SELF?>" method="post"> 24: <input type="hidden" name="max_file_size" value="51200"> 25: <input type="file" name="fupload"><br> 26: <input type="submit" value="send file!"> 27: </form> 28: </body> 29: </html> Listauksessa 9.15 tarkistamme ensin, onko $fupload-muuttuja olemassa. Jos se on olemassa, oletamme, että tiedostokin on olemassa (ainakin tämän esimerkin tarpeita varten). Älä koskaan oleta, että skripteillesi lähetetty tieto on peräisin tietystä lähteestä, tai että pyyntö sisältää sellaisen tietotyypin ja arvoalueen, jotka skriptimme hyväksyy. Listauksessa 9.15 oletimme, että tietty muuttuja johdetaan tiedostokentän mukaan. Itse asiassa mikään ei voi estää pahansuopaista käyttäjää luomasta omaa lomakettaan, joka lähettää tietoa skriptillemme. Hän voisi helposti lähettää skriptille parametrin, jolla on sama nimi kuin lataamiskentällä, mutta sisältönä pelkkä teksti. Tämä voi kuulostaa vainoharhaiselta ja niin sen tuleekin kuulostaa. Palvelinpuolen ohjelmoinnissa on parasta olla luottamatta käyttäjiin: tieto voi tulla skriptillemme mistä tahansa ulkoisesta lähteestä, vaikka lomake näyttäisikin olevan joissakin tapauksissa sama kuin luomamme lomake. Jos tiedosto on ladattu, on ladatun tiedoston polku palvelimella muuttujassa $fupload ja voimme tulostaa sen selaimelle. Voimme tulostaa samalla tiedoston nimen, joka on muuttujassa $fupload_name, tiedoston koon muuttujasta $fupload_size sekä tiedoston MIME-tyypin, joka on muuttujassa $fupload_type.

170 9. Lomakkeiden käsittely Sitten testaamme $fupload_type-muuttujassa olevan arvon. Jos se on image/gif, oletamme, että kyseessä on GIF-kuva. Itse asiassa olisi hyvä testata se ottamatta huomioon isoja ja pieniä kirjaimia. Asiaa selvitetään luvussa 17, Merkkijonojen käsittely. Olettamuksemme ei nyt ota myöskään huomioon sitä mahdollisuutta, että myös jokin muu tiedosto olisi nimetty.gif-tunnusta käyttäen. Muista kuitenkin sellainen mahdollisuus todellisissa palveluskripteissäsi. Jos kyseessä on GIF-kuva, käytämme copy()-funktiota kopioimaan ladattavan tiedoston oletuspaikastaan kansioon, joka on palvelimella. Nyt copy()-funktiomme ottaa kaksi merkkijonoa: alkuperäisen ja uuden polun tiedostoon. Se palauttaa arvon true, jos kopiointi onnistuu. Alkuperäinen polku tallennetaan $fuploadmuuttujaan. Olemme luoneet muuttujan $file_dir, joka sisältää täyden polun kansioon, jota haluamme käyttää kuvien tallentamiseen. Tuo arvo yhdessä $fupload-muuttujaan tallennetun tiedostonimen kanssa muodostaa toisen argumentin, joka viedään copy()-funktiolle. Funktion kutsun tuloksena ladattu tiedosto kopioidaan haluamaamme kansioon alkuperäisellä nimellään. Huomaa, että UNIX-järjestelmissä palvelinskriptit ajetaan erikoiskäyttäjän tunnuksella, usein kyseessä on nobody. Ennen kuin kopioit tiedoston kansioon, sinun tulee varmistaa, että prosessisi sallitaan tekevän niin. Käytämme nyt oroperaattoria ja die()-funktiota keskeyttämään skripti, jos kopiointi epäonnistuu. Käsittelemme tätä tekniikkaa yksityiskohtaisemmin luvussa 10, Tiedostojen käsittely. Kun olemme kopioineet tiedoston, meidän ei tarvitse tuhota alkuperäistä tiedostoa. PHP hoitaa asian puolestamme. Kun olemme luoneet $file_dir-muuttujan tallentamaan kohdekansiomme tiedostopolun, luomme myös muuttujan nimeltä $file_url tallentamaan saman kansion URL:n. Esitämme skriptin välissä kuvan HTML-koodilla. Yhteenveto Jos olet pysynyt kärryillä, olet saanut kokea, että yhä jännittävämpiä asioita on tulossa. Nyt sinulla on työkaluja, joilla voit luoda todella hienoja ja vuorovaikutteisia ympäristöjä. Muutamia seikkoja kuitenkin vielä puuttuu. Nyt, kun osaat siepata tietoja käyttäjältä, olisi mukavaa tehdä jotain noilla tiedoilla. Kirjoittaa ne esimerkiksi tiedostoon. Se onkin seuraavan tunnin aiheena. Tällä tunnilla opit työskentelemään assosiatiivisella $GLOBALS-taulukolla ja käsittelemään ympäristömuuttujia, lomaketietoja sekä lataamaan tiedostoja globaalien muuttujien avulla. Opit myös lähettämään omia otsikkotietojasi asiakkaalle, jotta hänet ohjattaisiin uuteen osoitteeseen. Opit myös sieppaamaan tietoa lomakelähetyksistä ja viemään tietoa skriptikutsulta toiselle piilokenttien avulla. K&V K Voinko luoda taulukoita muidenkin elementtien kuin luetteloiden ja valintaruutujen arvoille? V Kyllä, itse asiassa jokainen elementin nimi, joka päättyy hakasulkupariin, viittaa taulukkoon. Voit hyödyntää tuota seikkaa esimerkiksi ryhmittämällä useista kentistä lähetetyt, erityyppiset arvot taulukkoon. K Luvussa käytetty header()-funktio tuntuu tehokkaalta. Tutkimmeko HTTP-otsikoita vielä tarkemmin jossakin tulevassa luvussa? V Käsittelemme Hypertext Transfer Protocol (HTTP) -ympäristöä tarkemmin luvussa 13, Pintaa syvemmältä.

9. Lomakkeiden käsittely 171 K Lomakkeen elementtien automaattinen muuntaminen muuttujiksi tuntuu hieman riskialttiilta toimenpiteeltä. Voinko estää sen tapahtumisen? V Kyllä, voit varmistaa, että lähetetyn lomakkeen elementtien nimiä ei muunneta globaaleiksi muuttujiksi asettamalla php.ini-tiedoston gpc_globals-asetusarvoksi off. Työpaja Työpaja tarjoaa pikakysymyksiä, joiden avulla voit kerrata läpikäytyä materiaalia. Yritä ymmärtää vastaukset ennen kuin jatkat seuraavaan lukuun. Vastaukset annetaan liitteessä A. Kysymyksiä 1. Mitä ympäristömuuttujaa voisit käyttää määrittääksesi käyttäjän IP-osoitteen? 2. Mitä ympäristömuuttujaa voisit käyttää saadaksesi selville selaimen, joka kutsui skriptiäsi? 3. Kuinka sinun tulisi nimetä lomakekenttäsi päästäksesi käsiksi lähetettyihin tietoihin $form_array-nimisen taulukon avulla? 4. Mikä sisäinen taulukko sisältää kaikki GET-tavalla lähetetyn lomakkeen tiedot? 5. Mikä sisäinen taulukko sisältää kaikki POST-tavalla lähetetyn lomakkeen tiedot? 6. Mitä funktiota käyttäisit ohjataksesi selaimen uudelle sivulle? Minkä merkkijonon veisit sille? 7. Kuinka rajoittaisit sen tiedoston koon, jonka käyttäjä voisi lähettää lomakkeen kautta? 8. Kuinka voisit asettaa kokorajoituksen kaikilta lomakkeilta ja kaikista skripteistä ladattaville tiedostoille? Toiminta 1. Luo laskinskripti, joka sallii käyttäjän lähettää kaksi numeroa ja valita haluamansa laskutoimituksen (yhteenlasku, vähennyslasku, jakolasku, kertolasku). 2. Käytä piilokenttiä skriptissä, jonka luot kohdassa 1 tallentamaan ja esittämään käyttäjän tekemien laskutoimitusten määrä (eli lomakkeen lähettämisten määrä).

172 9. Lomakkeiden käsittely