PDO Подготовленные выражения и хранимые процедуры.
| Индекс материала |
|---|
| PDO Подготовленные выражения и хранимые процедуры. |
| Хранимые процедуры |
| Все страницы |
Многие из современных баз данных поддерживают подготовленные выражения. Что это, и с чем это едят? Представьте что это своего рода шаблон для SQL, который можно настроить и выполнить, используя различные параметры. Подготовленные выражения дают следующие преимущества:
-
Запрос строится однажды, но может быть выполнен многократно с теми же самыми или другими параметрами. Когда запрос будет подготовлен, база данных проанализирует, соберет и выполнит его, это упрощённая схема выполнения вопроса. Для сложных запросов этот процесс может занять достаточно времени, это заметно замедлит получение результата. А если будет нужно повторить тот же самый запрос много раз, да ещё с различными параметрами, а если в цикле... шучу
? При использовании подготовленного выражения запрос избегает повторной процедуры сборки, анализа и оптимизации. Это означает, что запросы, использующие подготовленные выражения расходуют меньше ресурсов и таким образом выполняются быстрее! -
Параметры для подготовленных выражений не нуждаются в явном экранировании, это берет на себя драйвер базы. Если запрос использует исключительно подготовленные выражения, никакая SQL - инъекция не пройдет (однако, это не означает что уязвимость не может появиться в другой части запроса, но это уже как говориться: кривые руки на всё от скуки...). Подготовленные выражения настолько мощны и полезны, что они - единственная функция, которую PDO будет эмулировать для драйверов, которые не поддерживают их! Это гарантирует, что запрос будет в состоянии использовать ту же самую парадигму доступа к данным, независимо от возможностей базы данных.
Многократная вставка данных, используя подготовленные выражения:
Этот шаблон использует позиционные плейсхолдеры и вставляет за раз несколько записей, обрабатывая дубликаты:
$stmt = $dbh->prepare('INSERT INTO tbl_user (`id`,`username`,`password`,`email`)
VALUES (?,?,?,?),(?,?,?,?),(?,?,?,?)
ON DUPLICATE KEY UPDATE
id=VALUES(id),
username=VALUES(username),
password=VALUES(password),
email=VALUES(email)')
->execute(array(
'1','foo-1','foo-pass-1','foo-email-1', // row 1
'2','foo-2','foo-pass-2','foo-email-2', // row 2
'3','foo-3','foo-pass-3','foo-email-3' // row 3
));
Этот шаблон использует именованные плейсхолдеры:
$stmt = $dbh->prepare('INSERT INTO REGISTRY (name, value) VALUES (:name, :value)');
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);
// Вставляем первую запись:
$name = 'Вася';
$value = 1;
$stmt->execute();
// Вставляем вторую запись с другим значением:
$name = 'Петя';
$value = 2;
$stmt->execute();
Этот шаблон использует позиционные плейсхолдеры:
$stmt = $dbh->prepare('INSERT INTO REGISTRY (name, value) VALUES (?, ?)');
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// Вставляем первую запись:
$name = 'Вася';
$value = 1;
$stmt->execute();
// Вставляем вторую запись с другим значением:
$name = 'Петя';
$value = 2;
$stmt->execute();
Выборка данных, используя подготовленные выражения:
Этот пример получает данные, основанные на значении ключа, предоставляемого html - формой. Данные, полученные от пользователя, автоматически экранируются, таким образом, нет никакого риска SQL – инъекции:
$stmt = $dbh->prepare('SELECT * FROM REGISTRY where name = ?');
if ( $stmt->execute(array($_GET['name'])) )
{
while ($row = $stmt->fetch())
{
print_r($row);
}
}
Информация копипастерам
Внимание! Копирование контента с сайта, возможно только с разрешения администратора. Т.е. Меня! Я скорее всего разрешу Вам это сделать, в обмен на живую ссылку, на статью оригинал.
PDO Подготовленные выражения и хранимые процедуры.
