Эффективное повторение запросов

Задача
Необходимо несколько раз повторить выполнение одного и того же запроса, каждый раз подставляя новые значения.

Решение
В PEAR DB определите запрос с помощью функции DB::prepare(), а затем выполните запрос, вызвав функцию DB::execute(). Символы-заместители в запросе, переданные в функцию prepare(), замещаются данными функцией execute():

$prh = $dbh->prepare("SELECT sign FROM zodiac WHERE element LIKE ?");
$sth = $dbh->execute($prh,array('fire'));
while($sth->fetchInto($row)) {
print $row[0]."\n";
}
$sth = $dbh->execute($prh,array('water'));
while($sth->fetchInto($row)) {
print $row[0]."\n";
}

Обсуждение
Первая функция execute() из раздела «Решение» начинает выполнение запроса:

SELECT sign FROM zodiac WHERE element LIKE 'fire'

Вторая запускает запрос:

SELECT sign FROM zodiac WHERE element LIKE 'water'

В каждом случае функция execute() заменяет символ-заместитель ? на значение своего второго аргумента. Если символов-заместителей более одного, то аргументы надо разместить в массиве в порядке их появления в запросе:

$prh = $dbh->prepare("SELECT sign FROM zodiac WHERE element LIKE ? OR planet LIKE ?");
// SELECT sign FROM zodiac WHERE element LIKE 'earth' OR planet LIKE 'Mars'
$sth = $dbh->execute($prh,array('earth','Mars'));

Значения, подставляемые вместо символов-заместителей, заключаются в кавычки.


Чтобы вставить содержимое файла, используйте символ-заместитель & и передайте функции execute() имя файла:

/* Структура таблицы изображений:
CREATE TABLE pictures (
mime_type CHAR(20),
data LONGBLOB
)
*/
$prh = $dbh->prepare('INSERT INTO pictures (mime_type,data) VALUES (?,&)');
$sth = $dbh->execute($prh,array('image/jpeg','test.jpeg'));

Для того чтобы функция execute() не заключала значения в кавычки, надо задать параметр !. Этот способ может быть небезопасен, если применяется для пользовательского ввода; но он удобен, если значение представляет собой не скалярную величину, а функцию базы данных.

Так, в приведенном ниже запросе функция NOW() нужна для того, чтобы вставить текущие дату и время в столбец DATETIME:

$prh = $dbh->prepare("INSERT INTO warnings (message,message_time) VALUES
(?,!)");
$dbh->execute($prh,array("Don't cross the streams!",NOW()));

Для многократного выполнения подготовленного оператора с различными аргументами предназначена функция executeMultiple(). Вместо простой передачи одного массива аргументов, как при вызове функции execute(), в данном случае передается массив массивов аргументов:

$prh = $dbh->prepare('INSERT INTO pictures (mime_type,data) VALUES (?,&)');
$ar = array(array('image/jpeg','earth.jpeg'),
array('image/gif','wind.gif'),
array('image/jpeg','fire.jpeg'));
$sth = $dbh->executeMultiple($prh,$ar);

Необходимо сначала объявить массив, а затем передать его функции executeMultiple(), в противном случае PHP выдает сообщение об ошибке, в котором говорится, что параметр функции executeMultiple()передан по ссылке.


Функция executeMultiple() выполняет цикл по всем аргументам в массиве, но если в процессе прохождения встречается ошибка, функция не будет продолжать обработку остальных аргументов. Если все запросы успешны, то функция executeMultiple() возвращает константу DB_OK. Функция executeMultiple() никогда не возвращает результирующий объект, поэтому ее нельзя применять в запросах, возвращающих данные.Машины баз данных Interbase и OCI8 могут использовать возможности родных баз данных, поэтому для запросов INSERT/UPDATE/DELETE пара методов prepare()/execute() более эффективна, чем функция query().

Машина Interbase использует функции ibase_prepare() и ibase_execute(), а машина OCI8 использует функции OCIParse(), OCIBindByName() и OCIExecute(). Другие машины баз данных конструируют запросы с помощью интерполяции значений, предоставленных для использования вместо символов-заместителей..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Автоматическое присваивание уникальных значений идентификаторов
Выполнение запросов к базе данных SQL
Извлечение строк без цикла
Кэширование запросов и результатов
Модификация данных в базе данных SQL

Вернуться в раздел: PHP / 10. Доступ к базам данных