Малко информация относно PDO

eddyy93

Registered
Защо PDO?

Какво дава PDO допълнително от колкото стандартните заявки?

Прочетох че prepare statment защитава от SQL Injection, как го постига и това означава ли, че няма нужда от addslashes, htmlspecialchars etc. ... ?

От към бързо действие, как се справя - забавя ли заявката повечко от колкото стандартните заявки?

Защо да ползваме при взимане от базата данни, функциите дадени от PDO (PDO::FETCH_ASSOC, а не mysql_fetch_assoc)?
 
о PDO ползвам от години, доста от отдавна. PDO - е съкращение от PHP Data Objects - тоест клас за работа с бази данни. Като такъв естествено си има предимства. Не мога да ти кажа дали е по бърз, но определено е по лесен, и естествено по сигурен, както сам си забелязал. Можеш да си правиш и портабъл апликации за различни платформи. Можеш да bind-ваш параметри в SQL синтакса ти, ще ти дам пример след малко, но първо :

PDO::FETCH_ASSOC, а не mysql_fetch_assoc

Защото така, задаваш на обекта в какъв тип да ти връща информацията. АКо не си наясно с принципите на ООП започни от там първо.

Та пример за биндване на параметри

PHP:
calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();

Така ако задаваш типа, какви трябва да бъдат входните данни, примерно ако си ги вземаш от GET, както и ако забелязваш ако е стринг може да му задаваш и засължителна дължина. За повече информация и функционалности виж manual-a в php.net има раздел PDO.
 
eddyy93 каза:
Защо PDO?

Какво дава PDO допълнително от колкото стандартните заявки?

Аз само ще допълня с малко информация. Какво дава допълнително? Дава ти OOP интерфейс към MySQL и поддръжка на някои неща като Prepared statements, които стария mysql драйвър няма.

Погледни червения текст тук: http://php.net/manual/en/function.mysql-connect.php
Може да видиш и това, за съпоставка между mysql, mysqli и PDO: http://php.net/manual/en/mysqlinfo.api.choosing.php


Прочетох че prepare statment защитава от SQL Injection, как го постига и това означава ли, че няма нужда от addslashes, htmlspecialchars etc. ... ?

Сега Prepared statements защитава от sql инжекции, защото (при server-side Prepared Statements) заявката се изпраща отделно от данните в нея. Тоест първо php казва на mysql заявката: [sql]INSERT .... INTO .... VALUES (:val1, :val2, :val3)[/sql] и после праща самата информация (каквото реално има на местата на val1, val2 и val3). Така сам можеш да видиш защо предпазва от SQL инжекции. И съответно няма нужда от addslashes или mysql_real_escape_string. htmlspecialchars не го намесвай тук. С него се защитаваш от XSS, което няма нищо общо със заявката.

От към бързо действие, как се справя - забавя ли заявката повечко от колкото стандартните заявки?

За бързодействието има моменти, в които PDO е по-бързо от обикновен драйвър, а в останалите не мисля, че има някаква разлика. По-бързо е когато можеш да направиш нещо такова:

1. Подготвяш една заявка
2. Слагаш и някакви данни
3. Изпълняваш я
4. Променяш данните
5. Пак я изпълняваш

и т.н. Идеята тук е, че заявката се праща на сървъра веднъж. MySQL я обработва веднъж, като ако след това само данните в нея (:val1, :val2, :val3) са променени няма нужда да я обработва пак. Това е един от бонусите на prepared заявките.

И все пак спрете толкова да го гледате това бързодействие. Ако беше толкова значително и важно бързодействието хората още щяха да пишат на C++. Дори да е най-бавния MySQL драйвър на света пак няма да усетиш никаква разлика. А една бавна заявка с какъвто и драйвър да е пак ще е бавна и ще забави много повече отколкото всички микрооптимизацийки, които можеш да направиш по PHP кода ти. Така, че ако те притеснява толкова много бързодействието погледни как можеш да си оптимизираш самите заявки и къде можеш да сложиш индекси в таблицата си в MySQL.

Защо да ползваме при взимане от базата данни, функциите дадени от PDO (PDO::FETCH_ASSOC, а не mysql_fetch_assoc)?

Ако ползваш PDO ще ти се наложи да ползваш неговите функции. Не може да изпълниш заявка с PDO и да ползваш mysql_fetch_assoc, както не е възможно и обратното.
 
Благодаря за информацията която дадохте, а линковете, който stormbreaker даде, ме ориентираха още малко.

Остана само ако може да ми дадете информация какво означава това:

Как така синхронно и асинхронно?

API supports non-blocking, asynchronous queries with mysqlnd


----------


И това малко ме обърква, interface по принцип е нещо като задължителен метод, който задължително трябва да използваш, ако extend - ваш класа. Но тъй като мисля, че това няма нищо общо, ако може и малко информация за това. Да не би да означава, че е процедурно писане?

Procedural Interface


----------



И още едно разликата между двете, не би ли трябвало да съществува само server - side, по принцип не потребителите пращат заявките, а сървърите (в нашият случай PHP), или го разтълкувам грешно:

API supports server-side Prepared Statements
API supports client-side Prepared Statements
 
eddyy93 каза:
Благодаря за информацията която дадохте, а линковете, който stormbreaker даде, ме ориентираха още малко.

Остана само ако може да ми дадете информация какво означава това:

Как така синхронно и асинхронно?

API supports non-blocking, asynchronous queries with mysqlnd

Не съм 100% сигурен, но мисля, че означава, че можеш да пускаш заявки без да ги чакаш да свършат тоест нещо такова:

PHP:
$pdo->query(...);

echo 'test';
тоест test може да се изпише преди да е свършила заявката. Това не би трябвало да ти потрябва почти никога.

И това малко ме обърква, interface по принцип е нещо като задължителен метод, който задължително трябва да използваш, ако extend - ваш класа. Но тъй като мисля, че това няма нищо общо, ако може и малко информация за това. Да не би да означава, че е процедурно писане?

Procedural Interface

В случая се има предвид, че можеш да го използваш като набор от функции. Както е mysqli_query, mysqli_connect и т.н. Това е процедурно писане на код.

Докато най-добре е да си го използваш като клас: $pdo = new PDO(...);
$pdo->query, $pdo->connect и т.н. Това се нарича ООП интерфейс.

И още едно разликата между двете, не би ли трябвало да съществува само server - side, по принцип не потребителите пращат заявките, а сървърите (в нашият случай PHP), или го разтълкувам грешно:

API supports server-side Prepared Statements
API supports client-side Prepared Statements

Тълкуваш го грешно. Това се отнася за подготвените заявки (prepared statements). Това, което ти казах в предния си пост (как работят prepared statements) е за server-side prepared statements. Заявката се праща отделно от данните. За client-side (не съм 100% сигурен, но провери в google) означава, че самият PDO код си обработва заявката (ескейпва данните) и праща всичко заедно. И в двата случая си защитен от sql injection, защото PDO може много адекватно да обработи заявката. Реално той си решава дали ще ползва server-side или client-side prepared statements. Има и опция да го задължиш да ползва server-side но не е от голямо значение.

Client-side означава, че PHP ще обработи данните в заявката вместо MySQL. Няма нищо общо с JS и клиентския браузър.

Ако имаш още въпроси питай :)
 
За завършек смятам да е с този линк:
http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-should-you-use/


Ще оставя темата отворена за известно време, ако има някой още какво да добави.

Благодаря така за информацията.
 

Back
Горе