A Http és a PHP kapcsolata Web-Sky Consulting Kft Tóth Imre 2009
Előadások címei 1. PHP nyelv alapjai 2. Objektumorientáltság a PHP-ben 3. A Http és a PHP kapcsolata 4. Adatbázis kezelés a PHP-ben 5. MVC alapjai 6. Zend Framework és az MVC 7. Zend Framework alapelemei 8. Adatbázis modell 9. Zend Framework részletei 10. Form kezelés és validáció 11. Ajax és jquery bemutatása 12. jquery felületek beágyazása 13. Authentikáció és jogosultság kezelés, OpenID
HTTP: HyperText Transfer Protocol 1999-ben kiadott 2616 RFC-ben definiált a HTTP 1.1. Ez a legelterjedtebb verziója. Kliens szerver alapú kommunikáció TCP/IP felett működik 80-as porton Állapot nélküli kapcsolat: minden kérésnél szükséges elküldeni minden szükséges információt. Vannak technikák, amik segítségével ez orvosolható. (session, cookie)
Kommunikáció 1. A böngésző (kliens) nyit egy socketet a szerver felé. 2. Ráírja a socketre a kérését. 3. Majd kiolvassa onnan a választ. 4. Erre a socketre lehet írni újabb kéréseket. 5. Két kérés között maximum Keep-Alive-nyi tétlen idő telhet el. 6. Szerver vagy a kliens lezárja a kapcsolatot.
HTTP kérések GET / HTTP/1.1 Host: www.google.hu User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/ plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: hu-hu,hu;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: PREF=ID=9bfd7669bfb28cd5:TM=1186956964:LM=1186956964:S=b1z4 Yfs62xKjx3ZT
POST /auth.html kérés HTTP/1.1 Host: belepes.t-online.hu User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/ plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: hu-hu,hu;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://freemail.hu/levelezes/login.fm?page= Content-Type: application/x-www-form-urlencoded Content-Length: 203 user=teszt%40freemail.hu&userwithoutdomain=teszt&pass=12345
HTTP válasz HTTP/1.x 200 OK Cache-Control: private Content-Type: text/html; charset=utf-8 Content-Encoding: gzip Server: gws Content-Length: 1677 Date: Thu, 04 Oct 2007 10:38:47 GMT maga az adat
Néhány hasznos http header Content-Length: 1024 byte-ban az adat hossza Content-Type: text/plain Tartalom típusa: text/html, text/plain, text/xml image/gif, image/jpeg, image/png audio/mpeg, video/mpeg, video/quicktime application/zip, application/octet-stream Location: http://web-server.hu/index.php Erre a címre ugrik a böngésző
Fájl letöltésnél Meg kell adni a fájl típusát (content-type) Hosszát Eredeti nevét (így fogja menteni) Content-type: application/pdf Content-length: 18676 Content-disposition: attachment; filename="fajl.pdf"
Form (űrlap) Így néz ki egy átlag űrlap: <form name="login" method="post" action=""> <input type="hidden" name="titok" value="12345"> <input type="text" name="szoveg"> <input type="submit" name="gomb" value="belépés"> </form>
Form opciók Method: post vagy get Action: kezelő url, ha üres, akkor önmaga esetlges gettel együtt Enctype: mezők kódolását adja text/plain (alapértelmezett) multipart/form-data (pl: fájl feltöltéshez) application/x-www-form-urlencoded (pl: ajax)
Űrlap elemek Input mező button checkbox file hidden image password radio reset submit text name: nevét adjuk meg value: érték/kezdőérték size: mező mérete (ahol értelmezett) src: kép url (image esetén) readonly, disabled, checked
Űrlap elemek Select <select name="valasz"> <option value="1">első</option> <option value="2" selected>masodi</option> </select> multiple: több elem kijelölése size: n elemet jelenít meg egyszerre Textarea <textarea name="neve">kezdő Szöveg</textarea>
PHP és az űrlap A php definiál pszeudo változókat: $_POST: post-tal küldött adatok $_GET: get-tel küldött adatok $_COOKIE: böngésző által mentett adatok $_REQUEST: előző három együtt $_SESSION: session-ben lévő adatok $_FILES: fájl feltöltés esetén a fájlok $_SERVER: szerver változók
$_SERVER [HTTP_HOST] => localhost [HTTP_USER_AGENT] => Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7 [SERVER_SOFTWARE] => Apache/2.2.4 (Win32) PHP/5.2.3 [SERVER_NAME] => localhost [SERVER_ADDR] => 127.0.0.1 [SERVER_PORT] => 80 [REMOTE_ADDR] => 127.0.0.1 [DOCUMENT_ROOT] => D:/Projects [SCRIPT_FILENAME] => D:/Projects/teszt.php [REMOTE_PORT] => 3565 [SERVER_PROTOCOL] => HTTP/1.1 [REQUEST_METHOD] => GET [QUERY_STRING] => izemize=5 [REQUEST_URI] => /teszt.php?izemize=5 [PHP_SELF] => /teszt.php
$_POST, $_GET Az űrlap elküldése meghívja az action url-t, ami feldolgozza a formot. Ekkor a php definiálja nekünk a korában felsorolt tömböket. Ha több input mezőnek ugyanazt a speciális nevet adjuk, hogy neve[], akkor egy tömböt állít elő a php, és tömbként érjük el az adatokat.
<? if ($_POST["login"]) { $user = "en"; $jelszo = "vagyok"; if ($_POST["jelszo"]==$jelszo && $_POST["user"] == $user) echo "Ismerlek kedves gazdám!"; }?> <html> <head><title>login oldal</title></head> <body> <form name="login_form" method="post" action=""> <input type="text" name="user"> <input type="password" name="jelszo"> <input type="submit" name="login" value="belépés"> </form> </body> </html>
File feltöltése A kliens file-t tud feltölteni a szerverre. Ehhez szükséges egy speciális form. A form-on meg kell adni a file elérési útvonalát. Submit után a file feltöltődik a szerverre és egy ideiglenes könyvtárban elhelyezi a szerver. Az ideiglenes könyvtárból tetszőleges helyre másolhatjuk a szerveren(ahogy a jogosultságunk engedi)
File feltöltés példa <?php $cel = "uploads/". $_FILES['file1'']['name']; if(move_uploaded_file($_files['file1'']['tmp_name'],$cel)){ echo "File sikeresen feltöltve."; }else{ echo "Sikertelen file feltöltés."; }?> <html> <heap><title>upload</title></head> <form name="form1" enctype="multipart/form-data" action="" method="post"> <input type="file" name="file1"> <input type="submit" name="mehet" value="feltölt"> </form> </html>
Biztonságos fájlletöltés A védett fájlok a weboldalról nem elérhetőek, a gyökér felett vannak. Egy php szkript segítségével, lehet ellenőrizni azt, hogy ki férhet hozzá az egyes fájlokhoz. Átfolyatjuk a fájlt tartalmát a php-n
$path = "../files/"; if ($_SESSION["login"]){ header('content-type: application/octet-stream'); header('content-length: '.filesize($path.$_get["file"])); header('content-disposition: attachment; filename="'.$_get["file"].'"'); $file=fopen($path.$_get["file"]); while (!feof($file)) { $buffer = fread($file,1024); echo $buffer; } fclose($file); } else { echo "Nincs jogosultságod!"; }
Cookie használata Segítségével a kliens oldalon tudunk adatokat tárolni. Így támogatni, követni tudjuk a visszatérő felhasználókat. Egy domain-hez csak meghatározott számú cookie és egy kliensen is csak korlátozott számú cookie tárolható. A cookie-k mérete is korlátozott ezért csak kisebb adatokat lehet benne tárolni(név, bállítások). A legtöbb böngésző támogatja, de sokszor le van tiltva ezét nem érdemes csak erre támaszkodni.
Cookie-k használata Mivel a cookie-k a kliens gépen vannak tárolva és egyszerű szöveg ként. Nem biztonságosak és viszonylag rövid ideig tárolja a böngésző ezért fontos illetve titkos adatok tárolására sem alkakmas. A böngésző a cookie-k adatait a header-el együtt küldi el ezért úgy azok a megszorítások érvényesek rá, mint a header-re(minden kiíratás előtt kell lennie).
Cookie-k a PHP5-ben Minden a cookie amit a kliens küldött belekerül a $_COOKIE szuper globális változóba és ugyan úgy használható mint a $_GET vagy a $_POST tömb. Cookie-t a setcookie(); paranccsal lehet létrehozni. Header-t használ! Paraméterek: -név:később ezzel a névvel érhető el a cookie. -érték -lejárati idő: sec-ben. pl: time()+24*60*60(1 nap) -könyvtár: A cookie csak ebben a könyvtárban lesz elérhető(alkönyvtárak is). -domain: Csak az adott domain-ben lesz elérhető a cookie. -https: [true false] csak https-en elérhető a cookie -http: [true false] csak http-n érhető el. (JS-el nem) pl: setcookie("testcookie", $value, time()+3600, "/~rasmus/", ".example.com", 1);
SESSION kezelés PHP 5-ben Az állapot nélküli kapcsolat hátrányait segít kiküszöbölni. Segítségével a szerveren tárolhatunk, biztonságosan nagyobb adatokat, rövid ideig. Minden kliens kap egy SID-et és ezzel férhet hozzá a saját session-hez. A SID-et mindig el kell küldeni a szervernek. Ezt lehet GET-tel vagy cookie-val.
Munkamenet kezelő függvények session_start(): új munkamenetet kezd vagy a meglévőt folytatja. Header-t használ! A munkamenet adatait a $_SESSION tömbben tudjuk elérni. változót az unset($_session['nev']); utasítással tudunk törölni. session_id(); visszaadja a session azonosítót. session_name(); visszaadja a az aktuális munkamenet nevét. echo SID; megegyezik: session_name()."=".session_id(); ezt a kifejezést lehet használni, ha az url-ben akarjuk átadni a session azonosítót $_COOKIE[session_name()]; ha cookie-t használunk a session kezelésre, ez az alapértelmezett Objektumok sessionban tárolásánál vigyázni kell arra, hogy a session_start() hívása előtt, be kell tölteni az osztály definíciókat.
Példa <?php session_start(); print_r($_session); $_SESSION['valtozo'] = "Helló Világ!";?> Először nem ír ki semmit, majd frissítve az oldalt, kiírja a "Helló Világ!" szöveget.
Egyedi SESSION kezelés session_set_save_handler ($open, $close, $read, $write, $destroy, $gc ); Függvény nevek, sorra megvalósítják a SESSION kezeléshez szükséges műveleteket. Pl: adatbázis alapú session kezelés.