PHP - Try a different one.

Transkrypt

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

Podobne dokumenty