db2_exec

(PECL ibm_db2 >= 1.0.0)

db2_execВыполняет SQL-запрос напрямую

Описание

db2_exec(resource$connection, string$statement, array$options = []): resource|false

Выполняет SQL-запрос напрямую.

Если вы планируете интерполировать переменные PHP в SQL-запрос, имейте в виду, что это одна из наиболее распространённых уязвимостей безопасности. Рассмотрите возможность вызова db2_prepare() для подготовки SQL-запроса с маркерами параметров для входных значений. Затем вы можете вызвать db2_execute(), чтобы передать входные значения и избежать атак SQL-инъекций.

Если вы планируете многократно выполнять один и тот же SQL-запрос с разными параметрами, рассмотрите возможность вызова db2_prepare() и db2_execute(), чтобы сервер базы данных мог повторно использовать свой план доступа и повысить эффективность вашей базы данных.

Список параметров

connection

Допустимая переменная ресурса соединения с базой данных, возвращаемого функцией db2_connect() или db2_pconnect().

statement

SQL-запрос. Запрос не может содержать маркеры параметров.

options

Ассоциативный массив, содержащий параметры оператора. Параметр можно использовать для запроса прокручиваемого курсора на серверах баз данных, поддерживающих эту функцию.

Описание допустимых опций оператора смотрите в разделе db2_set_option().

Возвращаемые значения

Возвращает ресурс оператора, в случае успешного выполнения SQL-запроса или false, если базе данных не удалось выполнить SQL-запрос.

Примеры

Пример #1 Создание таблицы с помощью db2_exec()

В следующем примере db2_exec() используется для выполнения набора DDL-запросов в процессе создания таблицы.

<?php
$conn
= db2_connect($database, $user, $password);

// Создание таблицы test
$create = 'CREATE TABLE animals (id INTEGER, breed VARCHAR(32),
name CHAR(16), weight DECIMAL(7,2))'
;
$result = db2_exec($conn, $create);
if (
$result) {
print
"Таблица создана.\n";
}

// Наполнение таблицы test
$animals = array(
array(
0, 'cat', 'Pook', 3.2),
array(
1, 'dog', 'Peaches', 12.3),
array(
2, 'horse', 'Smarty', 350.0),
array(
3, 'gold fish', 'Bubbles', 0.1),
array(
4, 'budgerigar', 'Gizmo', 0.2),
array(
5, 'goat', 'Rickety Ride', 9.7),
array(
6, 'llama', 'Sweater', 150)
);

foreach (
$animals as $animal) {
$rc = db2_exec($conn, "INSERT INTO animals (id, breed, name, weight)
VALUES (
{$animal[0]}, '{$animal[1]}', '{$animal[2]}', {$animal[3]})");
if (
$rc) {
print
"Добавлена запись... ";
}
}
?>

Результат выполнения приведённого примера:

Таблица создана. Добавлена запись... Добавлена запись... Добавлена запись... Добавлена запись... Добавлена запись... Добавлена запись... Добавлена запись...

Пример #2 Выполнение запроса SELECT с прокручиваемым курсором

В следующем примере показано, как запросить прокручиваемый курсор для SQL-запроса, выданного функцией db2_exec().

<?php
$conn
= db2_connect($database, $user, $password);
$sql = "SELECT name FROM animals
WHERE weight < 10.0
ORDER BY name"
;
if (
$conn) {
require_once
'prepare.inc';
$stmt = db2_exec($conn, $sql, array('cursor' => DB2_SCROLLABLE));
while (
$row = db2_fetch_array($stmt)) {
print
"$row[0]\n";
}
}
?>

Результат выполнения приведённого примера:

Bubbles Gizmo Pook Rickety Ride

Пример #3 Получение XML-данных как SQL ResultSet

В следующем примере показано, как работать с документами, хранящимися в столбце XML с помощью базы данных SAMPLE. Используя довольно простой SQL/XML, этот пример возвращает некоторые узлы в XML-документе в формате SQL ResultSet, с которым знакомо большинство пользователей.

<?php

$conn
= db2_connect("SAMPLE", "db2inst1", "ibmdb2");

$query = 'SELECT * FROM XMLTABLE(
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo\'
COLUMNS
"CID" VARCHAR (50) PATH \'@Cid\',
"NAME" VARCHAR (50) PATH \'name\',
"PHONE" VARCHAR (50) PATH \'phone [ @type = "work"]\'
) AS T
WHERE NAME = \'Kathy Smith\'
'
;
$stmt = db2_exec($conn, $query);

while(
$row = db2_fetch_object($stmt)){
printf("$row->CID$row->NAME$row->PHONE\n");
}
db2_close($conn);

?>

Результат выполнения приведённого примера:

1000 Kathy Smith 416-555-1358 1001 Kathy Smith 905-555-7258

Пример #4 Выполнение "JOIN" с данными XML

Следующий пример работает с документами, хранящимися в 2 разных столбцах XML в базе данных SAMPLE. Он создаёт 2 временные таблицы из XML-документов из 2 разных столбца и возвращает SQL ResultSet с информацией о статусе доставки для клиента.

<?php

$conn
= db2_connect("SAMPLE", "db2inst1", "ibmdb2");

$query = '
SELECT A.CID, A.NAME, A.PHONE, C.PONUM, C.STATUS
FROM
XMLTABLE(
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo\'
COLUMNS
"CID" BIGINT PATH \'@Cid\',
"NAME" VARCHAR (50) PATH \'name\',
"PHONE" VARCHAR (50) PATH \'phone [ @type = "work"]\'
) as A,
PURCHASEORDER AS B,
XMLTABLE (
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("PURCHASEORDER.PORDER")/PurchaseOrder\'
COLUMNS
"PONUM" BIGINT PATH \'@PoNum\',
"STATUS" VARCHAR (50) PATH \'@Status\'
) as C
WHERE A.CID = B.CUSTID AND
B.POID = C.PONUM AND
A.NAME = \'Kathy Smith\'
'
;

$stmt = db2_exec($conn, $query);

while(
$row = db2_fetch_object($stmt)){
printf("$row->CID$row->NAME$row->PHONE$row->PONUM$row->STATUS\n");
}

db2_close($conn);

?>

Результат выполнения приведённого примера:

1001 Kathy Smith 905-555-7258 5002 Shipped

Пример #5 Возврат SQL-данных как части большого XML-документа

Следующий пример работает с частью документов PRODUCT.DESCRIPTION в базе данных SAMPLE. Он создаёт XML-документ, содержащий описание продукта (данные XML) и информацию о ценах (данные SQL).

<?php

$conn
= db2_connect("SAMPLE", "db2inst1", "ibmdb2");

$query = '
SELECT
XMLSERIALIZE(
XMLQUERY(\'
declare boundary-space strip;
declare default element namespace "http://posample.org";
<promoList> {
for $prod in $doc/product
where $prod/description/price < 10.00
order by $prod/description/price ascending
return(
<promoitem> {
$prod,
<startdate> {$start} </startdate>,
<enddate> {$end} </enddate>,
<promoprice> {$promo} </promoprice>
} </promoitem>
)
} </promoList>
\' passing by ref DESCRIPTION AS "doc",
PROMOSTART as "start",
PROMOEND as "end",
PROMOPRICE as "promo"
RETURNING SEQUENCE)
AS CLOB (32000))
AS NEW_PRODUCT_INFO
FROM PRODUCT
WHERE PID = \'100-100-01\'
'
;

$stmt = db2_exec($conn, $query);

while(
$row = db2_fetch_array($stmt)){
printf("$row[0]\n");
}
db2_close($conn);

?>

Результат выполнения приведённого примера:

<promoList xmlns="http://posample.org"> <promoitem> <product pid="100-100-01"> <description> <name>Snow Shovel, Basic 22 inch</name> <details>Basic Snow Shovel, 22 inches wide, straight handle with D-Grip</details> <price>9.99</price> <weight>1 kg</weight> </description> </product> <startdate>2004-11-19</startdate> <enddate>2004-12-19</enddate> <promoprice>7.25</promoprice> </promoitem> </promoList>

Смотрите также

  • db2_execute() - Выполняет подготовленный SQL-запрос
  • db2_prepare() - Подготавливает SQL-запрос к выполнению
To Top