PHP - Try a different one.
Transkrypt
PHP - Try a different one.
PHP (PHP: Hypertext Preprocessor) PHP a CGI Dokument HTML z instrukcjami AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps Obsługiwane BD, IBM DB2, Informix, Ingres, InterBase, FrontBase, mSQL, Direct MS-SQL, MySQL, ODBC, Oracle (OCI7 i OCI8), Ovrimos, PostgreSQL, Solid, Sysbase, Velocis, Unix dbm, ... Obsługiwane protokoły: IMAP POP3 HTTP ... <html> <head> <title>Prosty program PHP</title> </head> <body> <h1>Prosty program PHP</h1> <?php echo ”Jestem PHP”; ?> Jestem HTML <? echo (”Jestem PHP”); ?> </body> </html> <?php treść skryptu ?> <? treść skryptu ?> <script language="php"> treść skryptu</script> <% treść skryptu %> <?php Instrukcja1; Instrukcja2; .. InstrukcjaN ?> // jestem komentarzem # jestem komentarzem /* jestem komentarzem */ Logiczny (boolean) Całkowity (integer) Rzeczywisty (float) Napisowy (string) Tablica (array) Obiekt (object) Zasób (resource) NULL Przyjmowane wartości: True lub False Case-insensitive Konwertowanie na typ logiczny (bool) (boolean) Notacje: Dziesiątkowa - 1234 Heksadecymalna - 0x1A Oktalna – 0123 Konwertowanie na typ całkowity (int) (integer) $liczba1 = 2147483647; $liczba2 = 2147483648; var_dump($liczba1); // wypisze: int(2147483647) var_dump($liczba2); // wypisze: float(2147483648) Przykładowe wartości 1.234 1.2e3 //1.2 * 103 7E-10 //7 * 10-10 Konwertowanie na typ rzeczywisty (float) (double) (real) 256 różnych wartości Tworzenie łańcucha znaków ’tekst’ ”tekst” Składnia heredoc Składnia newdoc Konwertowanie na typ napisowy (string) strval() $tekst = ’ab\\c\’d\n’; echo $tekst; //wypisze: ab\c’d\n \’ \\ \n \r \x[0-9A-Fa-f]{1,2} \” \\ \$ \[0-7]{1,3} \t $tekst = <<<KONIEC Ala ma kota KONIEC; Heredoc $tekst = <<<'KONIEC' Ala ma kota KONIEC; Newdoc (PHP 5.3) $liczba = 5; $tekst1 = "Liczba = $liczba+3"; $tekst2 = 'Liczba = $liczba+3'; echo $tekst1; echo $tekst2; $beer=‘Heineken’; echo ”He drunk some ${beer}s” $tab[0][0]=62; echo ”Wartość=$tab[0][0]”; echo ”Wartość={$tab[0][0]}”; ... $obj -> b=4; echo ”Wartość={$obj->b}mm; Liczba = 5+3 Liczba = $liczba+3 He drunk some Heinekens Wartość=Array[0] Wartość=62 Wartość=4mm $tekst = ”Ala ma kota”; echo $tekst[1]; //wypisze „l” $tekst = ”Ala” . ” ma” . ” kota”; echo $tekst; //wypisze „Ala ma kota” „.”, „e” lub „E” typ rzeczywisty Brak „.”, „e” lub „E” typ całkowity „22a” 22 „a22” 0 strlen() strstr(), stristr() print(), echo() explode(), split() Klucz liczba całkowita nieujemna łańcuch znaków Tworzenie array() Tablica[klucz]=wartość Konwertowanie (array) $tablica1[0] = ‘Ala’; $tablica1[1] = ‘ma’; $tablica1[] = ‘kota’; //<=>$tablica1[2] = ‘kota’; $tablica2[‘liczba1’] = 1; $tablica2[‘liczba2’] = 67; $tablica1 = array( 0 => ‘Ala’, 1 => ‘ma’, 2 => ‘kota’); $tablica2 = array( ‘liczba1’ => 1, ‘liczba2’ => 67); 0 ‘Ala’ 1 2 ‘ma’ ‘kota’ ”8” 8 ”08” ”08” float int False 0 True 1 NULL ”” klucz wartość ‘liczba1’ ‘liczba2’ klucz 1 67 wartość count() next() prev() end() current() sort(), asort(), arsort(), ksort(), krsort(), uasort(), usort(), uksort() $tab[‘liczba’][1] = 62; //$tab = array ( ”liczba" => array ( 1 => 62)); echo "Wartość = {$tab[‘liczba’][1]}”; class MojaKlasa { var $z; var $a=0; var $b=2+2; //błąd function metoda ($arg1, $arg2){ $this->z = $arg1 + $arg2; } function MojaKlasa (){ $this->b = 2*2; } } class MojaKlasa{ ... } class MojaKlasa2 extends MojaKlasa { var $r; function metoda2 ($arg1, $arg2){ $this->r = $arg1 + $arg2; } } Class MojaKlasa{ //zawartość klasy taka jak na pop. slajdzie } $obiekt = new MojaKlasa; $obiekt-> metoda(2,2); /*********************/ $obj = (object) ’abc’; echo $obj->scalar; //wypisze ‘abc’ class A { function A(){ echo ”A: konstruktor”; } function C(){ echo ”A: metoda C()”; } } /**************/ class B extends A{} $b = new B(); //wypisze: A: konstruktor class A { function A(){ echo ”A: konstruktor”; } } /**************/ class B extends A{ function B($a=1){ echo ”B: konstruktor ”; echo ”a=$a<br>”; } } $b = new B(); //B: konstruktor a=1 $b = new B(10); //B: konstruktor a=10 class A{ function pisz(){ echo "Metoda klasy A<br>"; } } class B extends A{ function pisz(){ echo "Metoda klasy B<br>"; A::pisz(); parent::pisz(); } } $b = new B; $b->pisz(); //wypisze: //Metoda klasy B //Metoda klasy A //Metoda klasy A $zmienna = wartość Case Sensitive $_SERVER $_ENV $_COOKIE $_GET $_POST $_FILES $_REQUEST $_SESSION $GLOBALS $php_errormsg ... Przykład $a = "hello"; $$a = "world"; echo "$a ${$a}"; // echo "$a $hello"; //wyświetli: hello world Zmienne zmienne jako tablice ${$a}[1] ${$a[1]} ${$_GET} gettype() is_array(), is_float(), is_int(), is_object(), is_string(), … Definiowanie define(”LICZBA_PI”,3.1415926); define(”LICZBA_PI”,3.1415);// Błąd Dostęp echo LICZBA_PI; __LINE__ PHP_VERSION __CLASS__ __FUNCTION__ Przykład użycia version_compare(PHP_VERSION, "5.0.0", "<") and echo( 'wymagany PHP w wersji, co najmniej, 5.0); $a + $b $a - $b $a * $b $a / $b $a % $b $a & $b $a | $b $a ^ $b ~ $a $a << $b $a >> $b $a == $b $a === $b $a != $b $a <> $b $a !== $b $a < $b $a > $b $a <= $b $a >= $b ++$a, $a++, --$a, $a- ? $drugie : $trzecie $a && $b $a and $b $a || $b $a or $b $a xor $b ! $a $a = 3 $a += 3 //$a = $a + 3 $a -= 3 $a *= 3 $a /= 3 $a %= 3 $a .= ”abc” $a &= 111 $a |= 111 $a ^= 111 $a <<= 111 $a >>= 111 if(warunek1) { instrukcje1 } elseif(warunek2) { instrukcje2 } ... else { instrukcjen } if(warunek1) : instrukcje1 elseif(warunek2) : instrukcje2 ... else: instrukcjen endif; switch(wyrażenie){ case wartość1: instrukcje1 break; case wartość2: instrukcje2 break; .. default: instrukcjen break; } switch(wyrażenie): case wartość1: instrukcje1 break; case wartość2: instrukcje2 break; .. default: instrukcjen break; endswitch; while(warunek){ instrukcje } while(warunek): instrukcje endwhile; do{ instrukcje }while(warunek); for(wyrażenie1;wyrażenie2 ;wyrażenie3){ instrukcje } for(wyrażenie1;wyrażenie2 ;wyrażenie3) : instrukcje endfor; Składnia foreach($tablica as $wartość) {instrukcje} foreach($tablica as $klucz => $wartość) {instrukcje} $tablica = array (10, -2, 0); foreach ($tablica as $v) { echo ”bieżąca wartość \$tablica: $v.<br>\n"; } bieżąca wartość $tablica: 10 bieżąca wartość $tablica: -2 bieżąca wartość $tablica: 0 $tablica = array ( ”jeden" => 10, ”dwa" => -2 , ”trzy" => 0); foreach($tablica as $k => $v) { print "\$tablica[$k] => $v.<br>\n"; } $tablica[”jeden”] => 10 $tablica[”dwa”] => -2 $tablica[”trzy”] => 0 $i = 0; while (++$i) { switch ($i) { case 5: echo ”Przy 5<br>\n"; break 1; /* Przerwij „switch” */ case 10: echo ”Przy 10; koniec<br>\n"; break 2; /* Przerwij „switch” i „while” */ default: break; } } for($i = 0 ; $i < 10 ; $i++){ if (($i % 2) != 0) // przeskocz nieparzyste continue; //wypisz parzyste echo ”$i ”; } 02468 Tworzenie function fun ($arg_1, $arg_2, ..., $arg_n) { echo ”Przykładowa funkcja.\n"; return $wartosc; } Wywoływanie fun (wart1, wart2, ..., $wartn) function f() { $liczbaArg = func_num_args(); echo Liczba argumentów: $liczbaArg<br />\n"; echo Drugi argument to: " . func_get_arg(1) . "<br />\n"; $listaArg = func_get_args(); for ($i = 0; $i < $liczbaArg; $i++) { echo "Argument $i to: " . $listaArg[$i] . "<br />\n"; } } f(1, 2, 3); function fun($arg) { echo $arg; } $zmienna = ’fun’; $zmienna(1); //wywołanie funkcji „fun” call_user_func('fun',1,2,3); //wywołanie funkci „fun” call_user_func_array("fun", array("pierwszy", "drugi")); $a = 5; function Test() { //global $a; echo $a; } Test(); // wbrew pozorom NIE wyświetli się 5 function Test() { $a = 0; $a++; echo $a; } Test(); //wypisze się 1 Test(); //wypisze się 1 function Test() { static $a = 0; $a++; echo $a; } Test(); //wypisze się 1 Test(); //wypisze się 2 function f(){ return 5; echo("Ten tekst się nie wyświetli"); } function &zwrocReferencje() { return $jakasref; } $nowaref =& zwrocReferencje(); $a=2; function f($arg){ $arg++; } fun($a); echo $a;//wypisze 2 $a=2; function f(&$arg){ $arg++; } fun($a); echo $a;//wypisze 3 function robPizza ($rozmiar,$typ = Bolonia") { pizz rozmiar $rozmiar typu $typ.\n"; return Robi } echo robPizza (); echo robPizza (rednia,peperone); echo robPizza ( rednia); pizz rozmiar typu Bolonia. Robi pizz rozmiar rednia typu Bolonia. Robi pizz rozmiar rednia typu peperone. Robi Metoda „GET” $_GET Metoda „POST” $_POST Nazwa pola klucz <form action=”skrypt.php" method="GET"> <input type="TEXT" name=”imie" value=”Jan"> <select name=”lista[]” MULTIPLE>...</select> <input type="IMAGE" name=”akceptuj" value=”Jan"> </form> <?php echo $_GET[”imie"]; //wyświetli „Jan” ?> skrypt.php akceptuj.x akceptuj_x Dokument HTML <form enctype="multipart/form-data" method=”POST”… > <input type="hidden" name="MAX_FILE_SIZE" value=”20000" > <input name=”plik" type="file" > … </form> $_FILES[‘plik']['name'] $_FILES[‘plik']['type'] $_FILES[‘plik']['size'] $_FILES[‘plik']['tmp_name'] $_FILES[‘plik']['error'] $max = 1024; if (is_uploaded_file($_FILES['plik']['tmp_name'])) { if ($_FILES['plik']['size'] > $max) { echo 'Plik jest za duzy!'; } else{ echo Odebrano plik . $_FILES['plik']['name']; echo '<br>'; if (isset($_FILES['plik']['type'])) { echo 'Typ: '.$_FILES['plik']['type'].'<br>'; } move_uploaded_file($_FILES['plik']['tmp_name'], /usr/local/apache/htdocs/ . $_FILES['plik']['name']); } } else { echo 'Blad przy przesylaniu danych!'; } $plik = fopen($nazwa,”$trybOtw$trybKonw”) $trybOtw = r | r+ | w | w+ | a | a+ | x | x+ $trybKonw = t (\n \r\n) $trybKonw = b (brak konwersji) Tylko fclose($plik) $znak = fgetc($plik) $znaki = fread($plik,$n) $linia = fgets($plik,$n) fwrite($plik,$tekst) fputs($plik,$tekst) flock($plik,$tryb) $tryb = LOCK_EX | LOCK_SH | LOCK_UN w Windows Biblioteka C PHP 5 a SQLite Serwer SQLite = Serwer WWW Automatyczna synchronizacja Niezaimplementowane RIGHT and FULL OUTER JOIN Kompletna obsługa ALTER TABLE Kompletna obsługa wyzwalaczy (triggerów) Zapis do widoków GRANT, REVOKE Klucze obce (dla SQLITE < 3.6.19) Triggery, funkcje i agregaty, obsługuje większość standardu SQL92. „atomiczność” - transakcje Linux, Windows – PECL od PHP4.3 API: C, C++, Java, PHP, Tcl, Perl, Python, VB, .Net, oraz możliwość łączenia przez ODBC. Wielowątkowość (thread safe) BD - jeden plik (do 2 TB). Różne systemy operacyjne – kopiowanie (TAK). Bezpieczeństwo – safe_mode, open_basedir Podzapytania (subselects) <?php $db=sqlite_open(‘baza-danych.sqlite’); sqlite_query($db,’ CREATE TABLE klienci ( id INTEGER PRIMARY KEY, nazwa, adres ); INSERT INTO klienci VALUES ( NULL, \’Jan Kowalski\’, \’Kraków\’ ); ‘); sqlite_close($db); <?php $db=sqlite_open(‘baza-danych.sqlite’); sqlite_query($db,’ CREATE TABLE klienci ( id INTEGER PRIMARY KEY, nazwa, adres ); INSERT INTO klienci VALUES ( NULL, \’Jan Kowalski\’, \’Kraków\’ ); ‘); sqlite_close($db); <?php $db=sqlite_open(‘baza-danych.sqlite’); sqlite_query($db,’ CREATE TABLE klienci ( id INTEGER PRIMARY KEY, nazwa, adres ); INSERT INTO klienci VALUES ( NULL, \’Jan Kowalski\’, \’Kraków\’ ); ‘); sqlite_close($db); <?php $db=sqlite_open(‘baza-danych.sqlite’); $idWyniku=sqlite_query($db,’SELECT * FROM klienci’); echo ‘Znaleziono ‘. sqlite_num_rows($idWyniku) . ‘klientów<br>’); while($wiersz=sqlite_fetch_array($idWyniku)){ echo $wiersz[‘id’]. ‘<br>’; echo $wiersz[‘nazwa’]. ‘<br>’; echo $wiersz[‘adres’]; } sqlite_close($db); <?php $db=sqlite_open(‘baza-danych.sqlite’); $idWyniku=sqlite_query($db,’SELECT * FROM klienci’); echo ‘Znaleziono ‘. sqlite_num_rows($idWyniku) . ‘klientów<br>’); while($wiersz=sqlite_fetch_array($idWyniku)){ echo $wiersz[‘id’]. ‘<br>’; echo $wiersz[‘nazwa’]. ‘<br>’; echo $wiersz[‘adres’]; } sqlite_close($db); <?php $db=sqlite_open(‘baza-danych.sqlite’); $idWyniku=sqlite_query($db,’SELECT * FROM klienci’); echo ‘Znaleziono ‘. sqlite_num_rows($idWyniku) . ‘klientów<br>’); while($wiersz=sqlite_fetch_array($idWyniku)){ echo $wiersz[‘id’]. ‘<br>’; echo $wiersz[‘nazwa’]. ‘<br>’; echo $wiersz[‘adres’]; } sqlite_close($db); <?php function moja($a){ return $a; } $db=sqlite_open(‘baza-danych.sqlite’); $rows=sqlite_array_query($db,”SELECT php(‘moja’,123) AS wynik”); ... sqlite_create_function($db,’moja_SQL’,’moja’) $row=sqlite_array_query($db,’SELECT moja_SQL(123) AS wynik;’); echo $row[0][‘wynik’]; //wypisze 123 sqlite_close($db); <?php $data = array('one','two','three','four','five','six', 'seven','eight', 'nine','ten', ); $dbhandle = sqlite_open(':memory:'); sqlite_query($dbhandle, "CREATE TABLE strings(a)"); foreach ($data as $str) { $str = sqlite_escape_string($str); sqlite_query($dbhandle, "INSERT INTO strings VALUES ('$str')"); } function max_len_step(&$context, $string) { if (strlen($string) > $context) { $context = strlen($string); } } function max_len_finalize(&$context) { return $context; } sqlite_create_aggregate($dbhandle, 'max_len', 'max_len_step', 'max_len_finalize'); var_dump(sqlite_array_query($dbhandle, 'SELECT max_len(a) from strings')); ?> Zunifikowane rozszerzenie do obsługi Baz Danych AdoDB a PDO PHP 5.1 zawiera PDO Sterownik Obs ugiwane BD DBLIB FreeTDS / Microsoft SQL Server / Sysbase FIREBIRD Firebird / Interbase 6 MYSQL MySQL 3.x/4.0 OCI Oracle Call Interface ODBC ODBC v3 (IBM DB2 i unixODBC PGSQL PostgreSQL SQLITE SQLITE 3.x Sterownik DSN DBLIB sysbase:host=localhost; dbname=testdb mssql:host=localhost; dbname=testdb FIREBIRD firebird:User=john;Password=mypass;Dabase=D ATABASE.GDE;DataSource=localhost;Port=3050 MYSQL mysql:host=localhost;dbname=testdb OCI oci:mydb oci:dbname=//localhost:1521/testdb ODBC odbc:DSN=SAMPLE;UID=john;PWD=mypass PGSQL pgsql:host=localhost port=5432 dbname=testdb user=john password=mypass SQLITE sqlite:/path/to/database sqlite::memory: <?php try{$db = new PDO("sqlite::memory:" );} catch( PDOException $e ){die( $e->getMessage() );} #$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $stmt = $db->query( "CREATE TABLE links ( id INTEGER PRIMARY KEY, name TEXT, url TEXT);"); $stmt = $db->query("INSERT INTO links VALUES (NULL,'WSZiB','http://www.wszib.edu.pl/');"); $stmt = $db->query("INSERT INTO links VALUES (NULL,'AGH','http://www.agh.edu.pl/');"); $stmt = $db->prepare( "SELECT * FROM links WHERE url = :url" ); $url = "http://www.wszib.edu.pl/"; $stmt->bindParam( ":url", $url ); $stmt->execute(); while( $row = $stmt->fetch() ) print_r( $row ); $url = "http://www.agh.edu.pl/"; $stmt->execute(); while( $row = $stmt->fetch() ) print_r( $row ); ?> <?php try{$db = new PDO("sqlite::memory:" );} catch( PDOException $e ){die( $e->getMessage() );} #$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $stmt = $db->query( "CREATE TABLE links ( id INTEGER PRIMARY KEY, name TEXT, url TEXT);"); $stmt = $db->query("INSERT INTO links VALUES (NULL,'WSZiB','http://www.wszib.edu.pl/');"); $stmt = $db->query("INSERT INTO links VALUES (NULL,'AGH','http://www.agh.edu.pl/');"); $stmt = $db->prepare( "SELECT * FROM links WHERE url = :url" ); $url = "http://www.wszib.edu.pl/"; $stmt->bindParam( ":url", $url ); $stmt->execute(); while( $row = $stmt->fetch() ) print_r( $row ); $url = "http://www.agh.edu.pl/"; $stmt->execute(); while( $row = $stmt->fetch() ) print_r( $row ); ?> <?php try{$db = new PDO("sqlite::memory:" );} catch( PDOException $e ){die( $e->getMessage() );} #$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $stmt = $db->query( "CREATE TABLE links ( id INTEGER PRIMARY KEY, name TEXT, url TEXT);"); $stmt = $db->query("INSERT INTO links VALUES (NULL,'WSZiB','http://www.wszib.edu.pl/');"); $stmt = $db->query("INSERT INTO links VALUES (NULL,'AGH','http://www.agh.edu.pl/');"); $stmt = $db->prepare( "SELECT * FROM links WHERE url = :url" ); $url = "http://www.wszib.edu.pl/"; $stmt->bindParam( ":url", $url ); $stmt->execute(); while( $row = $stmt->fetch() ) print_r( $row ); $url = "http://www.agh.edu.pl/"; $stmt->execute(); while( $row = $stmt->fetch() ) print_r( $row ); ?> <?php try{$db = new PDO("sqlite::memory:" );} catch( PDOException $e ){die( $e->getMessage() );} #$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $stmt = $db->query( "CREATE TABLE links ( id INTEGER PRIMARY KEY, name TEXT, url TEXT);"); $stmt = $db->query("INSERT INTO links VALUES (NULL,'WSZiB','http://www.wszib.edu.pl/');"); $stmt = $db->query("INSERT INTO links VALUES (NULL,'AGH','http://www.agh.edu.pl/');"); $stmt = $db->prepare( "SELECT * FROM links WHERE url = :url" ); $url = "http://www.wszib.edu.pl/"; $stmt->bindParam( ":url", $url ); $stmt->execute(); while( $row = $stmt->fetch() ) print_r( $row ); $url = "http://www.agh.edu.pl/"; $stmt->execute(); while( $row = $stmt->fetch() ) print_r( $row ); ?> <?php try{$db = new PDO("sqlite::memory:" );} catch( PDOException $e ){die( $e->getMessage() );} #$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $stmt = $db->query( "CREATE TABLE links ( id INTEGER PRIMARY KEY, name TEXT, url TEXT);"); $stmt = $db->query("INSERT INTO links VALUES (NULL,'WSZiB','http://www.wszib.edu.pl/');"); $stmt = $db->query("INSERT INTO links VALUES (NULL,'AGH','http://www.agh.edu.pl/');"); $stmt = $db->prepare( "SELECT * FROM links WHERE url = :url" ); $url = "http://www.wszib.edu.pl/"; $stmt->bindParam( ":url", $url ); $stmt->execute(); while( $row = $stmt->fetch() ) print_r( $row ); $url = "http://www.agh.edu.pl/"; $stmt->execute(); while( $row = $stmt->fetch() ) print_r( $row ); ?> <?php try{ $db = new PDO("sqlite::memory:"); $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $stmt = $db->query( "CREATE TABLE images(id INTEGER PRIMARY KEY,data BLOB);"); $stmt = $db->prepare(”INSERT INTO images (id, data) VALUES (NULL , ?)"); $fp=fopen('/home/http/htdocs/images/logo.png','rb'); $stmt->bindParam(1, $fp, PDO::PARAM_LOB); $db->beginTransaction(); $stmt->execute(); $db->commit(); $stmt = $db->prepare(”SELECT * FROM images"); $stmt->execute(); header("Content-type: image/png"); $row = $stmt->fetch(); print $row['data'] ; } catch( PDOException $e ) { die( $e->getMessage() ); } $db=null; ?> Injection (ang. wtrącanie, wstawianie, intruzja) Przekazywanie całości lub fragmentu danych wprowadzonych przez użytkownika bezpośrednio (bez wcześniejszej analizy) do bazy Miejsce ataku $idPołączenia = pg_connect("port=5431 dbname=bank"); $zapytanie = ”SELECT * FROM users WHERE login=‘$_GET[login]’ AND pass=‘$_GET[pass]’ ”; $idWyniku = pg_query($idPołączenia,$zapytanie); if(!$idWyniku) { echo "Błąd!!!\n"; exit; } $lcount = pg_num_rows($idWyniku) ; if($lcount != 0) { echo ‘zalogowano’; } else { echo ‘błędny login lub hasło’; } pg_close($idPołączenia); login byleCo hasło ‘ or ‘‘ = ‘ SELECT * FROM users WHERE login=’byleCo’ AND pass=’’ or ’’ = ’’ równoważne SELECT * FROM users Strona WWW Zapytanie login ‘;delete from users-- hasło Strona WWW SELECT * FROM users WHERE login=’’; delete from users-- AND pass=’’ równoważne SELECT * FROM users WHERE login=’’; delete from users Zapytanie Zasada minimum przywilejów Sprawdzanie typu danych typu (np. funkcje is_numeric(), ctype_digit(), ...) Ewentualna konwersja (settype()), reprezentacja liczbowa (sprintf()) Wstawienie sekwencji Escape (*_escape_string(), ...) Brak informacji o strukturze BD Występuje średnik lub podwójny minus - Ignoruj zapytanie Haszowanie Tworzenie „ciasteczka” int setcookie (string nazwa [, string wartość [, int okresWażności [, string ścieżka [, string domena [, int secure]]]]]) Odbieranie „ciasteczka” _COOKIE <?php setcookie(”TestCookie", "1", time()+3600*3); /* wysyła cookie na komputer użytkownika okres ważności „ciasteczka” - 3 godziny*/ ?> <html> ... <body> <?php echo $_COOKIE["TestCookie"]; ?> ... session_start(void) SID session_start(); if(!isset($_SESSION[‘licznik'])){ $_SESSION[‘licznik'] = 0; } else { $_SESSION[‘licznik']++; } echo ”Liczba odwiedzin=” . $_SESSION[‘licznik'] . ”<br>"; ?> <!– jeśli przeglądarka nie obsługuje ciasteczek - -> <a href=”skrypt.php?<? echo SID; ?>">następna</a> //odrejestrowanie zmiennej ‘licznik’ //unset($_SESSION[‘licznik']); skrypt.php serialize() __sleep() unserialize() __wakeup() mail ($adresat, $tytuł, $wiadomość [, $dodatkowe_nagłówki [, $dodatkowe_parametry]]) Przykład $wiadomosc = <<< KONIEC Serdeczne pozdrowienia przesyła .. KONIEC; mail (”[email protected]”, ”Pozdrowienia”, $wiadomosc); <?php Źródło: http://www.webdiary.pl/ $charset = „iso-8859-2"; $to = ‘[email protected]'; $subject = ‘żółw'; $encoded_subject = "=?$charset?B?".base64_encode($subject)."?=\r\n"; $message = ‘żółw'; $header .= "X-Mailer: Cokolwiek\r\n"; $header .= "Return-Path: [email protected]\r\n"; $header .= "MIME-Version: 1.0\r\n"; $header .= "From: Jan Kowalski <[email protected]>\r\n"; $header .= "X-Accept-Language: pl\r\n"; $header .= "Content-Type: text/plain; charset={$charset}\r\n"; $header .= "Content-Transfer-Encoding: 8bit\r\n"; if(!mail($to, $encoded_subject, $message, $header)) { echo "Error: Message not sent"; }else { echo "Message sent successfully!"; } ?> <?php Źródło: http://www.finalwebsites.com/ $file = $path.$filename; $file_size = filesize($file); $handle = fopen($file, "r"); $content = fread($handle, $file_size); fclose($handle); $content = chunk_split(base64_encode($content)); $uid = md5(uniqid(time())); $name = basename($file); $header = "From: ”Jan Kowalski <[email protected]>\r\n"; $header .= "MIME-Version: 1.0\r\n"; $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n"; $header .= "This is a multi-part message in MIME format.\r\n"; $header .= "--".$uid."\r\n"; $header .= "Content-type:text/plain; charset=utf-8\r\n"; $header .= "Content-Transfer-Encoding: 8bit\r\n\r\n"; $header .= $message."\r\n\r\n"; #treść maila $header .= "--".$uid."\r\n"; $header .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"; $header .= "Content-Transfer-Encoding: base64\r\n"; $header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n"; $header .= $content."\r\n\r\n"; $header .= "--".$uid."--"; mail(”[email protected]”, ”Tytul”, "", $header); ?> <?php if (!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authenticate: Basic realm=”Autoryzacja” ’); header('HTTP/1.0 401 Unauthorized'); echo ‘Naciśnięto przycisk Anuluj'; exit; } else { echo "<p>Witaj {$_SERVER['PHP_AUTH_USER']}.</p>"; echo "<p>Wprowadziłeś hasło{$_SERVER['PHP_AUTH_PW']}</p>"; } ?> <?php # użyto opcji „--with-gd” $image = imagecreate(400, 300); $bg = imagecolorallocate($image, 0, 0, 0); $col_ellipse = imagecolorallocate($image, 255, 255, 255); $textcolor = imagecolorallocate($image, 0, 0, 255); imageellipse($image, 200, 150, 300, 200, $col_ellipse); $y=imagesy($image); $x=imagesx($image); imagestring($image, 5, $x/2, $y/2, "Hello", $textcolor); header("Content-type: image/png"); imagepng($image); ?> <?php # użyto opcji „--with-gd” $image = imagecreate(400, 300); $bg = imagecolorallocate($image, 0, 0, 0); $col_ellipse = imagecolorallocate($image, 255, 255, 255); $textcolor = imagecolorallocate($image, 0, 0, 255); imageellipse($image, 200, 150, 300, 200, $col_ellipse); $y=imagesy($image); $x=imagesx($image); imagestring($image, 5, $x/2, $y/2, "Hello", $textcolor); header("Content-type: image/png"); imagepng($image); ?> <?php # użyto opcji „--with-gd” $image = imagecreate(400, 300); $bg = imagecolorallocate($image, 0, 0, 0); $col_ellipse = imagecolorallocate($image, 255, 255, 255); $textcolor = imagecolorallocate($image, 0, 0, 255); imageellipse($image, 200, 150, 300, 200, $col_ellipse); $y=imagesy($image); $x=imagesx($image); imagestring($image, 5, $x/2, $y/2, "Hello", $textcolor); header("Content-type: image/png"); imagepng($image); ?> <?php # użyto opcji „--with-gd” $image = imagecreate(400, 300); $bg = imagecolorallocate($image, 0, 0, 0); $col_ellipse = imagecolorallocate($image, 255, 255, 255); $textcolor = imagecolorallocate($image, 0, 0, 255); imageellipse($image, 200, 150, 300, 200, $col_ellipse); $y=imagesy($image); $x=imagesx($image); imagestring($image, 5, $x/2, $y/2, "Hello", $textcolor); header("Content-type: image/png"); imagepng($image); ?> <?php # użyto opcji „--with-gd” $image = imagecreate(400, 300); $bg = imagecolorallocate($image, 0, 0, 0); $col_ellipse = imagecolorallocate($image, 255, 255, 255); $textcolor = imagecolorallocate($image, 0, 0, 255); imageellipse($image, 200, 150, 300, 200, $col_ellipse); $y=imagesy($image); $x=imagesx($image); imagestring($image, 5, $x/2, $y/2, "Hello", $textcolor); header("Content-type: image/png"); imagepng($image); ?> <?php # użyto opcji „--with-gd” $image = imagecreate(400, 300); $bg = imagecolorallocate($image, 0, 0, 0); $col_ellipse = imagecolorallocate($image, 255, 255, 255); $textcolor = imagecolorallocate($image, 0, 0, 255); imageellipse($image, 200, 150, 300, 200, $col_ellipse); $y=imagesy($image); $x=imagesx($image); imagestring($image, 5, $x/2, $y/2, "Hello", $textcolor); header("Content-type: image/png"); imagepng($image); ?> <?php # użyto opcji „--with-gd” $image = imagecreate(400, 300); $bg = imagecolorallocate($image, 0, 0, 0); $col_ellipse = imagecolorallocate($image, 255, 255, 255); $textcolor = imagecolorallocate($image, 0, 0, 255); imageellipse($image, 200, 150, 300, 200, $col_ellipse); $y=imagesy($image); $x=imagesx($image); imagestring($image, 5, $x/2, $y/2, "Hello", $textcolor); header("Content-type: image/png"); imagepng($image); ?> <?php # użyto opcji „--with-gd” $image = imagecreate(400, 300); $bg = imagecolorallocate($image, 0, 0, 0); $col_ellipse = imagecolorallocate($image, 255, 255, 255); $textcolor = imagecolorallocate($image, 0, 0, 255); imageellipse($image, 200, 150, 300, 200, $col_ellipse); $y=imagesy($image); $x=imagesx($image); imagestring($image, 5, $x/2, $y/2, "Hello", $textcolor); header("Content-type: image/png"); imagepng($image); ?> class Auto{ public $akcja; function __construct() { $this -> akcja = start; $this -> wykonaj(); } function wykonaj() { echo "Silnik " . $this -> akcja . "<br>"; } } class Auto{ public $akcja; function __destruct() { $this -> akcja = stop; $this -> wykonaj(); } function wykonaj() { echo "Silnik " . $this -> akcja . "<br>"; } } class Komputer{ public $procesor; public $id; function __clone() { $this->procesor = $this->procesor; $this->id = $this->id+1; } } $komp1 = new Komputer; $komp2 = clone $komp1; interface Throwable { public function getMessage(); } class MyException implements Throwable { public function getMessage() { // ... } } Class MojaKlasa{ private $txt = tekst\n"; public function pisz(){ print Wypisuje . $this->txt; } } $obj=new MojaKlasa(); $obj->pisz(); //Wypisuje tekst print $obj->txt; //Błąd abstract class KlasaAbstrakcyjna { abstract public function test(); } class ImplementacjaKlasy extends KlasaAbstrakcyjna { public function test() { echo Wywo ano ImplementacjaKlasy::test().\n"; } } $o = new ImplementacjaKlasy; $o->test(); class A{ static $zmiennaStatyczna = 5; public $zmienna = 'bla bla'; public static function metodaStatyczna() { // ... } } print A::$zmiennaStatyczna; A::metodaStatyczna(); function pisz(NazwaKlasy $object) { // ... } class A { final class A { final function f() { // Definicja klasy // ... } } } // poni sza linia jest b dna // class B extends A {} class A { const sta a = sta a"; } echo A::sta a = " . A::sta a . "\n"; class Komputer { public $procesor; public function wstaw($mojprocesor) { if ( $this -> procesor != $mojprocesor ) { throw new Exception("Nie mam takiego procesora."); } else { echo Zamontowano procesor $mojprocesor "; } } } $komp = new Komputer; $komp -> procesor = 486'; try { $komp -> wstaw(789'); } catch (Exception $e) { echo $e -> getMessage(); } class Kolo { function ksztalty($fig) { function rysuj() { switch ($fig) { print Kolo\n"; case Kolo": } return new Kolo(); } case Kwadrat": return new Kwadrat(); class Kwadrat { function rysuj() { print Kwadrat\n"; } } } } ksztalty(Kolo")->rysuj(); ksztalty(Kwadrat")->rysuj(); class Klasa { } $a = new Klasa; if ($a instanceof Klasa) { echo Witaj"; } function mojaFunkcja(&$zm = null) { if ($zm= = = null) { die("$zm musi mie } } warto"); function __autoload($nazwaKlasy) { include_once $nazwaKlasy . ".php"; } $obiekt = new Klasa; class A { function __call($nazwa, $parametry) { echo "Wywoae/a metod $nazwa"; } } $obj = new A; $obj -> jakasmetoda(); class A { function __get($nazwa) { echo "Próbujesz uzyska dostp do zmiennej $nazwa."; } } $obj = new A; echo $obj -> zmienna; class A { function __set($nazwa,$wartosc) { echo "Próbujesz przypisa $nazwa warto $wartosc."; } } $obj = new A; $obj -> zmienna=aaa; class A{ function __toString() { return Cokolwiek"; } } $obj = new A; $str = (string) $obj; // wywo ywana jest __toString() echo $obj; // wywo ywana jest __toString() class A { function Pokaz() { echo __FILE__ . '(' . __LINE__ . ')' . __METHOD__; } } function Test() { echo __FILE__ . '(' . __LINE__ . ')' . __METHOD__; } class A { var $x = 1; var $y = 2; } $obj = new A; foreach ($obj as $nazwaWlasnosci => $wartoscWlasnosci) { //rób co } class A { private $własności = array("a" => 1); private function __isset($nazwa){ echo "Wywołałeś isset() dla własności '$nazwa‘ "; return isset($this->własności[$nazwa]); } private function __unset($nazwa){ echo "Wywołałeś unset() dla własności '$nazwa'\n"; unset($this->własności[$nazwa]); } } $obj=new A; var_dump(isset($obj->a)); //Wywołałeś isset() dla własności ‘a’ bool(true) var_dump(isset($obj->z)); //Wywołałeś isset() dla własności ‘z’ bool(false) unset($obj->a); //Wywołałeś unset() dla własności ‘a’ var_dump(isset($obj->a)); //Wywołałeś isset() dla własności ‘a’ bool(false) class A {public $zmienna1; public $zmienna2;} $a =new A; A::__set_state(array( $a->zmienna1=1; ‘zmienna1’ =>1, $a->zmienna2=2; ‘zmienna2’=>2, var_export($a); )) class B { public $zmienna1; public $zmienna2; public static function __set_state($tablica) { foreach ($tablica as $klucz => $wartość) echo "$klucz: $wartość\n"; } } $b =new B; $b->zmienna1=1; zmienna1: 1 $b->zmienna2=2; eval( var_export($b, true) . ';'); zmienna2: 2 Elementy składowe Patch Rozszerzenie Źródła http://www.hardened-php.net/suhosin/ Unicode register_globals safe_mode magic_quotes PECL Skoki Konstruktory ... PHP 5.3 Rozszerzenia Phar, intl i sqlite3 Natywny sterownik mysql Metoda magiczna „__callStatic()” Przestrzenie nazw Odwoływanie się do metod statycznych (Late Static Bindings) Funkcje anonimowe ... PHP 5.3 – metoda „__callStatic()” class MethodTest { public function __call($name, $arguments) { echo "Calling object method '$name' " . implode(', ', $arguments). "\n"; } public static function __callStatic($name, $arguments) { echo "Calling static method '$name' " . implode(', ', $arguments). "\n"; } } $obj = new MethodTest; $obj->runTest('in object context'); #Wynik: Calling object method 'runTest' in object context MethodTest::runTest('in static context'); #Wynik: Calling static method 'runTest' in static context PHP 5.3 – przestrzenie nazw namespace MyProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } namespace { // global code session_start(); $a = MyProject\connect(); echo MyProject\Connection::start(); } PHP 5.3- Late Static Bindings class A { public static function who() { echo __CLASS__; } public static function test() { self::who(); #Wynik: A static::who(); #Wynik: B } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); PHP 5.3 – funkcje anonimowe echo preg_replace_callback('~-([a-z])~', function ($match) { return strtoupper($match[1]); }, 'hello-world'); // Wynik: helloWorld Optymalizacja dostępu do bazy danych Optymalizacja kodu PHP Optymalizacja struktury baz danych i zapytań SQL Cachowanie wyników zapytań do bazy danych Ustatecznianie dynamicznych stron WWW Optymalizacja kodu HTML Ciasteczka Sesje //sprawdzanie czy użytkownik podał prawidłowy login i hasło ... if(!$znaleziono_uzytkownika) { header('Location: bledne_dane.php'); // strona z błędem logowania } else { session_start(); //uruchomienie mechanizmu sesji PRZED dodaniem danych $dane = mysql_fetch_row($wynik); // pobranie danych do tablicy $_SESSION['imie'] = $dane['imie']; $_SESSION['nazwisko'] = $dane['nazwisko']; $_SESSION['email'] = $dane['email']; mysql_close(); header('Location: witaj_uzytkowniku.php'); } Nieoptymalnie Optymalnie $liczba++ ++$liczba print() echo() if (strlen($zmienna)<=5) if (!isset($zmienna{5})) in_array(audi, $samochody) if elseif else isset($samochody[Audi]) switch include(plik.php); include(./plik.php); Instrukcja „switch” kontra „if” Kod PHP #1 Kod PHP #2 <?php $liczba = 3; <?php $liczba = 3; if ($liczba==1) { echo 'Jeden'; } elseif ($liczba==2) { echo 'Dwa'; } elseif ($liczba==3) { echo 'Trzy'; } else { echo 'Inna liczba ni 1-3'; } ?> switch ($liczba) { case "1": echo 'Jeden'; break; case "2": echo 'Dwa'; break; case "3": echo 'Trzy'; break; default: echo 'Inna liczba ni 1-3'; } ?> break; ilość powtórzeń testu: 1000, ilość iteracji w każdym powtórzeniu: 100, dokładność: 4 Statystyka wykonania kodu 1 Statystyka wykonania kodu 2 czny czas iteracji kodu: 3.2079 sek. redni czas jednej iteracji: 0.0032079 sek. Udzia procentowy: 53.4891%. czny czas iteracji kodu: 2.7894 sek. redni czas jednej iteracji: 0.0027894 sek. Udzia procentowy: 46.5109%. Funkcja „in_array()” kontra „isset()„ Kod PHP #1 Kod PHP #2 <?php require("nazwiska.php"); <?php require("nazwiska.php"); $a = in_array("Nowak",$nazwisko); $a = isset($nazwisko['Nowak']); ?> ?> ilość powtórzeń testu: 1000, ilość iteracji w każdym powtórzeniu: 100, dokładność: 10, 11 kb danych Statystyka wykonania kodu 1 Statystyka wykonania kodu 2 czny czas iteracji kodu: 50.5912399292 czny czas iteracji kodu: 1.8864305019 sek. redni czas jednej iteracji: 0.18864305019 sek. Udzia procentowy: 3.5947298849%. sek. redni czas jednej iteracji: 5.05912399292 sek. Udzia procentowy: 96.4052701151%. Funkcja „strlen()” kontra „isset()” Kod PHP #1 Kod PHP #2 <?php $zmienna = 'Lorem ipsum'; <?php $zmienna = 'Lorem ipsum'; if (strlen($zmienna)<=5){ echo "Wpisz przynajmniej 6 znaków "; }else { echo "Jest wicej niz 6 znaków"; } ?> if (!isset($zmienna{5})){ echo "Wpisz przynajmniej 6 znaków"; }else{ echo "Jest wicej niz 6 znaków"; } ?> ilość powtórzeń testu: 1000, ilość iteracji w każdym powtórzeniu: 100, dokładność: 10 Statystyka wykonania kodu 1 Statystyka wykonania kodu 2 czny czas iteracji kodu: 2.73028568 sek. redni czas jednej iteracji: 0.00273028568 czny czas iteracji kodu: 2.64880105 sek. redni czas jednej iteracji: 0.00264880105 sek. Udzia procentowy: 49.24257933%. sek. Udzia procentowy: 50.75742067%. Funkcja „echo()” kontra „print()” Kod PHP #1 Kod PHP #2 <?php echo "Test"; ?> <?php print("Test"); ?> ilość powtórzeń testu: 10000, ilość iteracji w każdym powtórzeniu: 1000, dokładność: 12 Statystyka wykonania kodu 1 Statystyka wykonania kodu 2 czny czas iteracji kodu: 70.4421184063 czny czas iteracji kodu: 75.6718099118 sek. redni czas jednej iteracji: 0.00756718099118 sek. redni czas jednej iteracji: 0.00704421184063 sek. Udzia procentowy: 48.2104062338%. sek. Udzia procentowy: 51.7895937662%. Ograniczenie rozmiaru pól Odpowiednie i potrzebne indeksy Tabele o stałej długości danych Rozdzielenie złożonych tabel na mniejsze Normalizacja? OPTIMIZE TABLE test; SELECT BENCHMARK(10000000, (SELECT 2^NOW())); EXPLAIN SELECT * FROM odbiorcy WHERE id>1 INSERT DELAYED INTO tabela(pole) VALUES(wartość) SELECT imie FROM nazwiska WHERE nazwisko IN($nazw) INSERT INTO tabela(imie,nazwisko) VALUES(„Jan”,”Kowalski”), („Jan”,”Bielecki”) SHOW STATUS LIKE 'Qcache%'; SET SESSION query_cache_type = ‘XXXX’; Metody specjalistyczne Własna metoda Zapisywanie do oddzielnych plików Cache Lite Dynamiczne tworzenie statycznych stron Zastosowanie CSS Kompresja kodu wynikowego Radosław Maciaszek, „SQLite – nowa alternatywa dla baz danych MySQL i PostgreSQL”, http://maciaszek.pl/phpcon/download/sqlite.pdf Podręcznik PHP, http://www.php.net/manual/ M. Bittner, „Aplikacje internetowe wysokiej wydajności”