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