150
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 ...carme.pld-linux.org/~evil/varia/informatyka/semestr_5/inet/... · Triggery, funkcje i agregaty, obs uguje wi kszo standł

Embed Size (px)

Citation preview

� 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ść %>

<?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.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 = ’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;

$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ść

$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 ł ń

� 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

� $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__

version_compare(PHP_VERSION, "5.0.0", "<") and echo( 'wymagany PHP w wersji, co najmniej, 5.0);

Przyk ad u yciał ż

� $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): instrukcjeendwhile;

do{ instrukcje}while(warunek);

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"));

$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"){   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.� � �

� 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>

<?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'));?>

� Zunifikowane rozszerzenie do obs ugi Baz łDanych

� AdoDB a PDO� PHP 5.1 zawiera PDO

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(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$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();

function pisz(NazwaKlasy $object) {   // ...}

class A {   final function f() {       // ...   }}

final class A {   // 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 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 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 "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

� 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 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

� 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”ś