Lomakkeet ja HTTP - Luento 5
- Luentotaltiointi
- Eclipse-ohjeita
- Miten asennan PHP-kehitysympäristön?
- Lomakkeen toiminta yleisesti
- HTTP (HyperText Transfer Protocol)
- Lomakkeen käsittely PHP:lla
- Esimerkki
Luennolla käydään läpi HTTP-protokollan perusteita ja selvitellään miten WWW-lomakkeita voidaan käsitellä PHP:lla. Lisäksi alussa käydään nopeasti läpi viime luennolla käymättä jääneitä Eclipse-ohjeita.
Luentotaltiointi
- sovellukset05.mp3 16M
- sovellukset05.wmv 60M
- sovellukset05.avi 209M
Eclipse-ohjeita
- Syntaksivirheiden etsintä Problems-välilehdellä (dokumentti pitää ensin tallentaa, toimii PHP-, XHTML- ja CSS-koodeissa)
- Koodin täydennös (Ctrl + Välilyönti, toimii PHP-, XHTML- ja CSS-koodeissa)
- Breakpointin asettaminen (oikea hiiren näppäin -> Toggle Breakpoints)
- Debuggaus (oikea hiiren näppäin -> Debug As -> PHP Script):
- F6-näppäimellä pääsee koodissa eteenpäin rivin kerrallaan.
- Debug Output -välilehti näyttää, mitä XHTML-koodia syntyy.
- Browser Output -välilehti näyttää, miltä syntynyt XHTML-sivu näyttää todellisuudessa.
- Variables-välilehti näyttää muuttujien reaaliaikaiset arvot.
- Takaisin "päänäyttöön" pääsee oikean yläkulman väkäsen takaa löytyvällä PHP-painikkeella.
- Sivun "ajaminen" (oikea hiiren näppäin -> Run As -> PHP Web Page)
Lisää vinkkejä Eclipsen aloitusohjeessa.
Miten asennan PHP-kehitysympäristön?
- PHP itsessään vaatii
- PHP-tulkin, joka prosessoi PHP-kielellä kirjoitetut komennot ja
- WWW-palvelimen, johon on integroitu PHP-tulkki (=Apache).
- Eclipse PDT -kehitysympäristö:
- Jos sinulla ei ole vielä Eclipseä => ota all-in-one. Uusin all-in-one-versio on tällä hetkellä:
pdt-1.0.2.R20080103_debugger-5.2.12.v20071210-all-in-one-*.zip
- Jos sinulla on Eclipse => ota PDT-laajennus ja Zend Debugger.
- Jos sinulla ei ole vielä Eclipseä => ota all-in-one. Uusin all-in-one-versio on tällä hetkellä:
- Eclipse PDT:n käyttöönottoohjeet
- Sivut on kotikoneelta siirrettävä WWW-palvelimelle users.jyu.fi SSH-ohjelmalla, että niitä voidaan katsoa selaimella, kts. julkaisuohjeet.
- Kotikoneeseen voi asentaa WWW-palvelimen, esim. XAMPP-paketin.
- Yliopistoverkossa tämä ei ole sallittua.
- Osaamattomissa käsissä iso tietoturvariski!
Lomakkeen toiminta yleisesti
- Selainohjelma pyytää palvelimelta lomakesivun HTTP-protokollan mukaisilla otsikkotiedoilla.
- Palvelin vastaa selaimelle HTTP-protokollan mukaisilla otsikkotiedoilla, jonka jälkeen tarjoaa WWW-sivun datan (=XHTML:ää).
- Käyttäjä täyttää ja hyväksyy lomakkeen. Selain lähettää lomakkeen tiedot WWW-palvelimella suoritettavalle ohjelmalle.
- Lomakkeella oleva data käsitellään ohjelman tekijän haluamalla tavalla.
- Ohjelma palauttaa käyttäjälle virheilmoituksen tai ilmoituksen onnistumisesta, esim. lomakkeen korjauspyynnöillä tai tulossivun.
Lomakkeen käsittely
- Lomaketiedot tulevat GET- tai POST-metodilla.
- GET = lomaketiedot lisätään osoitteen loppuun.
- POST = tiedot lähetettään HTTP-pyynnön runko-osassa.
- Käytä GET-metodia tilaa muuttamattomissa pyynnössä, joista voidaan tehdä kirjanmerkki, kuten esim. haut. Lisäykset, poistot, päivitykset ja paljon dataa lähettävät lomakkeet POST-metodilla.
- Ohjelma käsitellään yleensä jonkinlaisella tulkilla.
- Ohjelma saa tarvittavat lomaketiedot ja palvelintiedot ohjelmointikielen ympäristömuuttujista.
- Tulkki saa nämä tiedot palvelinohjelmalta. Palvelinohjelman ja skriptikielten välinen rajapinta on määritelty CGI-spesifikaatiossa.
- Skriptitulkki on usein integroitu palvelinohjelmistoon.
- Huomaa, että HTTP on oletuksena tilaton. Emme tiedä edellisistä pyynnöistä tai lomakkeiden käsittelyistä mitään.
HTTP (HyperText Transfer Protocol)
HTTP on protokolla, jonka avulla selain ja WWW-palvelin keskustelevat.
Firefox-selaimen ja WWW-palvelimen välistä HTTP-liikennettä on helppo seurata Tamper Data -laajennuksella.
Selain lähettää WWW-palvelimelle pyynnön:
GET /sovellukset/testi.html HTTP/1.1 Connection: keep-alive Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Accept-Encoding: gzip,deflate Accept-Language: en-us,en;q=0.5 Host: appro.mit.jyu.fi Referer: http://appro.mit.jyu.fi/ User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4) Gecko/20030624 Keep-Alive: 300
GET /sovellukset/testi.html HTTP/1.0 | Pyydetään informaatiota (GET), jonka osoite palvelimella on /sovellukset/testi.html käyttäen HTTP/1.1-protokollaa. |
Connection: keep-alive | Käsketään pitää yhteys päällä. |
Accept: text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, video/x-mng, image/png, image/jpeg, image/gif;q=0.2, */*;q=0.1 | Luetellaan selaimen ymmärtämät mediatyypit. Kerrotaan myös mitä mediatyyppejä suositaan q-arvojen avulla. |
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 | Luetellaan kelpaavat merkistöt. |
Accept-Encoding: gzip,deflate | Luetellaan tuetut koodaustavat (pakkaus). |
Accept-Language: en-us,en;q=0.5 | Halutut kielet |
Host: appro.mit.jyu.fi | Palvelimen nimi |
Referer: http://appro.mit.jyu.fi/ | Osoite, josta ollaan tulossa (sivu, jolla olevaa linkkiä on klikattu). |
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4) Gecko/20030624 | Selaimen tiedot |
Keep-Alive: 300 | Kertoo kuinka monta sekuntia yhteyttä pidetään yllä. Vain HTTP/1.0-protokollassa,
mutta käytetään yhteensopivuussyistä. Oikeastaan muoto pitäisi olla Keep-Alive: parametri=arvo . |
Palvelin vastaa:
HTTP/1.1 200 OK Connection: close Date: Tue, 06 Apr 2004 10:53:18 GMT Accept-Ranges: bytes ETag: "2da29-2147-4044819d" Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) PHP/4.1.2 mod_perl/1.26 Vary: Accept Content-Length: 414 Content-Type: application/xhtml+xml; charset=iso-8859-1 Last-Modified: Tue, 02 Mar 2004 12:44:13 GMT <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi" > <head> <title>Testisivu</title> <link href="testi.css" rel="StyleSheet" type="text/css" /> </head> <body> <h1>Testiotsikko</h1> <p>Testitekstiä</p> </body> </html>
HTTP/1.1 200 OK | Statuskoodi - kaikki kunnossa. |
Connection: close | Palvelin sulkee yhteyden. Normaalisti yhteys on pysyvä (persistent), jotta selain voi tehdä useita pyyntöä (kuvat, css, javascript jne.). |
Date: Tue, 06 Apr 2004 10:53:18 GMT | Päivä ja aika, koska vastaus on lähetetty. |
Accept-Ranges: bytes | Sallitaan tavuina määritellyt pyynnöt joissa halutaan vain osa dokumentista. |
ETag: "2da29-2147-4044819d" | Tunniste. Tunniste muuttuu dokumenttia muutettaessa. |
Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) AxKit/1.62 mod_python/2.7.8 Python/1.5.2 mod_ssl/2.8.12 OpenSSL/0.9.6b DAV/1.0.3 PHP/4.1.2 mod_perl/1.26 mod_throttle/3.1.2 | WWW-palvelimen tiedot |
Vary: Accept-Encoding | Vaihteleeko pyydetty resurssi jonkun ehdon mukaan. Tärkeä tieto esim. välimuisteille. Accept-Encoding: esim. erilainen pakkaus. Accept-Language: tarjolla useita kieliversioita. User-Agent: sivun sisältö riippuu selaimesta. |
Content-Length: 414 | Sisällön koko |
Content-Type: application/xhtml+xml; charset=iso-8859-1 | Mediatyyppi ja merkistö |
Last-Modified: Tue, 02 Mar 2004 12:44:13 GMT | Milloin viimeksi muutettu. |
HTTP-otsikoita voi tutkia tarkemmin esim. seuraavilla ohjelmilla:
- Tamper Data -laajennos Firefoxiin
- Web-Sniffer
HTTP Status Codes
Palvelin palauttaa vastauksessa HTTP-statuskoodin, joka kertoo lyhyesti selaimelle miten pyyntö onnistui ja miten tulee jatkossa toimia. Listassa yleisimmät:
- 200 OK
- 300 Multiple Choices
- 301 Moved Permanently
- 302 Found
- 401 Unauthorized Access
- 403 Forbidden
- 404 Not Found
- 406 Not Acceptable
- 408 Request Time-out
- 500 Internal Server Error
Lisätietoa
Lomakkeen käsittely PHP:lla
HTTP-otsikkotiedot
Selaimen lähettämät otsikkotiedot saa esimääritellystä $_SERVER-taulukosta. Avaimet ovat muotoa HTTP_HEADER_NAME. Esim.
$_SERVER['HTTP_ACCEPT_LANGUAGE']
PHP luo automaattisesti otsikkotiedot ennen HTML-dokumenttia. Jos näitä halutaan muuttaa, niin aivan dokumentin alussa on käytettävä header-funktiota. Esim. edelleenohjaus:
<?php
header('Location: http://appro.mit.jyu.fi/www/');
?>
- RFC2616-spesifikaation luku 14 - HTTP:n otsikkotiedot
- HTTP Headers and the PHP header() function
Ympäristömuuttujat
$_SERVER-taulukosta saa myös palvelimen ja skriptien toimintaan liittyvät CGI-parametrit. Lisäksi mukana on muutama PHP-skriptien toimintaan liittyvä tieto. Esim.
$_SERVER['PHP_SELF']
Lomaketiedot
HTML-lomakkeelta lähetetyt tiedot saa helpoiten
$_REQUEST-taulukosta.
Se sisältää sekä $_GET- että
$_POST-taulukoiden tiedot.
Taulukon avaimena on lomake-elementin name
-ominaisuus. Esim.
$_REQUEST['etunimi']
Huomioitavaa:
- GET-parametri voi olla myös HTML-linkissä. Tällöin se on saatavissa näistä esimääritellyistä taulukoista.
- Jos checkboxeilla on sama
name
-ominaisuus, niin vain viimeisen tiedot saadaan taulukkoon. Kaikki vaihtoehdot saadaan taulukkoon antamalla name-ominaisuuden loppuun hakasulkeet:<input type="checkbox" name="valinta[]" value="yks" /> <input type="checkbox" name="valinta[]" value="kaks" />
- Tällöin
$_REQUEST['checkboxin_name']
-muuttujassa on taulukko valinnoista. - Tämä on ikävä piirre PHP:ssa, entä jos emme pystykään vaikuttamaan XHTML-koodiin? :-(
- Tällöin
- Myös monivalintaisen select-elementin
name
-ominaisuuteen on laitettava hakasulkeet. - var_dump ja print_r helpottavat debuggausta.
Esimerkki
Aletaan tehdä luennolla esimerkkiä lomakkeen käsittelystä. Esimerkissä käydään läpi mm. alla listattuja asioita. Esimerkkiä jatketaan seuraavalla luennolla.
Esimerkkilomakkeen koodi (jatketaan seuraavalla luennolla)
- Lomakemuuttujien tulostaminen
- Taulukot
- Taulukkoon lisääminen
- Moniulotteinen taulukko
- Lomakemuuttujilla operoiminen
- Vertailuoperaattorit
- Laskutoimitukset
foreach
- Checkbox ja taulukot
- Validointi
- Oletusarvon täyttö
- Keskiarvoja
- Dynaamiset lomakkeet
Käyttäjien kommentit