Подготвени заявки pdo. Как се работи със ЗНП? Пълно ръководство

Много от по-зрелите бази данни поддържат концепцията за подготвени отчети. Какво са те? Те могат да се разглеждат като вид компилиран шаблон за SQL, който приложението иска да изпълни, който може да бъде персонализиран с помощта на променливи параметри. Подготвените отчети предлагат две основни предимства:

  • Заявката трябва да бъде анализирана (или подготвена) само веднъж, но може да бъде изпълнена многократно седнакви или различни параметри. Когато заявката е подготвена, базата данни ще анализира, компилира и оптимизира своя план за изпълнение на заявката. За сложни заявки този процес може да отнеме достатъчно време, така че значително да забави приложение, ако има нужда да се повтаря една и съща заявка много пъти с различни параметри. Чрез използването на подготвен израз приложението избягва повтарянето на цикъла анализ/компилиране/оптимизиране. Това означава, че подготвените отчети използват по-малко ресурси и следователно работят по-бързо.
  • Параметрите на подготвените изрази не трябва да се цитират; драйверът автоматично обработва това. Ако дадено приложение използва изключително подготвени изрази, разработчикът може да бъде сигурен, че няма да настъпи SQL инжектиране (обаче, ако се изграждат други части от заявката с неекраниран вход, SQL инжектирането все още е възможно).

Подготвените изрази са толкова полезни, че са единствената функция, която PDO ще емулира за драйвери, които не ги поддържат. Това гарантира, че приложението ще може да използва същата парадигма за достъп до данни, независимо от възможностите на базата данни.

Пример #1 Повтарящи се вмъквания с помощта на подготвени изрази

имеи а стойностза посочените контейнери.

$stmt = $dbh -> подготви ( „ВМЪКНЕТЕ В РЕГИСТЪРА (име, стойност) СТОЙНОСТИ (: име, : стойност)“);
$stmt -> bindParam (":име", $име);
$stmt -> bindParam (":value" , ​​​​$value );

// вмъкване на един ред
$name = "един";
$стойност = 1;
$stmt -> изпълни();

$name = "две";
$стойност = 2;
$stmt -> изпълни();
?>

Пример #2 Повтарящи се вмъквания с помощта на подготвени изрази

Този пример изпълнява INSERT заявка чрез заместване на a имеи а стойностза позиционните ? заместители.

$stmt = $dbh -> подготви ( "ВМЪКНЕТЕ В РЕГИСТЪРА (име, стойност) СТОЙНОСТИ (?, ?)");
$stmt -> bindParam(1, $name);
$stmt -> bindParam (2, $value);

// вмъкване на един ред
$name = "един";
$стойност = 1;
$stmt -> изпълни();

// вмъкнете друг ред с различни стойности
$name = "две";
$стойност = 2;
$stmt -> изпълни();
?>

Пример #3 Извличане на данни чрез подготвени отчети

Пример #4 Извикване на запомнена процедура с изходен параметър

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

$stmt = $dbh -> подготви ("CALL sp_returns_string(?)");
$stmt -> bindParam(1, $return_value, PDO::PARAM_STR, 4000);

// извикване на съхранената процедура
$stmt -> изпълни();

print "процедурата върна $return_value \n" ;
?>

Пример #5 Извикване на запаметена процедура с входно/изходен параметър

Разработчиците могат също така да определят параметри, които съдържат стойности както на входа, така и на изхода; синтаксисът е подобен на изходните параметри. В този следващ пример низът "hello" се предава в съхранената процедура и когато се върне, hello се заменя с върнатата стойност на процедурата.

$stmt = $dbh -> подготви ( "CALL sp_takes_string_returns_string(?)");
$value = "здравей" ;!}
$stmt -> bindParam (1, $value, PDO :: PARAM_STR | PDO :: PARAM_INPUT_OUTPUT, 4000);

// извикване на съхранената процедура
$stmt -> изпълни();

print "процедура върна $стойност\n" ;
?>

Повечето бази данни поддържат концепцията за подготвени заявки. Какво е? Това може да се опише като някакъв вид компилиран шаблон на SQL заявка, който ще се изпълнява от приложението и ще се конфигурира с помощта на входни параметри. Подготвените заявки имат две основни предимства:

  • Заявката трябва да бъде подготвена веднъж и след това може да бъде стартирана толкова пъти, колкото е необходимо, както с еднакви, така и с различни параметри. Когато една заявка е подготвена, СУБД я анализира, компилира и оптимизира нейния план за изпълнение. За сложни заявки този процес може да отнеме значително време и може значително да забави приложението, ако трябва да изпълнявате заявката много пъти с различни параметри. Когато се използва подготвена заявка, СУБД анализира/компилира/оптимизира заявка с всякаква сложност само веднъж и приложението стартира вече подготвения шаблон за изпълнение. По този начин подготвените заявки консумират по-малко ресурси и се изпълняват по-бързо.
  • Подготвените параметри на заявката не е необходимо да бъдат екранирани с кавички; драйверът прави това автоматично. Ако приложението използва само подготвени заявки, разработчикът може да бъде сигурен, че не могат да се случат SQL инжекции (обаче, ако други части от тялото на заявката са написани с неекранирани знаци, SQL инжекциите все още са възможни; тук говорим за параметри).

Подготвените заявки също са полезни, защото PDO може да ги емулира, ако драйверът на базата данни няма подобна функционалност. Това означава, че приложението може да използва същата техника за достъп до данни, независимо от възможностите на СУБД.

Пример #1 Повтарящи се вмъквания в база данни с помощта на подготвени заявки

имеИ стойност, които се заместват вместо съответните псевдопроменливи:

$stmt = $dbh -> подготви ( „ВМЪКНЕТЕ В РЕГИСТЪРА (име, стойност) СТОЙНОСТИ (: име, : стойност)“);
$stmt -> bindParam (":име", $име);
$stmt -> bindParam (":value" , ​​​​$value );

// вмъкнете един ред
$name = "един";
$стойност = 1;
$stmt -> изпълни();

$name = "две";
$стойност = 2;
$stmt -> изпълни();
?>

Пример #2 Повтарящи се вмъквания в база данни с помощта на подготвени заявки

В този пример заявката INSERT се изпълнява 2 пъти с различни значения имеИ стойносткоито се заместват вместо псевдопроменливи ? .

$stmt = $dbh -> подготви ( "ВМЪКНЕТЕ В РЕГИСТЪРА (име, стойност) СТОЙНОСТИ (?, ?)");
$stmt -> bindParam(1, $name);
$stmt -> bindParam (2, $value);

// вмъкнете един ред
$name = "един";
$стойност = 1;
$stmt -> изпълни();

// сега друг ред с различни стойности
$name = "две";
$стойност = 2;
$stmt -> изпълни();
?>

Пример #3 Извличане на данни чрез подготвени заявки

В този пример се прави избор от базата данни с помощта на ключ, въведен от потребителя чрез формуляра. Въведеното от потребителя се цитира автоматично, така че няма риск от SQL инжектиране.

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

Пример #4 Извикване на запомнена процедура с изходни параметри

$stmt = $dbh -> подготви ("CALL sp_returns_string(?)");
$stmt -> bindParam(1, $return_value, PDO::PARAM_STR, 4000);

// извикване на съхранена процедура
$stmt -> изпълни();

печат „процедурата е върната$return_value \n" ;
?>

Можете да зададете параметър да бъде както вход, така и изход; Синтаксисът е същият като за изходните параметри. Следващият пример предава низа "hello" на съхранената процедура и след това низът ще бъде заменен с върнатата стойност.

Пример #5 Извикване на запаметена процедура с входно/изходен параметър

$stmt = $dbh -> подготви ( "CALL sp_takes_string_returns_string(?)");
$value = "здравей" ;!}
$stmt -> bindParam (1, $value, PDO :: PARAM_STR | PDO :: PARAM_INPUT_OUTPUT, 4000);

// извикване на съхранена процедура
$stmt -> изпълни();

печат „процедурата е върната$стойност\n" ;
?>

(масив("% $_GET [ име ] %" ));
?>

Срок PDOе съкращение на понятието PHP обекти от данни. Както подсказва името, тази технология ви позволява да работите със съдържанието на базата данни чрез обекти.

Защо не myqli или mysql?

Най-често по отношение на новите технологии възниква въпросът за техните предимства пред добрите стари и доказани инструменти, както и прехвърлянето на текущи и стари проекти към тях.

Обектно ориентирано PDO

PHPРазвива се много активно и се стреми да се превърне в един от най-добрите инструменти за бързо развитие на уеб приложения, както на масово, така и на корпоративно ниво.

Говорейки за PHP, имаме предвид модерни обектно-ориентирани PHP, което ви позволява да пишете универсален код, който е удобен за тестване и повторна употреба.

Използване PDOви позволява да преместите работата с базата данни на обектно-ориентирано ниво и да подобрите преносимостта на кода. Всъщност използването PDOне е толкова трудно, колкото може да се мисли.

Абстракция

Нека си представим, че разработваме приложение дълго време, използвайки MySQL. И тогава, в един прекрасен момент, става необходимо да се замени MySQLНа PostgreSQL.

Като минимум ще трябва да заменим всички повиквания mysqli_connect() (mysql_connect())На pg_connect()и, по аналогия, други функции, използвани за запитване и обработка на данни.

Използвайки PDO, ще се ограничим до промяна на няколко параметъра в конфигурационните файлове.

Свързване на параметри

Използването на свързани параметри осигурява по-голяма гъвкавост в дизайна на заявките и подобрява защитата срещу SQLинжекции.

Получаване на данни като обекти

Тези, които вече използват ORM(обектно-релационно картографиране - обектно-релационно картографиране на данни), например, Доктрина, познават удобството на представянето на данни от таблиците на базата данни под формата на обекти. PDOви позволява да получавате данни под формата на обекти и без да използвате ORM.

Разширението mysql вече не се поддържа

Поддръжка на разширение mysqlокончателно премахнат от нов PHP 7. Ако планирате да прехвърлите проекта на нова версия PHP, сега трябва да използвате поне mysqli в него. Разбира се, по-добре е да започнете да използвате PDOако още не сте го направили.

Струва ми се, че тези причини са достатъчни, за да наклонят везните в полза на употребата PDO. Освен това не е необходимо да инсталирате нищо допълнително.

Проверка на наличието на PDO в системата

Версии PHP 5.5и по-високи най-често вече съдържат разширение за работа PDO. За да проверите, просто изпълнете проста команда в конзолата:

php -i | grep "pdo"

Сега нека го отворим във всеки браузър и да намерим необходимите данни чрез търсене по ред PDO.

Запознаване със ЗНП

Процес на работа с PDOне се различава много от традиционния. Като цяло, процесът на използване PDOизглежда така:

  1. Свържете се с базата данни;
  2. При необходимост изгответе заявка и параметри на връзката;
  3. Изпълнение на заявката.

Свързване към базата данни

За да се свържете с базата данни, трябва да създадете нов обект PDOи му предайте името на източника на данни, известен също като DSN.

Общо взето, DSNсе състои от името на драйвера, разделено с двоеточие от низ за връзка, специфичен за всеки драйвер PDO.

За MySQL, връзката се прави по следния начин:

$connection = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8", "root", "root");

$connection = нов PDO ( "mysql:host=localhost;dbname=mydb;charset=utf8", "корен" , "корен" );

В такъв случай, DSNсъдържа името на драйвера mysql, индикация за хост (възможен формат хост=HOST_NAME:PORT), име на база данни, кодиране, потребителско име MySQLи неговата парола.

Заявки

За разлика от mysqli_query(), В PDOима два вида заявки:

  • Връщане на резултата ( изберете, покажете);
  • Не връща резултат ( вмъкнете, детайли други).

Първо, нека разгледаме втория вариант.

Изпълнение на заявки

Нека да разгледаме пример за изпълнение на заявка, използвайки примера вмъкнете.

$connection->exec("ВМЪКНЕТЕ В СТОЙНОСТИ на потребители (1, "някаква стойност"");

$връзка -> exec ();

Разбира се, тази заявка връща броя на засегнатите редове и можете да го видите по следния начин.

$affectedRows = $connection->exec("INSERT INTO потребителски СТОЙНОСТИ (1, "somevalue""); echo $affectedRows;

$affectedRows = $connection -> exec ( "INSERT INTO потребители VALUES (1, "somevalue"") ;

echo $affectedRows;

Получаване на резултати от заявката

В случай на използване mysqli_query(), кодът може да бъде както следва.

$result = mysql_query("ИЗБЕРЕТЕ * ОТ потребители"); while($row = mysql_fetch_assoc($result)) ( echo $row["id"] . " " . $row["name"]; )

$result = mysql_query ("ИЗБЕРЕТЕ * ОТ потребители");

докато ($row = mysql_fetch_assoc ($result)) (

За PDO, кодът ще бъде по-прост и по-сбит.

foreach($connection->query("SELECT * FROM users") as $row) ( echo $row["id"] . " " . $row["name"]; )

foreach ($connection -> query ("SELECT * FROM users") като $row ) (

echo $row [ "id" ] . " ". $ред["име"];

Режими за получаване на данни

Както в mysqli, PDOви позволява да получавате данни в различни режими. За определяне на режим, клас PDOсъдържа съответните константи.

  • PDO::FETCH_ASSOC— връща масив, индексиран от името на колоната в таблицата на базата данни;
  • PDO::FETCH_NUM— връща масив, индексиран по номер на колона;
  • PDO::FETCH_OBJ- връща анонимен обект с имена на свойства, съответстващи на имената на колоните. Например $row->id ще съдържа стойността от колоната id.
  • PDO::FETCH_CLASS— връща нов екземпляр на класа, със стойности на свойства, съответстващи на данните от реда на таблицата. Ако параметърът е посочен PDO::FETCH_CLASSTYPE(Например PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE), името на класа ще бъде определено от стойността на първата колона.

Забележка: Това не е пълен списък; всички възможни константи и техните комбинации са налични в документацията.

Пример за получаване на асоциативен масив:

$statement = $connection->query("SELECT * FROM потребители"); while($row = $statement->fetch(PDO::FETCH_ASSOC)) ( echo $row["id"] . " " . $row["name"]; )

$изявление = $връзка ->

докато ($row = $statement -> fetch (PDO::FETCH_ASSOC)) (

echo $row [ "id" ] . " ". $ред["име"];

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

Обмислете използването на режим на вземане на проби PDO::FETCH_CLASS. Нека създадем клас Потребител:

class User ( protected $id; protected $name; public function getId() ( return $this->id; ) public function setId($id) ( $this->id = $id; ) public function getName() ( return $this->name;) публична функция setName($name) ( $this->name = $name; ) )

клас потребител

защитен $id;

защитено $име;

публична функция getId()

връща $това -> идентификатор;

публична функция setId ($id)

$това -> id = $id;

публична функция getName()

връща $това -> име;

публична функция setName ($name)

$това -> име = $име;

Сега нека изберем данните и ги покажем с помощта на методите на класа:

$statement = $connection->query("SELECT * FROM потребители"); while($row = $statement->fetch(PDO::FETCH_CLASS, "User")) ( echo $row->getId(). " ". $row->getName(); )

$statement = $connection -> заявка ("SELECT * FROM потребители");

докато ($row = $statement -> fetch (PDO::FETCH_CLASS, "Потребител")) (

echo $row -> getId() . " ". $row -> getName ();

Подготвени заявки и обвързване на параметри

За да разберете същността и всички предимства на свързването на параметри, трябва да разгледате по-отблизо механизмите PDO. При обаждане $изявление -> заявка()в кода по-горе, PDOще подготви заявка, ще я изпълни и ще върне резултата.

При обаждане $връзка -> подготви()създава се подготвена заявка. Подготвените заявки са способността на система за управление на база данни да получи шаблон на заявка, да го компилира и изпълни след извличане на стойностите на променливите, използвани в шаблона. Механизмите за шаблони работят по подобен начин. умникИ Клонка.

При обаждане $изявление -> изпълни()стойностите за заместване се прехвърлят към шаблона на заявката и СУБД изпълнява заявката. Това действие е подобно на извикването на функцията на двигателя на шаблона render().

Пример за използване на подготвени заявки в PHP PDO:

В горния код е изготвена заявка за избор на запис с поле документ за самоличностравна на стойността, която ще бъде заменена : документ за самоличност. На на този етапСУБД ще анализира и компилира заявката, евентуално използвайки кеширане (в зависимост от настройките).

Сега трябва да предадете липсващия параметър и да изпълните заявката:

$id = 5; $statement->execute([ ":id" => $id ]);

Ползи от използването на свързани параметри

Може би след като прегледате как работят подготвените заявки и свързаните с тях параметри, ползите от използването им стават очевидни.

PDOпредоставя удобен начин за избягване на потребителски данни, например код като този вече не е необходим:

Вместо това сега е препоръчително да направите следното:

Можете дори да съкратите допълнително кода, като използвате номерирани параметри вместо наименувани:

В същото време използването на подготвени заявки подобрява производителността при използване на един и същ шаблон на заявка многократно. Пример за избор на пет произволни потребители от база данни:

$numberOfUsers = $connection->query("SELECT COUNT(*) FROM users")->fetchColumn(); $потребители =; $statement = $connection->prepare("SELECT * FROM потребители WHERE id = ? LIMIT 1"); за ($i = 1; $i<= 5; $i++) { $id = rand(1, $numberOfUsers); $users = $statement->изпълнение([$id])->извличане(PDO::FETCH_OBJ); )

$numberOfUsers = $connection -> query ("SELECT COUNT(*) FROM users" ) -> fetchColumn () ;

$потребители =;

за ($i = 1; $i<= 5 ; $i ++ ) {

$id = rand (1, $numberOfUsers) ;

$users = $statement -> изпълни ([$id]) -> извлече (PDO::FETCH_OBJ) ;

При извикване на метод приготви се(), СУБД ще анализира и компилира заявката, като използва кеширане, ако е необходимо. По-късно в цикъла за, се вземат проби само от данни с указания параметър. Този подход ви позволява да извличате данни по-бързо, намалявайки времето за работа на приложението.

При получаване на общия брой потребители в базата данни е използван методът fetchColumn(). Този метод извлича стойността на една колона и е полезен при извличане на скаларни стойности като брой, сума, максимални или минимални стойности.

Обвързани стойности и IN оператор

Често при започване на работа с PDO, възникват трудности с оператора IN. Например, представете си, че потребителят въвежда няколко имена, разделени със запетаи. Въведеното от потребителя се съхранява в променлива $names.

Това са таблици, но само за четене (можете да направите някои промени, но те са изключително ограничени). По същество това е обикновена таблица, но се създава въз основа на някаква заявка (други таблици), т.е. това е „връзка“ към някаква заявка. Да разгледаме един пример:

CREATE TABLE t(име, цена); //създаване на таблица CREATE VIEW v AS SELECT име, цена, име * цена AS стойност FROM t;//създаване на друга таблица, третото поле като продукт на първите две SELECT * FROM v; //вземете данни от таблицата

Тези. създадохме таблица с трето поле, за което никой не знае. И не е нужно да го показвате на всички. Тези. можем да създадем таблица с помощта на View например във фирма, за отдел Човешки ресурси, за служители, за отдел за обучение, за счетоводство. Действието е подобно на използването на първата таблица като шаблон и добавянето на нови полета към нея.

Подготвени запитвания

Има ситуации, когато имаме много записи (например 50 000) в базата данни и те са избрани в цикъл. Ако поставим mysql_query там, тогава тази заявка ще бъде анализирана 50 000 пъти. За да не се губи време за такъв анализ, има подготвена заявка - това е заявка, която се изпраща предварително към базата данни, анализира се веднъж и базата данни е готова да я приеме. Пример:

Mysql_connect("localhost", "root", "password"); mysql_select_db("тест"); mysql_query("PREPARE myinsert FROM // напишете името на подготвената заявка "INSERT INTO test_table (име, цена) СТОЙНОСТИ (?, ?)""); //ето подготвената заявка за ($i = 0; $i< 1000; $i++){ mysql_query("SET @name = "Товар # $i""); //установить значение "товар" для переменной @name mysql_query("SET @price = " . ($i * 10)); //установить значение цены для переменной @price mysql_query("EXECUTE myinsert USING @name, @price"); //исполнить подготовленный запрос, используя эти две переменные } mysql_close();

В подготвения въпросник въведените стойности са неизвестни (знак?). След това в цикъл поставяме стойностите в таблицата. Тези. вътре в езика mysql виждаме нашите променливи, нашите функции.

В тази последна статия ще разгледаме, какви са подготвените заявки, как да хванете грешкиИ какво представляват транзакциите в PDO.

Подготвени запитвания

Когато изпълняваме заявка към база данни, тя се анализира и оптимизира, което естествено отнема време. Ако имаме много сложни заявки, това може да отнеме много време, за да завършим. Използвайки същото подготвени заявки, това се прави веднъж и след това можем да използваме нашата заявка толкова пъти, колкото пожелаем. Освен това не е необходимо да избягваме параметрите, защото драйвер за база даннище направи всичко сам. Нека видим как да ги използваме.

$stmt = $db->prepare("ВМЪКНЕТЕ В статии (заглавие, текст) СТОЙНОСТИ (:заглавие, :текст)");
$stmt->bindParam(":title", $title);
$stmt->bindParam(":текст", $текст);



$stmt->изпълни();



$stmt->изпълни();

За да подготвим заявката, ние я записваме в метода приготви се, където вместо стойности посочваме ред като този: ":Име". В метод bindParamпосочваме към кой ред какви данни да прикачим. В нашия случай до линията :заглавиеданните от променлива са обвързани $title, и към линията :текст- данни от променлива $текст. За да изпълните заявката, трябва да извикате метода изпълни. Такива параметри се наричат на име, сега нека да разгледаме без име.

$stmt = $db->prepare("ВМЪКНЕТЕ В статии (заглавие, текст) СТОЙНОСТИ (?, ?)");
$stmt->bindParam(1, $title);
$stmt->bindParam(2, $текст);

$title = "заглавие на статия 1";!}
$text = "Малко текста за първата статия";
$stmt->изпълни();

$title = "заглавие на статия 2";!}
$text = "Мало текста за втората статия";
$stmt->изпълни();

Всичко тук е идентично, с изключение на това, че вместо линията : Имее посочен въпросителен знак, а в метод bindParamномер 1 означава първивъпросителен знак и число 2 - второвъпросителен знак. Използвайте метода, който ви харесва най-много.

Прихващане на грешки

За да улавяме грешки, ние използваме конструкция, която вече ни е позната опитай да хванеши класа PDOException.

Опитвам(
$db = нов PDO("myql:host=$host;dbname=$dbname", $user, $pass);
) catch(PDOException $e) (
echo "Имате грешка: ".$e->getMessage()."
";
echo "На линия: ".$e->getLine();
}

Като пример направих грешка и написах myql, но не mysql. Тази грешка ще бъде уловена и ще ни бъде показан нейният текст и на кой ред е възникнала грешката.

Транзакции

нека помислим сделкиведнага с пример.

Опитвам(
$db = нов PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$db->beginTransaction();

$stmt = $db->exec("INSERT INTO `articles`(`title`) VALUES("title1")");
$stmt = $db->exec("INSERT INTO `articles`(`title`) VALUES("title2")");
изход ("грешка");

$stmt = $db->exec("INSERT INTO `articles`(`title`) VALUES("title3")");
$db->commit();

) catch(PDOException $e) (
$db->rollBack();
}

beginTransactionозначава, че започваме сделка. Ангажирайте сепотвърждава промените и връщане назадотменя всичко.

Същността на транзакциите е, че или правим всичко, или не правим нищо. В нашия пример вмъкваме в таблицата статиистойности заглавие1, заглавие2, заглавие3. Но след като вмъкнахме втората стойност, ние симулирахме грешка, като спряхме скрипта да използва изход. Ако не сме използвали сделки, тогава имаме първите две заглавиещеше да бъде вмъкнат, но последният не би. В нашия пример това не е значително, но има случаи, когато това може да доведе до сериозни повреди в приложението. Така че, за да предотвратим това да се случи, ние използваме сделки, където метод връщане назадще върне всичко в първоначалния си вид и първите ни две заглавиесъщо няма да бъде вмъкнат и ако всичко върви добре, без грешки, тогава методът ангажирамще потвърди промените и трите заглавиеще бъдат вмъкнати успешно.

Заключение

И така, в нашите три статии, посветени на изучаване на PDO, покрихме всичко, от което се нуждаете, за да използвате този интерфейс с лекота. Мисля, че разбирате как PDOправи живота ни по-лесен и вие ще го използвате във вашите проекти. Късмет!