PHP alapjai II. Vincze Dávid Miskolci Egyetem, IIT vincze.david@iit.uni-miskolc.hu
PHP fájl feltöltés <form enctype="multipart/form-data" action="fogado.php" method="post" /> <input type="hidden" name="max_file_size" value="3000000" /> <input type="file" name="beton" /> <input type="submit" name="submit" value="feltölt" /> MAX_FILE_SIZE: sokat nem ér, nem itt kell ezzel foglalkozni
PHP fájl feltöltés $filenev = $_FILES['beton']['name']; // eredeti nev $tempnev = $_FILES['beton']['tmp_name']; // hova kerult ideiglenesen a file $meret = $_FILES['beton']['size']; $tipus = $_FILES['beton']['type']; move_uploaded_file($tempnev, "feltoltottek/". $filenev);
PHP Cookie kezelés Perzisztens adattárolás a kliensen cookie süti név (kulcs), érték, lejárat if(!$_cookie["nezegeto"]) { echo "Teged nem ismerlek!"; setcookie ("nezegeto", "Ismeretlen Ember", 3600+time() ); else { echo "Mar ismerlek.";
PHP Session kezelés Alapvetően a HTTP állapotmentes azonosítók hozzárendelésével követhető így kvázi elfedhető az állapotmentesség session_start(); if (!isset($_session['belepve'])) { $_SESSION['belepve'] = 1; else { $_SESSION['belepve']=0;
PHP Session kezelés A $_SESSION szuperglobális asszociatív tömbben tetszőleges kulcsok és értékek adhatóak meg A rendszeren ez legtöbbször fájl alapon tárolódik Létezik több fajta session handler Adatbázis, osztott memória, memcached, stb...
PHP Session kezelés Pl. file handler esetén: (default) cat /tmp/sess_vjeddon96hlmvmg88q1serntd0 securimage_code_value s:4:"h5f4"; Maguktól ezek nem szűnnek meg garbage collector max. lifetime gc meghívásának valószínűsége aztán majd töröl ha úgy gondolja
PHP GD graf. könyvtár LibGD2 Ingyenes grafikai manipulációs függvénytár gd néven szerepel a modulok között gyakori pl. feltöltött képek méretének lekérdezés generálni valamilyen egyszerű képet formátum / méret konverzió
PHP GD graf. könyvtár header("content-type: image/jpeg"); $kep = imagecreate(250,250); $zold = imagecolorallocate($kep,0,255,0); $kek = imagecolorallocate($kep,0,0,255); imageline($kep, 0, 0, 140, 140, $kek); imagejpeg($kep);
NoSQL No SQL, Not Only SQL Kulcs-érték tárolók, mint egy nagy asszociatív tömb Nyilván kisebb funkcionalitás, de pl. weboldalaknál bőven elegendő Ezért jóval gyorsabb Több fajta implementáció, megközelítés Mi a Memcached-et nézzük meg
NoSQL Több fajta implementáció, megközelítés Cél, hogy levegyük a terhelést az RDBMS-ről Mi most a Memcached-et nézzük meg (meg kicsit a MongoDB-t) Kulcs-érték tároló (objektum), mint egy nagy asszociatív tömb Nyilván kisebb funkcionalitás, de pl. weboldalaknál bőven elegendő Ezért jóval gyorsabb
NoSQL - Memcached Sokan használják: YouTube, FB, Amazon, stb. Jól skálázódik Unix domain socket / TCP socket Egyszerű protokoll GET/SET PHP API memcache extension Implementálja a protokollt CONNECT/GET/SET egyszerű fgvek
NoSQL - Memcached Nem perzisztens! Restart, shutdown, crash = adatvesztés Ezért is inkább csak cache-lésre használják Tipikus: Megvizsgálni, hogy van-e már az adott obj. MC-ben Ha van, azt használjuk Ha nincs, előállítjuk a tartalmat RDBMS-ből Betesszük MC-be az új tartalmat RDBMS-be íráskor is frissíthetjük MC-ben
NoSQL - Memcached De nem is fontos perzisztensnek lennek minden esetben. Pl. kik vannak épp az oldalon... Vagy időzítve szinkronizálhatjuk háttértárra Nézzunk példa kódót!
NoSQL - Memcached $mc = memcache_connect('host', 11211); memcache_set($mc, 'kulcs'); $ertek = memcache_get($mc, 'kulcs'); memcache_increment($mc, 'szamlalo', 1); memcache_decrement($mc, 'szamlalo', 1); memcache_delete($mc, 'kulcs'); memcache_flush($mc); memcache_close($mc);
NoSQL - Memcached Ha nincs ilyen kulcs használva, akkor NULL-t ad vissza a get(). increment() és decrement() atomi operáciok! Előfordulhat, hogy RDBMS query gyorsabb. Ilyenkor azt kell használni :) (Maga az RDBMS is cache-lhet...)
NoSQL - MongoDB Dokumentum orientált JSON JavaScript Object Notation Példa a Wikipediaról: { "firstname": "John", "lastname": "Smith", "age": 25, "address": { "streetaddress": "21 2nd Street", "city": "New York", "state": "NY", "postalcode": "10021", "phonenumber": [ { "type": "home", "number": "212 555-1234", { "type": "fax", "number": "646 555-4567" ]
NoSQL - MongoDB Nem kell előre definiálni a DB-t, csak használatba kell venni Ha nem volt még, akkor létrehozza DB-n belül objektumokat látunk Van nekik saját egyedi azonosítójuk A DB-n belül objektum gyűjtemény -ek vannak Nem szigorúan kötött a szerkezet
NoSQL - MongoDB Példa a doksiból: > use things >j = { name : "mongo" ; {"name" : "mongo" > t = { x : 3 ; { "x" : 3 > db.things.save(j); > db.things.save(t); > db.things.find(); { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3
NoSQL - MongoDB Másik példa: > db.gyujtemeny.save({ mezo_nev: "mezo_ertek"); > db.gyujtemeny.save({ mezo_nev_masik: "mezo_ertek_valami2", szammezo: 1 ); > db.gyujtemeny.find(); { "_id" : ObjectId("c11f83a19c724ac61aee150e53a56ecb"), "mezo_nev" : "mezo_ertek" { "_id" : ObjectId("c11f83a19c724ac61aee150e53a56ecc"), "mezo_nev_masik" : "mezo_ertek_valami2", "szammezo" : 1 > db.gyujtemeny.find(szammezo:1); { "_id" : ObjectId("c11f83a19c724ac61aee150e53a56ecc"), "mezo_nev_masik" : "mezo_ertek_valami2", "szammezo" : 1
PHP OOP PHP 5 normálisan támogat OOP-t Procedurális programozás helyett struktrúrába rendezett kód és hozzá tartozó adatszerkezet. Modulárisabb, áttekinthetőbb, stb. No more bloat, csináljunk egy osztályt: class myclass { function myclass(){
PHP OOP class myclass { public $x; function myclass(){ // konstruktor $x=7; function construct(){ function kiir(){ echo('valami'); $obj=new myclass(); $obj->kiir();
PHP OOP private / public / protected adattagok/metódus $this saját magára mutat $this->kiir(); $this->x=8; construct() public function construct($elso, $masodik) new ojjekt('valami',77) destruct() Nem lehet argumentuma
PHP OOP class Customer { private $first_name; private $last_name; private $outstanding_amount; public function construct($first_name, $last_name, $outstanding_amount) { $this->setdata($first_name, $last_name, $outstanding_amount); public function setdata($first_name, $last_name, $outstanding_amount){ $this->first_name = $first_name; $this->last_name = $last_name; $this->outstanding_amount = $outstanding_amount; public function printdata() { echo "Name : ". $first_name. " ". $this->last_name. "\n"; echo "Outstanding Amount : ". $this->outstanding_amount. "\n"; $c1 = new Customer("Sunil","Bhatia",0);
PHP OOP public function tostring() { return Valtozom1:. $this->valt1., valt2 =. $this->valt2; echo Ojjektum print:. $ojj;
PHP OOP Öröklődés class MyOtherClass extends MyClass { Scope operátor :: Statikus elérése osztály tagjának Példányosítás nélkül pl. osztaly::tag(); pl. örökölődés után egy felülírt fgv. helyett az eredetit használni az eredeti osztályban
PHP OOP class Ember { public $nev; $e = new Ember(); $e->nev = Jancsi ; // $name publikus,beallitodik $e->email = email@domain.com ; // nem volt definialva, megis beallitodik
PHP OOP class Customer { public $name; private $data = array(); public function set($dt, $vl) { $this->data[$dt] = $vl; public function get($dt) { return $this->data[$dt]; $c = new Customer(); $c->name = Jancsi ; $c->email = email@domain.com ; // beallit echo $c->email;
NoSQL Memcached OOP $memcache = new Memcache; $memcache->connect('localhost', 11211) or die ("Could not connect"); $memcache->set('kulcs','nagyertek',0,3600); $ertek = $memcache->get('kulcs'); $memcache->flush(); $memcache->delete('kulcs'); $memcache->increase('kulcs'); $memcache->decrease('kulcs');
PHP exceptions try { $error = 'Dobok, figyelj!'; throw new Exception($error); echo('ez itt sosem fog lefutni.'); catch (Exception $e) { echo('kivetelt kaptam: ',$e->getmessage()); // Tovabb megyunk echo('tovabb...');
PHPMailer A mail()-t miért is nem szeretjük? :) Helyette: PHPMailer Nem PHP extension, hanem PHP-ben írt fgvkönyvtár/osztály Támogat mindent, ami kellhet Letöltés, kicsomagolás, kész. Használjunk SMTP-t (localhost-ra)
PHPMailer require("class.phpmailer.php"); $mail = new PHPMailer(); $mail->issmtp(); // hasznalj SMTP-t $mail->host = "localhost"; $mail->from = "user@iit.uni-miskolc.hu"; $mail->fromname = "Egyes User"; $mail->addaddress("user2@iit.unimiskolc.hu"); $mail->subject = "Levelke"; $mail->body = "Szia!\n\nEzt PHPMailer-rel kultem. udv.";
PHPMailer if(!$mail->send()) { echo 'Hat ez nem ment el.'; echo 'Hiba: '. $mail->errorinfo; else { echo 'Sikeresen elkuldve.';
PHPMailer AddAttachment($path,$name,$encoding,$type); Path: maga a fájl Name: ilyen néven jelenjen meg a levélben Encoding: lehet több fajta, többnyire base64 az alap Type: MIME típus AddEmbeddedImage(filename, cid, name); Belső attachment, cid-el azonosítva