j zyk php -...
TRANSCRIPT
J zyk PHP��PHP (PHP: Hypert ext Preprocessor) �PHP a CGI�Dokum ent HTML z inst rukcjam i
AddType application/x-httpd-php .phpAddType application/x-httpd-php-source .phps
J zyk PHP c.d.�
� Obs ugiwane BD, �IBM DB2, Inform ix, Ingres, InterBase, Front Base, mSQL, Direct MS-SQL, MySQL, ODBC, Oracle (OCI7 i OCI8), Ovrimos, PostgreSQL, Solid, Sysbase, Velocis, Unix dbm, ...
� Obs ugiwane protoko y: � �IMAPPOP3HTTP...
PHP - przyk adowy program�<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>
Umieszczanie skryptu PHP
�< ?php t re skryptu�� ?>�< ? t re skryptu�� ?>�< script language= "php"> t re ��
skryptu< /script>� < % t re skryptu�� %>
Instrukcje
< ?phpInst rukcja1;Inst rukcja2;..Inst rukcjaN
?>
Komentarze
// jestem komentarzem# jestem komentarzem/* jestem komentarzem */
Typy zmiennych
� Logiczny (boolean)� Ca kowity (integer)�� Rzeczywisty (f loat )� Napisowy (st ring)� Tablica (array)� Obiekt (object )� Zasób (resource)� NULL
Typ logiczny
�Przy jm owane warto ci: True lub �False
Case-insensit ive�Konwertowanie na typ logiczny
(bool)(boolean)
Typ ca kowity�� Notacje:
Dziesi tkowa - � 1234Heksadecymalna - 0x1AOktalna � 0123
� Konwertowanie na typ ca kowit y�(int )(integer)
$liczba1 = 2147483647;$liczba2 = 2147483648;var_dump($liczba1);// wypisze: int(2147483647)var_dump($liczba2);// wypisze: float(2147483648)
Typ rzeczywisty
�Przyk adowe warto ci� �1.2341.2e3 //1.2 * 103
7E-10 //7 * 10-10
�Konwertowanie na typ rzeczywisty(f loat )(double)(real)
Typ napisowy
�256 ró nych warto ci� ��Tworzenie a cucha znaków� �
� tekst �� tekst �Sk adnia heredoc�Sk adnia newdoc�
�Konwertowanie na typ napisowy(st ring)st rval()
�tekst�
� \�� \\
$tekst = �ab\\c\�d\n�;echo $tekst; //wypisze: ab\c�d\n
�tekst�
� \n� \r� \x[ 0-9A-Fa-f] { 1,2}
� \�� \\ � \$ � \[0-7] { 1,3} � \t
Sk adnia 'heredoc' oraz 'newdoc'�
$tekst = <<<KONIECAlama kotaKONIEC;
$tekst = <<<'KONIEC'Alama kotaKONIEC;
Heredoc Newdoc (PHP 5.3)
Parsowanie zmiennych$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 drunks some Heinekens
Warto =Array[0]��Warto =62��
Warto =4mm��
Indeksowanie a cucha� �
$tekst = �Ala ma kota�;echo $tekst[1]; //wypisze �l�
czenie a cuchów�� � �
$tekst = �Ala� . � ma� . � kota�;echo $tekst; //wypisze �Ala ma kota�
Konwersja a cuchów na posta � � �liczbow�
� � .� , � e� lub � E� � typ rzeczywisty�Brak � .� , � e� lub � E� � typ
ca kowity�� � 22a� �22� � a22� � 0
a cuchy � wybrane funkcje� �
�st rlen()�st rst r(), st rist r()�print (), echo()�explode(), split ()
Tablica
�Klucz liczba ca kowita nieujem na�a cuch znaków � �
�Tworzeniearray() Tablica[klucz]= warto��
�Konwertowanie(array)
Przyk ad tworzenia tablic�$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 ���
Tablice - wybrane funkcje
�count ()�next ()�prev()�end()�current ()�sort (), asort (), arsort (), ksort (),
krsort (), uasort (), usort (), uksort ()
Tablice wielowymiarowe$tab[�liczba�][1] = 62;//$tab = array ( �liczba" => array ( 1 => 62)); echo "Warto = {$tab[�liczba�][1]}�;��
Klasyclass 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; } }
Klasy - dziedziczenieclass MojaKlasa{ ... }
class MojaKlasa2 extends MojaKlasa{ var $r;
function metoda2 ($arg1, $arg2){
$this->r = $arg1 + $arg2; }}
ObiektyClass MojaKlasa{
//zawarto klasy taka jak na pop. slajdzie��}
$obiekt = new MojaKlasa;$obiekt-> metoda(2,2);/*********************/$obj = (object) �abc�;echo $obj->scalar; //wypisze �abc�
Konstruktory 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
Odwo ania do klasy�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
Zmienne
�$zm ienna = warto���Case Sensit ive
Predefiniowane zmienne
� $_SERVER� $_ENV� $_COOKIE� $_GET� $_POST� $_FILES� $_REQUEST� $_SESSION� $GLOBALS� $php_errormsg
Zmienna zmienna
� Przyk ad�$a = "hello" ;$$a = "world";echo "$a ${ $a} "; // � echo "$a $hello";//wy wiet li: � hello world
� Zm ienne zm ienne jako tablice${ $a} [1] ${ $a[1] }${ $_GET}
Zmienne � wybrane funkcje
�get type()� is_array(), is_float (), is_int (),
is_object (), is_st ring(), �
Sta e�
� Definiowaniedefine(�LICZBA_PI�,3.1415926);define(�LICZBA_PI�,3.1415);// B d��
� Dost p�echo LICZBA_PI;
Predefiniowane sta e�
�__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� �
Operatory arytmetyczne
�$a + $b�$a - $b�$a * $b�$a / $b�$a % $b
Operatory bitowe
�$a & $b�$a | $b�$a ^ $b�~ $a�$a < < $b�$a > > $b
Operatory porównania
� $a = = $b � $a = = = $b � $a ! = $b � $a < > $b � $a ! = = $b � $a < $b � $a > $b� $a < = $b� $a > = $b
Operatory logiczne
�$a && $b�$a and $b �$a || $b�$a or $b �$a xor $b � ! $a
Operatory przypisania
�$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
Instrukcja warunkowaif(warunek1) {
instrukcje1
}elseif(warunek2) {
instrukcje2
}...else {
instrukcjen
}
if(warunek1) :instrukcje1
elseif(warunek2) :instrukcje2
...else:
instrukcjen
endif;
Instrukcja wyboruswitch(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;
Instrukcja �while�
while(warunek){ instrukcje}
while(warunek): instrukcjeendwhile;
Instrukcja �do�
do{ instrukcje}while(warunek);
Instrukcja �for�
for(wyra enie� 1;wyra enie� 2 ;wyra enie� 3){instrukcje}
for(wyra enie� 1;wyra enie� 2 ;wyra enie� 3) :instrukcjeendfor;
Instrukcja �foreach�
�Sk adnia�foreach($tablica as $warto ) {instrukcje}��foreach($tablica as $klucz => $warto ) {instrukcje}��
�foreach� - przyk ad 1�$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�� ��
�foreach� - przyk ad 2�$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
Instrukcja �break� $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;
} }
Instrukcja �continue�
for($i = 0 ; $i < 10 ; $i++){if (($i % 2) != 0)
// przeskocz nieparzyste continue;
//wypisz parzysteecho �$i �;
}
0 2 4 6 8
Funkcje
�Tworzeniefunction fun ($arg_1, $arg_2, ..., $arg_n) {
echo �Przyk adowa funkcja.\n"; �return $wartosc;
}�Wywo ywanie �fun (wart1, wart2, ..., $wartn)
Funkcje ze zmienn liczb � �argumentów
funct ion 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);
Zmienne funkcjefunction fun($arg) {
echo $arg;}$zmienna = �fun�;$zmienna(1); //wywo anie funkcji �fun��call_user_func(� fun' , 1); //wywo anie funkcji �fun��
Zmienne w funkcjach$a = 5; function Test() {
//global $a;echo $a;
} Test(); // wbrew pozorom NIE wy wietli si 5 � �
Zmienne w funkcjach c.d.
function Test() { $a = 0;$a++;echo $a;
} Test(); //wypisze si 1�Test(); //wypisze si 1 �
Zmienne w funkcjach c.d.function Test() {
static $a = 0;$a++;echo $a;
} Test(); //wypisze si 1�Test(); //wypisze si 2 �
Zwracanie warto ci w funkcji�function f(){
return 5;echo("Ten tekst si nie wy wietli");� �
}
funct ion & zwrocReferencje(){ return $jakasref;}
$nowaref = & zwrocReferencje();
Przekazywanie argumentów
$a=2;function f($arg){
$arg++;}fun($a);echo $a;//wypisze 2
$a=2;function f(&$arg){
$arg++;}fun($a);echo $a;//wypisze 3
Argumenty domy lne�
funct ion robPizza ($rozmiar,$typ = � Bolonia"){ return � Robi pizz rozmiar $rozm iar t ypu $typ.\n" ;� �}echo robPizza ();echo robPizza (� rednia� );�echo robPizza (� rednia� ,� peperone� );�
Robi pizz rozm iar typu Bolonia.� �Robi pizz rozm iar rednia typu Bolonia.� � �Robi pizz rozm iar rednia typu peperone.� � �
Obs uga formularzy�
�Metoda � GET� � $_GET �Metoda � POST� �$_POST�Nazwa pola � klucz
Obs uga formularzy - przyk ad� �
<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
Obs uga pól typu �file��
� $_FILES[ �plik '] [ 'nam e'] � $_FILES[ �plik '] [ ' t ype' ] � $_FILES[ �plik '] [ 'size' ] � $_FILES[ �plik '] [ ' tm p_nam e']� $_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>
Obs uga pól typu FILE - przyk ad� �$max = 1024;if (is_uploaded_f ile($_FILES[ 'plik' ] [ ' tmp_name'] )) { if ($_FILES[ 'plik'] [ 'size' ] > $m ax) { 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'] [ 'tm p_name'] , �/usr/local/apache/htdocs/� . $_FILES[ 'plik'] [ 'name'] ); }}else { echo 'Blad przy przesylaniu danych! ' ;}
Dost p do plików�
� $plik = fopen($nazwa,$t ryb)$tryb = r | r+ | w | w+ | a | a+ | x | x+
� fclose($plik)� $znak = fgetc($plik)� $znaki = fread($plik,$n)� $linia = fgets($plik,$n)� fwrite($plik,$tekst ) � fputs($plik,$t ekst )� f lock($plik,$t ryb)
$tryb = LOCK_EX | LOCK_SH | LOCK_UN
Baza danych SQLite
�Biblioteka C�PHP 5 a SQLit e�Serwer SQLite = Serwer WWW�Autom atyczna synchronizacja
Utworzenie BD - przyk ad�<?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);
Funkcja �sqlite_open()�<?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);
Funkcja �sqlite_query()�<?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);
Pobieranie danych z BD
<?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);
Funkcja �sqlite_num_rows()�
<?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);
Funkcja �sqlite_fetch_array()�
<?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);
Funkcja �sqlite_create_function()�<?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);
Funkcja �sqlite_create_aggegate()�<?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'));?>
PHP Data Objects (PDO)
�Zunifikowane rozszerzenie do obs ugi Baz Danych�
�AdoDB a PDO�PHP 5.1 zawiera PDO
Obs ugiwane BD�Sterownik Obs ugiwane BD�DBLIB FreeTDS / Microsoft SQL
Server / SysbaseFIREBIRD Firebird / Interbase 6MYSQL MySQL 3.x/4.0OCI Oracle Call Int erfaceODBC ODBC v3 (IBM DB2 i
unixODBCPGSQL PostgreSQLSQLITE SQLITE 3.x
Data Source Name (DSN)Sterownik DSNDBLIB sysbase:host= localhost ; dbnam e= testdb
m ssql:host= localhost ; dbname= testdbFIREBIRD firebird:User= john;Password= m ypass;Dabase=
DATABASE.GDE;DataSource= localhost ;Port= 3050
MYSQL m ysql:host= localhost ;dbnam e= t estdbOCI oci:m ydb
oci:dbname= //localhost :1521/test dbODBC odbc:DSN= SAMPLE;UID= john;PWD= mypassPGSQL pgsql:host= localhost port= 5432
dbnam e= testdb user= john password= m ypassSQLITE sqlite:/path/to/database
sqlite::m emory:
U ycie PDO�<?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 );?>
Utworzenie obiektu<?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 );?>
Metoda �setAttribute()�<?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 );?>
Metoda �query()�<?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 );?>
Metody �prepare()�, �bindParam()� oraz �execute()�
<?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 );?>
Przechowywanie obrazu w BD<?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;?>
SQL Injection
� Inject ion (ang. wt r canie, �wstawianie, int ruzja)
�Przekazywanie ca o ci lub � �fragm entu danych wprowadzonych przez u yt kownika bezpo rednio � �(bez wcze niejszej analizy) do bazy �
�Miejsce ataku
Przyk adowy skrypt�$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);��
Przyk ad 1�byleCologin
has o � � or �� = �
Strona WWW
SELECT * FROM users WHERE login=�byleCo� AND pass=�� or �� = ��
Zapytanie
SELECT * FROM users
równowa ne�
Przyk ad 2��;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�
Sposoby obrony
� Zasada m inim um przywilejów� Sprawdzanie typu danych typu (np.
funkcje is_num eric(), ctype_digit () , . . . ) � Ewentualna konwersja (set type()),
reprezentacja l iczbowa (sprint f()) �Wstawienie sekwencji Escape
(*_escape_st ring(), ...)� Brak inform acji o st rukturze BD�Wyst puje rednik lub podwójny m inus - � �
Ignoruj zapytanie � Haszowanie
Obs uga �ciasteczek��
�Tworzenie � ciasteczka� int setcookie (st ring nazwa [ , st r ing warto ��
[ , int okresWa no ci � �[ , st ring cie ka � �
[ , st r ing dom ena [ , int
secure] ] ] ] ] )�Odbieranie � ciasteczka�
_COOKIE
�Ciasteczka� - przyk ad�
<?setcookie(�TestCookie", "1", time()+3600*3); /* wysy a cookie na komputer u ytkownika � �okres wa no ci �ciasteczka� - 3 godziny*/� �?><html>...<body><? echo $TestCookie;echo $_COOKIE["TestCookie"];?>...
Sesje
�session_start (void)�SID
Sesje - przyk ad �
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
Serializacja obiektów
�serialize()__sleep()
�unserialize()__wakeup()
Obiekty w sesjach - przyk ad�
class A { var $zmienna = 1; function wyswietl() { echo $this->zmienna; }}
include('klasa.inc');$a = new A;$s = serialize($a);session_start();$_SESSION['s']=$s;?><!-- je li browser nie obs uguje ciasteczek -->� �<a href="b.php?<? echo SID; ?>">nast pna</a>�
include('klasa.inc');session_start();$a = unserialize($_SESSION['s']);$a-> wyswietl();
a.php
b.phpklasa.inc
Wysy anie poczty�
mail ($adresat, $tytu , $wiadomo � �� [, $dodatkowe_nag ówki �[, $dodatkowe_parametry]])
�Przyk ad�$wiadomosc = <<< KONIECSerdeczne pozdrowieniaprzesy a ..�KONIEC;mail (�[email protected]�, �Pozdrowienia�, $wiadomosc);
Polskie znaki w poczcie$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/� �
Wysy anie za czników� �� $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/� �
Autoryzacja HTTP
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>";� � � }
Tworzenie dynamicznych grafik<?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);?>
Funkcja �imagecreate()�<?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);?>
Funkcja � im agecol oral loca te()�<?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);?>
Funkcja � im ag eel li ps e()�<?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);?>
Funkcje � i mag esx()� i �imagesy()� <?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);?>
Funkcja � im ag es tri ng ()� <?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);?>
Funkcja � hea der()� <?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);?>
Funkcja � im ag ep ng ()� <?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 5 - konstruktoryclass Auto{ public $akcja;
funct ion __const ruct () { $this -> akcja = � start � ; $this -> wykonaj(); } funct ion wykonaj() { echo "Silnik " . $this -> akcja . "< br> " ; } }
PHP 5 - destruktoryclass Auto{ public $akcja;
funct ion __dest ruct () { $this -> akcja = � stop� ; $this -> wykonaj(); } funct ion wykonaj() { echo "Silnik " . $this -> akcja . "< br> " ; } }
PHP 5 - klonowanieclass Komputer{
public $procesor;public $id;
funct ion __clone() {$this-> procesor = $this-> procesor;$this-> id = $this-> id+ 1;
} } $komp1 = new Komputer; $komp2 = clone $kom p1;
PHP 5 - interfejsy
interface Throwable { public funct ion getMessage();}
class MyExcept ion im plements Throwable { public funct ion getMessage() { // ... }}
PHP 5 � PPP (Private, Protected, Public)
Class MojaKlasa{private $txt = � tekst \n";
public funct ion pisz(){print � Wypisuje� . $this-> txt ;
}}$obj=new MojaKlasa();$obj->pisz(); //Wypisuje tekstprint $obj->txt; //B d��
PHP 5 � klasy abstrakcyjneabstract class KlasaAbstrakcyjna { abst ract public funct ion test ();}
class Implement acjaKlasy extends KlasaAbstrakcyjna { public funct ion t est () { echo � Wywo ano Implem entacjaKlasy::test ().\n";� }}
$o = new Im plementacjaKlasy;$o-> test ();
PHP 5 � zmienne, metody statyczne
class A{ stat ic $zm iennaStatyczna = 5; public $zm ienna = 'bla bla' ; public stat ic funct ion m etodaStatyczna() { // ... }}
print A::$zm iennaStatyczna;A::metodaStatyczna();
PHP 5 � okre lanie typów klas�
funct ion pisz(NazwaKlasy $object ) { // ...}
PHP 5 � elementy finalizowane
class A { final funct ion f() { // ... }}
final class A { // Definicja klasy}
// poni sza linia jest b dna� ��// class B extends A { }
PHP 5 - sta e�
class A { const st a a = � sta a";� �}
echo � A::sta a = " . A::sta a . " \n";� �
PHP 5 - wyj tki�class Kom put er { public $procesor;
public funct ion wstaw($mojprocesor) { i f ( $this -> procesor != $mojprocesor ) { throw new Except ion("Nie mam tak iego procesora." ); } else { echo � Zamontowano procesor $mojprocesor " ; } } }
$kom p = new Kom puter; $kom p -> procesor = �486';
t ry { $kom p -> wstaw(�789'); } catch (Except ion $e) { echo $e -> getMessage(); }
PHP 5 � dereferencja obiektówclass Kolo { funct ion rysuj() { print � Kolo\n"; }} class Kwadrat { funct ion rysuj() { print � Kwadrat \n" ; }}
funct ion ksztalty($fig) { switch ($fig) { case � Kolo" : return new Kolo(); case � Kwadrat" : return new Kwadrat (); }}
ksztalty(� Kolo" )-> rysuj();ksztalty(� Kwadrat")-> rysuj();
PHP 5 � s owo kluczowe ��instanceof�
class Klasa { }
$a = new Klasa;
if ($a instanceof Klasa) { echo � Witaj" ;}
PHP 5 � warto domy lna �� �parametrów z referencj�
funct ion m ojaFunkcja(&$zm = null) { if ($zm= = = null) { die("$zm musi m ie warto ");� �� }}
PHP 5 � funkcja �__autoload�
funct ion __autoload($nazwaKlasy) { include_once $nazwaKlasy . " .php";}
$obiekt = new Klasa;
PHP 5 � metoda �__call�class A { funct ion __call($nazwa, $param etry) { echo "Wywo a e /a m etod $nazwa" ; � � � � � } }
$obj = new A; $obj -> jakasm etoda();
PHP 5 � metoda �__get�
class A { funct ion __get($nazwa) { echo "Próbujesz uzyska dost p do zmiennej $nazwa." ; � � } }
$obj = new A; echo $obj -> zm ienna;
PHP 5 � metoda �__set�
class A { funct ion __set($nazwa,$wartosc) { echo "Próbujesz przypisa $nazwa warto $wartosc." ; � �� } }
$obj = new A; $obj -> zm ienna= � aaa� ;
PHP 5 � metoda �__toString�class A{ funct ion __toString() { return � Cokolw iek" ; }}
$obj = new A;
$st r = (st ring) $obj; // wywo ywana jest __toString()�
echo $obj; // wywo ywana jest __t oString()�
PHP 5 � sta a �__METHOD__��class A { funct ion Pokaz() { echo __FILE__ . ' (' . __LINE__ . ') ' . __METHOD__; }}funct ion Test () { echo __FILE__ . '(' . __LINE__ . ' )' . __METHOD__;}
PHP 5 - iteratory
class A { var $x = 1; var $y = 2;}
$obj = new A;
foreach ($obj as $nazwaWlasnosci = > $wart oscWlasnosci) { //rób co �}
PHP 5.1 � metody �__isset� oraz �__unset�
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)� � � � �
PHP 5.1 � metoda �__set_state�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
Suhosin
�Elem enty sk adowe�PatchRozszerzenie
� ród a� �ht tp://www.hardened-php.net /suhosin/
PHP 6
� Unicode� register_globals� safe_m ode� m agic_quotes� PECL� Skoki� Przest rzenie nazw� Konst ruktory � ...
PHP 5.3
�Rozszerzenia Phar, int l i sqlite3�Natywny sterownik m ysql�Metoda m agiczna � __callStat ic()��Przest rzenie nazw�Odwo ywanie si do m etod � �
statycznych (Late Stat ic Bindings) �Funkcje anonim owe� ...
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 aplikacji internetowej
� Optym alizacja dost pu do bazy danych�� Optym alizacja kodu PHP� Optym alizacja st ruktury baz danych i
zapyta SQL�� Cachowanie wyników zapyta do bazy �
danych� Ustatecznianie dynam icznych st ron
WWW� Optym alizacja kodu HTML
Optymalizacja dost pu do BD�
�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');}
Optymalizacja kodu PHP
Nieoptym alnie Optym alnie$liczba+ + + + $liczbaprint () echo()in_array(� audi� ,$sam ochody)
isset ($sam ochody[ �Audi� ] )
include(� plik.php� ); include(� ./plik.php� );
Optymalizacja kodu PHP c.d.
Nieoptymalne Optymalneif (st r len($zm ienna)< = 5) { echo "Wpisz przynajm niej 6 znaków"; }
if (! isset($zmienna{ 5} )) { echo "Wpisz przynajm niej 6 znaków"; }
if ($ liczba= = 1) { echo 'Jeden'; } elseif ($l iczba= = 2) { echo 'Dwa'; } elseif ($l iczba= = 3) { echo 'Trzy'; } else { echo 'Inna liczba ni 1-4' ; } �
switch ($liczba) { case "1" : echo � Jeden� ; break; case "2" : echo � Dwa� ; break; case "3" : echo � Trzy� ; break; default :}
Optymalizacja logicznej struktury BD
�Ograniczenie rozm iaru pól�Odpowiednie i pot rzebne indeksy�Tabele o sta ej d ugo ci danych� � ��Rozdzielenie z o onych tabel na � �
m niejsze�Norm alizacja?
Mechanizmy optymalizacyjne wbudowane w silnik
�OPTIM IZE TABLE test ; �SELECT BENCHM ARK(10000000,
(SELECT 2^ NOW()));�EXPLAIN SELECT * FROM odbiorcy
WHERE id> 1
Dobre praktyki programistyczne
� INSERT DELAYED INTO tabela(pole) VALUES(warto )��
�SELECT im ie FROM nazwiska WHERE nazwisko IN ($nazw)
� INSERT INTO tabela(im ie,nazwisko) VALUES(� Jan� ,� Kowalski� ), (� Jan� ,� Bielecki� )
Cachowanie wyników zapyta�
�SHOW STATUS LIKE 'Qcache%'; �SET SESSION query_cache_type =
�XXXX�; �Metody specjalist yczne
W asna m etoda�Zapisywanie do oddzielnych plików
Ustatecznianie dynamicznych stron
�Cache Lite�Dynam iczne tworzenie statycznych
st ron
Optymalizacja kodu HTML
�Zastosowanie CSS�Kom presja kodu wynikowego
ród a �
�Rados aw Maciaszek, � SQLit e � �nowa alt ernatywa dla baz danych MySQL i PostgreSQL� , ht tp://m aciaszek.pl/phpcon/download/sqlite.pdf
�Podr cznik PHP, �ht tp://www.php.net /m anual/ M. Bit t ner, � Aplikacje int ernetowe
wysokiej wydajno ci��