Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Vytváří příkazový zdroj přiřazený k danému spojení. Tato funkce je užitečná pro provádění více dotazů.
Syntax
sqlsrv_prepare(resource $conn, string $tsql [, array $params [, array $options]])
Parameters
$conn: Zdroj spojení spojený s vytvořeným příkazem.
$tsql: Transact-SQL výraz, který odpovídá vytvořenému tvrzení.
$params [VOLITELNÉ]: Pole hodnot odpovídajících parametrům v parametrizovaném dotazu. Každý prvek pole může být jedním z následujících:
Doslovná hodnota.
Odkaz na proměnnou v PHP.
Pole s následující strukturou:
array(&$value [, $direction [, $phpType [, $sqlType]]])Note
Proměnné předávané jako parametry dotazu by měly být předávány podle odkazu místo podle hodnoty. Například pass
&$myVariablemísto .$myVariablePři spuštění dotazu s parametry podle hodnoty se zobrazí PHP varování.Následující tabulka popisuje tyto prvky pole:
prvek Description &$value Doslovná hodnota nebo odkaz na proměnnou v PHP. $direction[VOLITELNÉ] Jedna z následujících SQLSRV_PARAM_* konstant používaných k označení směru parametru: SQLSRV_PARAM_IN, SQLSRV_PARAM_OUT, SQLSRV_PARAM_INOUT. Výchozí hodnota je SQLSRV_PARAM_IN.
Pro více informací o konstantách v PHP viz Konstanty (Microsoft Drivers for PHP for SQL Server).$phpType[VOLITELNÉ] Konstanta SQLSRV_PHPTYPE_*, která specifikuje PHP datový typ vrácené hodnoty. $sqlType[VOLITELNÉ] Konstanta SQLSRV_SQLTYPE_*, která určuje SQL Server datový typ vstupní hodnoty.
$options [OPTIONAL]: Asociativní pole, které nastavuje vlastnosti dotazu. Následující tabulka uvádí podporované klíče a odpovídající hodnoty:
| Key | Podporované hodnoty | Description |
|---|---|---|
| ClientBufferMaxKBSize | Kladné celé číslo | Konfiguruje velikost bufferu, který uchovává výslednou množinu pro kurzor na straně klienta. Výchozí hodnota je 10240 KB. Pro více informací si přečtěte Specifikace typu kurzoru a Výběr řádků. |
| Desetinná místa | Celé číslo mezi 0 a 4 (včetně) | Určuje desetinná místa při formátování načtených hodnot peněz. Jakékoli záporné celé číslo nebo hodnota větší než 4 budou ignorovány. Tato možnost funguje pouze tehdy, když je FormatDecimals pravdivá. |
| FormátDesetinnýchČísel |
true nebo false Výchozí hodnota je false. |
Určuje, jestli se mají počáteční nuly přidat k desítkovým řetězcům, pokud je to vhodné, a povolí DecimalPlaces možnost formátování typů peněz.Pro více informací viz Formátování desetinných řetězců a peněžních hodnot (SQLSRV Driver). |
| Dotazovací časový limit | Kladné celé číslo | Nastaví časový limit dotazu na sekundy. Ve výchozím nastavení ovladač čeká na výsledky neomezeně dlouho. |
| ReturnDatesAsStrings |
true nebo false Výchozí hodnota je false. |
Konfiguruje tvrzení tak, aby načítalo typy dat a času jako řetězce (true). Pro více informací si přečtěte Jak získat typy dat a času jako řetězce pomocí ovladače SQLSRV. |
| Scrollovatelný | SQLSRV_CURSOR_FORWARD SQLSRV_CURSOR_STATIC SQLSRV_CURSOR_DYNAMIC SQLSRV_CURSOR_KEYSET SQLSRV_CURSOR_CLIENT_BUFFERED |
Pro více informací o těchto hodnotách viz Specifikace typu kurzoru a Výběr řádků. |
| SendStreamParamsAtExec |
true nebo false Výchozí hodnota je true. |
Konfiguruje ovladač tak, aby při vykonání odesílal všechna data proudu (pravda) nebo aby data proudu odesílal v částech (nepravda). Ve výchozím nastavení je hodnota nastavena na true. Pro více informací viz sqlsrv_send_stream_data. |
Návratová hodnota
Zdroj prohlášení. Pokud nelze příkazový zdroj vytvořit, vrací se false (nepravdy ).
Remarks
Když připravujete příkaz, který používá proměnné jako parametry, proměnné jsou vázány na tento příkaz. To znamená, že pokud aktualizujete hodnoty proměnných, příště při spuštění příkazu se spustí s aktualizovanými hodnotami parametrů.
Kombinace sqlsrv_prepare a sqlsrv_execute rozděluje přípravu a provádění příkazů na dvě funkční volání a může být použita k provádění parametrizovaných dotazů. Tato funkce je ideální pro opakované provádění příkazu s různými hodnotami parametrů pro každé provedení.
Pro alternativní strategie psaní a čtení velkého množství informací viz Batches of SQL Statements a BULK INSERT.
Pro více informací viz Jak načíst: Získat výstupní parametry pomocí ovladače SQLSRRV.
Příklad 1
Následující příklad připravuje a vykonává příkaz. Příkaz po vykonání (viz sqlsrv_execute) aktualizuje pole v tabulce Sales.SalesOrderDetail v databázi AdventureWorks. Příklad předpokládá, že SQL Server a databáze AdventureWorks jsou nainstalovány v místním počítači. Při spuštění příkladu z příkazového řádku se veškerý výstup zapíše do konzoly.
<?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);
?>
Příklad 2
Následující příklad ukazuje, jak připravit příkaz a poté jej znovu vykonat s různými hodnotami parametrů. Příklad aktualizuje sloupec OrderQty tabulky Sales.SalesOrderDetail v databázi AdventureWorks. Po dokončení aktualizací je databáze dotazována, zda byly aktualizace úspěšné. Příklad předpokládá, že SQL Server a databáze AdventureWorks jsou nainstalovány v místním počítači. Při spuštění příkladu z příkazového řádku se veškerý výstup zapíše do konzoly.
<?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);
?>
Note
Doporučuje se používat řetězce jako vstupy při vázání hodnot na desetinný nebo číselný sloupec , aby byla zajištěna přesnost a přesnost, protože PHP má omezenou přesnost pro čísla s plovoucí desetinnou čárkou. Totéž platí pro sloupce bigint, zejména když hodnoty přesahují rozsah celého čísla.
Příklad 3
Tento vzor kódu ukazuje, jak navázat desetinnou hodnotu jako vstupní parametr.
<?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);
?>
Viz také
Referenční informace k rozhraní API ovladače SQLSRV
Postupy: Provádění parametrizovaných dotazů
O příkladech kódu v dokumentaci
Postupy: Odesílání dat jako streamu
Aktualizace dat (ovladače Microsoftu pro PHP pro SQL Server)