Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Создает ресурс инструкции, связанный с указанным соединением. Эта функция удобна для выполнения нескольких запросов.
Синтаксис
sqlsrv_prepare(resource $conn, string $tsql [, array $params [, array $options]])
Параметры
$conn: ресурс подключения, связанный с созданной инструкцией.
$tsql: выражение Transact-SQL, соответствующее созданной инструкции.
$params (необязательно): массив значений, которые соответствуют параметрам в параметризованном запросе. Каждый элемент массива может быть одним из следующих значений:
Буквенное значение.
Ссылка на переменную PHP.
Массив со следующей структурой:
array(&$value [, $direction [, $phpType [, $sqlType]]])Примечание.
Переменные, передаваемые в виде параметров запроса, должны передаваться по ссылке, а не по значению. Например, передайте
&$myVariableвместо$myVariable. При выполнении запроса с параметрами по значению выдается предупреждение PHP.Эти элементы массива описаны в следующей таблице:
Элемент Description &$value Буквенное значение или ссылка на переменную PHP. $direction(необязательно) Одна из следующих констант SQLSRV_PARAM_*, используемая для указания направления параметра: SQLSRV_PARAM_IN, SQLSRV_PARAM_OUT, SQLSRV_PARAM_INOUT. Значение по умолчанию — SQLSRV_PARAM_IN.
Дополнительные сведения о константах PHP см. в статье Константы (Драйверы Microsoft SQL Server для PHP).$phpType(необязательно) Константа SQLSRV_PHPTYPE_*, указывающая тип данных PHP для возвращаемого значения. $sqlType(необязательно) Константа SQLSRV_SQLTYPE_*, указывающая тип данных SQL Server для входного значения.
$options (необязательно): ассоциативный массив, который задает свойства запроса. В приведенной ниже таблице содержится перечень поддерживаемых ключей и соответствующих значений.
| Ключ | Поддерживаемые значения | Description |
|---|---|---|
| ClientBufferMaxKBSize | Положительное целое число | Задает размер буфера, который содержит результирующий набор для клиентского курсора. Значение по умолчанию — 10 240 КБ. Дополнительные сведения см. в статье Указание типа курсора и выбор строк. |
| DecimalPlaces | Целое число от 0 до 4 (включительно) | Указывает число десятичных знаков при форматировании полученных денежных значений. Любое отрицательное целое число или значение больше 4 будет игнорироваться. Этот параметр работает, только если параметру FormatDecimals установлено значение true. |
| FormatDecimals | true или false Значение по умолчанию равно false. |
Указывает, следует ли добавлять начальные нули к десятичным строкам, когда это применимо, и включает параметр DecimalPlaces для форматирования денежных типов.Дополнительные сведения см. в статье Форматирование десятичных строк и денежных значений (драйвер SQLSRV). |
| QueryTimeout | Положительное целое число | Задает время ожидания выполнения запроса в секундах. По умолчанию драйвер ожидает результаты бесконечно. |
| ReturnDatesAsStrings | true или false Значение по умолчанию равно false. |
Настраивает оператор для получения типов даты и времени в виде строк (true). Дополнительные сведения см. в практическом руководстве по получению типов даты и времени в виде строк с помощью драйвера SQLSRV. |
| Прокручиваемый | SQLSRV_CURSOR_FORWARD SQLSRV_CURSOR_STATIC SQLSRV_CURSOR_DYNAMIC SQLSRV_CURSOR_KEYSET SQLSRV_CURSOR_CLIENT_BUFFERED |
Дополнительные сведения об этих значениях см. в статье Указание типа курсора и выбор строк. |
| SendStreamParamsAtExec | true или false Значение по умолчанию — true |
Настраивает драйвер для отправки всех потоковых данных во время выполнения (true) или отправки потоковых данных в виде блоков (false). По умолчанию устанавливается значение true. Дополнительные сведения см. в статье sqlsrv_send_stream_data. |
Возвращаемое значение
Ресурс инструкции. Если не удается создать ресурс инструкции, возвращается значение false .
Замечания
При подготовке инструкции, которая использует переменные в качестве параметров, эти переменные привязываются к инструкции. Это означает, что в случае обновления значений переменных при следующем выполнении инструкции она будет использовать обновленные значения параметров.
Сочетание sqlsrv_prepare и sqlsrv_execute разделяет подготовку и выполнение инструкции между двумя вызовами функции и может использоваться для выполнения параметризованных запросов. Эта функция оптимально подходит для многократного выполнения инструкции с различными значениями параметров для каждого выполнения.
Сведения об альтернативных стратегиях для записи и чтения больших объемов информации см. в статьях Пакеты инструкций SQL и BULK INSERT.
Дополнительные сведения см. в статье Практическое руководство. Извлечение параметров вывода с помощью драйвера SQLSRV.
Пример 1
Следующий пример подготавливает и выполняет инструкцию. При выполнении инструкция (см. sqlsrv_execute) обновляет поле в таблице Sales.SalesOrderDetail базы данных AdventureWorks. В примере предполагается, что SQL Server и базы данных AdventureWorks установлены на локальном компьютере. При выполнении примера из командной строки все выходные данные выводятся в консоль.
<?php
/* Connect to the local server using Windows Authentication and
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array("Database"=>"AdventureWorks");
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
echo "Could not connect.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Set up Transact-SQL query. */
$tsql = "UPDATE Sales.SalesOrderDetail
SET OrderQty = ?
WHERE SalesOrderDetailID = ?";
/* Assign parameter values. */
$param1 = 5;
$param2 = 10;
$params = array(&$param1, &$param2);
/* Prepare the statement. */
if ($stmt = sqlsrv_prepare($conn, $tsql, $params)) {
echo "Statement prepared.\n";
} else {
echo "Statement could not be prepared.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Execute the statement. */
if (sqlsrv_execute($stmt)) {
echo "Statement executed.\n";
} else {
echo "Statement could not be executed.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Free the statement and connection resources. */
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
Пример 2
Следующий пример показывает, как подготовить инструкцию и затем повторно выполнить ее с другими значениями параметров. Пример обновляет столбец OrderQty в таблице Sales.SalesOrderDetail базы данных AdventureWorks. После завершения обновлений в базу данных направляется запрос, чтобы убедиться, что обновления выполнены успешно. В примере предполагается, что SQL Server и базы данных AdventureWorks установлены на локальном компьютере. При выполнении примера из командной строки все выходные данные выводятся в консоль.
<?php
/* Connect to the local server using Windows Authentication and
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array("Database"=>"AdventureWorks");
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
echo "Could not connect.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Define the parameterized query. */
$tsql = "UPDATE Sales.SalesOrderDetail
SET OrderQty = ?
WHERE SalesOrderDetailID = ?";
/* Initialize parameters and prepare the statement. Variables $qty
and $id are bound to the statement, $stmt1. */
$qty = 0; $id = 0;
$stmt1 = sqlsrv_prepare($conn, $tsql, array(&$qty, &$id));
if ($stmt1) {
echo "Statement 1 prepared.\n";
} else {
echo "Error in statement preparation.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Set up the SalesOrderDetailID and OrderQty information. This array
maps the order ID to order quantity in key=>value pairs. */
$orders = array(1=>10, 2=>20, 3=>30);
/* Execute the statement for each order. */
foreach ($orders as $id => $qty) {
// Because $id and $qty are bound to $stmt1, their updated
// values are used with each execution of the statement.
if (sqlsrv_execute($stmt1) === false) {
echo "Error in statement execution.\n";
die(print_r(sqlsrv_errors(), true));
}
}
echo "Orders updated.\n";
/* Free $stmt1 resources. This allows $id and $qty to be bound to a different statement.*/
sqlsrv_free_stmt($stmt1);
/* Now verify that the results were successfully written by selecting
the newly inserted rows. */
$tsql = "SELECT OrderQty
FROM Sales.SalesOrderDetail
WHERE SalesOrderDetailID = ?";
/* Prepare the statement. Variable $id is bound to $stmt2. */
$stmt2 = sqlsrv_prepare($conn, $tsql, array(&$id));
if ($stmt2) {
echo "Statement 2 prepared.\n";
} else {
echo "Error in statement preparation.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Execute the statement for each order. */
foreach (array_keys($orders) as $id)
{
/* Because $id is bound to $stmt2, its updated value
is used with each execution of the statement. */
if (sqlsrv_execute($stmt2)) {
sqlsrv_fetch($stmt2);
$quantity = sqlsrv_get_field($stmt2, 0);
echo "Order $id is for $quantity units.\n";
} else {
echo "Error in statement execution.\n";
die(print_r(sqlsrv_errors(), true));
}
}
/* Free $stmt2 and connection resources. */
sqlsrv_free_stmt($stmt2);
sqlsrv_close($conn);
?>
Примечание.
Рекомендуется использовать строки в качестве входных данных при привязке значений к десятичным или числовым столбцам, чтобы обеспечить точность и правильность, поскольку PHP имеет ограниченную точность для чисел с плавающей запятой. То же касается и столбцов bigint, особенно в том случае, если значения выходят за пределы диапазона целых чисел.
Пример 3
В этом примере кода показано, как привязать десятичное значение в качестве входного параметра.
<?php
$serverName = "(local)";
$connectionInfo = array("Database"=>"YourTestDB");
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
echo "Could not connect.\n";
die(print_r(sqlsrv_errors(), true));
}
// Assume TestTable exists with a decimal field
$input = "9223372036854.80000";
$params = array($input);
$stmt = sqlsrv_prepare($conn, "INSERT INTO TestTable (DecimalCol) VALUES (?)", $params);
sqlsrv_execute($stmt);
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
См. также
Справочник по API для драйвера SQLSRV
Практическое руководство. Выполнение параметризованных запросов
Информация о примерах кода в документации
Практическое руководство. Отправка данных в виде потока
Использование параметров направления
Обновление данных (драйверы Майкрософт для PHP для SQL Server)