Разработчику. Сборник рецептов PHP
Задавайте вопросы

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

Вернуться назад

Задача

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

Решение

В 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() никогда не возвращает результирующий объект, поэтому ее нельзя применять в запросах, возвращающих данные.

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

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования


Рейтинг Сайтов ДОСКИ.РУ