PDO. Часть 3.
В этой заключительной статье мы рассмотрим, что такое подготовленные запросы, как отлавливать ошибки и что такое транзакции в PDO.
Подготовленные запросы
Когда мы выполняем какой-то запрос к базе данных, он анализируется и оптимизируется, что, естественно, занимает время. Если у нас много сложных запросов, то это может выполняться очень даже долго. Используя же подготовленные запросы, это делается один раз, а затем мы можем использовать наш запрос сколько угодно раз. Также, нам не нужно экранировать параметры, т.к. драйвер базы данных сделает всё сам. Давайте посмотрим, как их использовать.
$stmt = $db->prepare("INSERT INTO articles (title, text) VALUES (:title, :text)");
$stmt->bindParam(':title', $title);
$stmt->bindParam(':text', $text);
$title = 'название статьи 1';
$text = 'Какой-то текст к первой статье';
$stmt->execute();
$title = 'название статьи 2';
$text = 'Какой-то текст ко второй статье';
$stmt->execute();
Чтобы подготовить запрос, мы пишем его в методе prepare, где вместо значений мы указываем строчку такого вида: ":название". В методе bindParam мы указываем, к какой строчке какие данные привязать. В нашем случае к строчке :title привязываются данные из переменной $title, а к строчке :text - данные из переменной $text. Чтобы выполнить запрос, нужно вызвать метод execute. Такие параметры называются именованными, теперь посмотрим на неименованные.
$stmt = $db->prepare("INSERT INTO articles (title, text) VALUES (?, ?)");
$stmt->bindParam(1, $title);
$stmt->bindParam(2, $text);
$title = 'название статьи 1';
$text = 'Какой-то текст к первой статье';
$stmt->execute();
$title = 'название статьи 2';
$text = 'Какой-то текст ко второй статье';
$stmt->execute();
Здесь всё идентично, кроме того, что вместо строчки :название указывается знак вопроса, а в методе bindParam цифра 1 означает первый знак вопроса, а цифра 2 - второй знак вопроса. Используйте тот способ, который вам больше нравится.
Отлавливание ошибок
Чтобы отлавливать ошибки, мы используем уже знакомую нам конструкцию try-catch и класс PDOException.
try {
$db = new PDO("myql:host=$host;dbname=$dbname", $user, $pass);
} catch(PDOException $e) {
echo "You have an error: ".$e->getMessage()."<br>";
echo "On line: ".$e->getLine();
}
В качестве примера, я допустил ошибку и написал myql, а не mysql. Эта ошибка будет отловлена и нам выведится её текст и на какой линии произошла ошибка.
Транзакции
Давайте рассмотрим транзакции сразу на примере.
try {
$db = new 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')");
exit('error');
$stmt = $db->exec("INSERT INTO `articles`(`title`) VALUES('title3')");
$db->commit();
} catch(PDOException $e) {
$db->rollBack();
}
beginTransaction означает, что мы начинаем транзакцию. Commit подтверждает изменения, а rollBack отменяет всё.
Суть транзакций в том, что мы либо делаем всё, либо не делаем ничего. В нашем примере мы вставляем в таблицу articles значения title1, title2, title3. Но после вставки второго значения, мы сэмулировали ошибку, остановив скрипт с помощью exit. Если бы мы не использовали транзакции, то у нас первые два title вставились бы, а последний нет. В нашем примере это не существенно, но бывают случаи, когда это может привести к серьёзным сбоям в работе приложения. Вот, чтобы такого не случалось, мы и используем транзакции, где метод rollBack вернёт всё в первоначальный вид и наши первые два title тоже вставлены не будут, а если всё прошло удачно, без ошибок, то метод commit подтвердит изменения и все три title будут успешно вставлены.
Заключение
Итак, в наших трёх статьях, посвящённых изучению PDO, мы разобрали всё, что нужно, чтобы с лёгкостью использовать этот интерфейс. Думаю, вы поняли, как PDO облегчает нам жизнь и будете использовать его в своих проектах. Удачи!
-
- Михаил Русаков
Комментарии (1):
Спасибо за статью! очень пригодилось при выполнении домашней работы в институте. Больше нигде не удалось найти ПОНЯТНОГО объяснения
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.