PHP (PHP: Hypertext Preprocessor) PHP a CGI Dokument HTML z instrukcjami AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps
� PHP (PHP: Hypertext Preprocessor) � PHP a CGI� Dokument HTML z instrukcjami
AddType application/x-httpd-php .phpAddType 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ść %>
� 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.2341.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 = <<<KONIEC
Ala
ma kota
KONIEC;
$tekst = <<<'KONIEC'
Ala
ma kota
KONIEC;
Heredoc 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+3Liczba = $liczba+3
He drunk some Heinekens
Warto =Array[0]śćWarto =62ść
Warto =4mmść
� Klucz liczba ca kowita nieujemnała cuch znaków ł ń
� Tworzeniearray() 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);
‘Ala’ ‘ma’ ‘kota’
0 1 2
1 67
‘liczba2’‘liczba1’
wartość
klucz
klucz
wartość
”8”�8” �08” ”08”
�float int�False 0�True 1�NULL ””
� 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
� $_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}
� Definiowanie
define(”LICZBA_PI”,3.1415926);
define(”LICZBA_PI”,3.1415);// B dłą� Dost pę
echo LICZBA_PI;
� __LINE__� PHP_VERSION� __CLASS__� __FUNCTION__
version_compare(PHP_VERSION, "5.0.0", "<") and echo( 'wymagany PHP w wersji, co najmniej, 5.0);
Przyk ad u yciał ż
� $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;
for(wyra enież 1;wyra enież 2 ;wyra enież 3){instrukcje}
for(wyra enież 1;wyra enież 2 ;wyra enież 3) :instrukcjeendfor;
� 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 parzysteecho ”$i ”;
}
0 2 4 6 8
� Tworzeniefunction 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"));
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"){ return �Robi pizz rozmiar $rozmiar typu $typ.\n";� �}echo robPizza ();echo robPizza (� rednia�);�echo robPizza (� rednia�,�peperone�);�
Robi pizz rozmiar typu Bolonia.� �Robi pizz rozmiar rednia typu Bolonia.� � �Robi pizz rozmiar rednia typu peperone.� � �
<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>
<?phpecho $_GET[”imie"]; //wy wietli „Jan”ś?>
skrypt.php
Dokument HTML
akceptuj.xakceptuj_x
� $_FILES[‘plik']['name'] � $_FILES[‘plik']['type'] � $_FILES[‘plik']['size'] � $_FILES[‘plik']['tmp_name']� $_FILES[‘plik']['error']
<form enctype="multipart/form-data" method=”POST”… > <input type="hidden" name="MAX_FILE_SIZE" value=”20000" > <input name=”plik" type="file" > …</form>
$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)� 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
Tylko 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);
<?phpfunction 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 123sqlite_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'));?>
Sterownik Obs ugiwane BD�DBLIB FreeTDS / Microsoft SQL
Server / SysbaseFIREBIRD Firebird / Interbase 6MYSQL MySQL 3.x/4.0OCI Oracle Call InterfaceODBC ODBC v3 (IBM DB2 i
unixODBCPGSQL PostgreSQLSQLITE SQLITE 3.x
Sterownik DSNDBLIB sysbase:host=localhost; dbname=testdb
mssql:host=localhost; dbname=testdbFIREBIRD firebird:User=john;Password=mypass;Dabase=D
ATABASE.GDE;DataSource=localhost;Port=3050
MYSQL mysql:host=localhost;dbname=testdbOCI oci:mydb
oci:dbname=//localhost:1521/testdbODBC odbc:DSN=SAMPLE;UID=john;PWD=mypassPGSQL pgsql:host=localhost port=5432 dbname=testdb
user=john password=mypassSQLITE sqlite:/path/to/database
sqlite::memory:
<?phptry{$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 );?>
<?phptry{$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 );?>
<?phptry{$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 );?>
<?phptry{$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 );?>
<?phptry{$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 );?>
<?phptry{ $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);łą
byleCologin
has o ł ‘ or ‘‘ = ‘
Strona WWW
SELECT * FROM users WHERE login=’byleCo’ AND pass=’’ or ’’ = ’’
Zapytanie
SELECT * FROM users
równowa neż
‘;delete from users--login
has o ł
Strona WWW
SELECT * FROM users WHERE login=’’;delete from users-- AND pass=’’
Zapytanie
SELECT * FROM users WHERE login=’’;delete from users
równowa neż
� 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
<?phpsetcookie(”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();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
mail ($adresat, $tytu , $wiadomo ł ść [, $dodatkowe_nag ówki ł[, $dodatkowe_parametry]])
� Przyk adł$wiadomosc = <<< KONIEC
Serdeczne pozdrowienia
przesy a ..ł
KONIEC;
mail (”[email protected]”, ”Pozdrowienia”, $wiadomosc);
<?php$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!";} ?>
ród o: http://www.webdiary.pl/Ź ł
<?php $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); ?>
ród o: http://www.finalwebsites.com/Ź ł
<?phpif (!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 tekstprint $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();
class A { final function f() { // ... }}
final class A { // Definicja klasy}
// poni sza linia jest b dna� ��// class B extends A {}
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 rysuj() { print �Kolo\n"; }} class Kwadrat { function rysuj() { print �Kwadrat\n"; }}
function ksztalty($fig) { switch ($fig) { case �Kolo": return new Kolo(); case �Kwadrat": return new Kwadrat(); }}
ksztalty(�Kolo")->rysuj();ksztalty(�Kwadrat")->rysuj();
class A { function __call($nazwa, $parametry) {
� � � � � echo "Wywo a e /a metod $nazwa"; } }
$obj = new A; $obj -> jakasmetoda();
class A { function __get($nazwa) {
ó � � echo "Pr bujesz uzyska dost p 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->zmienna1=1;$a->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;$b->zmienna2=2;eval( var_export($b, true) . ';');
A::__set_state(array(‘zmienna1’ =>1,‘zmienna2’=>2,))
zmienna1: 1zmienna2: 2
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 contextMethodTest::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: Astatic::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)
isset($samochody[�Audi�])
if � elseif � else switch
include(�plik.php�); include(�./plik.php�);
Instrukcja „switch” kontra „if”Kod PHP #1
<?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'� ; } ?>
Kod PHP #2
<?php$liczba = 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;}?>
Statystyka wykonania kodu 1
czny czas iteracji kodu: �� 3.2079 sek.redni czas jednej iteracji: � 0.0032079 sek.
Udzia procentowy: � 53.4891%.
Statystyka wykonania kodu 2
czny czas iteracji kodu: �� 2.7894 sek.redni czas jednej iteracji: � 0.0027894 sek.
Udzia procentowy: � 46.5109%.
ilo powtórze testu: 1000, ilo iteracji w ka dym powtórzeniu: 100, dok adno : 4ść ń ść ż ł ść
Funkcja „in_array()” kontra
„isset()„
Kod PHP #1
<?phprequire("nazwiska.php");
$a = in_array("Nowak",$nazwisko);
?>
Kod PHP #2
<?phprequire("nazwiska.php");
$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
czny czas iteracji kodu: �� 50.5912399292 sek.
redni czas jednej iteracji: � 5.05912399292 sek.Udzia procentowy: � 96.4052701151%.
Statystyka wykonania kodu 2
czny czas iteracji kodu: �� 1.8864305019 sek.redni czas jednej iteracji: � 0.18864305019 sek.
Udzia procentowy: � 3.5947298849%.
Funkcja „strlen()” kontra
„isset()”
Kod PHP #1
<?php$zmienna = 'Lorem ipsum';
if (strlen($zmienna)<=5){ echo "Wpisz przynajmniej 6 znaków"; }else { echo "Jest wi cej niz 6 znaków"� ; } ?>
Kod PHP #2
<?php$zmienna = 'Lorem ipsum';
if (!isset($zmienna{5})){ echo "Wpisz przynajmniej 6 znaków"; }else{ echo "Jest wi cej niz 6 znaków"� ; } ?>
ilo powtórze testu: 1000, ilo iteracji w ka dym powtórzeniu: 100, dok adno : 10ść ń ść ż ł ść
Statystyka wykonania kodu 1
czny czas iteracji kodu: �� 2.73028568 sek.redni czas jednej iteracji: � 0.00273028568
sek.Udzia procentowy: � 50.75742067%.
Statystyka wykonania kodu 2
czny czas iteracji kodu: �� 2.64880105 sek.redni czas jednej iteracji: � 0.00264880105 sek.
Udzia procentowy: � 49.24257933%.
Funkcja „echo()” kontra
„print()”
Kod PHP #1
<?phpecho "Test";?>
Kod PHP #2
<?phpprint("Test");?>
ilo powtórze testu: 10000, ilo iteracji w ka dym powtórzeniu: 1000, dok adno : 12ść ń ść ż ł ść
Statystyka wykonania kodu 1
czny czas iteracji kodu: �� 70.4421184063 sek.
redni czas jednej iteracji: �0.00704421184063 sek.Udzia procentowy: � 48.2104062338%.
Statystyka wykonania kodu 2
czny czas iteracji kodu: �� 75.6718099118 sek.redni czas jednej iteracji: � 0.00756718099118
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