Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Maakt een statementresource aan die gekoppeld is aan de opgegeven verbinding. Deze functie is nuttig voor het uitvoeren van meerdere queries.
Syntax
sqlsrv_prepare(resource $conn, string $tsql [, array $params [, array $options]])
Parameters
$conn: De verbindingsbron die gekoppeld is aan de aangemaakte statement.
$tsql: De Transact-SQL uitdrukking die overeenkomt met de gemaakte statement.
$params [OPTIONEEL]: Een array van waarden die overeenkomen met parameters in een geparametriseerde query. Elk element van de array kan een van de volgende zijn:
Een letterlijke waarde.
Een verwijzing naar een PHP-variabele.
Een array met de volgende structuur:
array(&$value [, $direction [, $phpType [, $sqlType]]])Note
Variabelen die als queryparameters worden doorgegeven, moeten via referentie worden doorgegeven in plaats van per waarde. Bijvoorbeeld, pass
&$myVariablein plaats van$myVariable. Er wordt een PHP-waarschuwing gegeven wanneer een query met parameters per waarde wordt uitgevoerd.De volgende tabel beschrijft deze array-elementen:
Element Description &$value Een letterlijke waarde of een verwijzing naar een PHP-variabele. $direction[OPTIONEEL] Een van de volgende SQLSRV_PARAM_* constanten die wordt gebruikt om de parameterrichting aan te geven: SQLSRV_PARAM_IN, SQLSRV_PARAM_OUT, SQLSRV_PARAM_INOUT. De standaardwaarde is SQLSRV_PARAM_IN.
Voor meer informatie over PHP-constanten, zie Constants (Microsoft Drivers for PHP for SQL Server).$phpType[OPTIONEEL] Een SQLSRV_PHPTYPE_* constante die het PHP-datatype van de teruggegeven waarde specificeert. $sqlType[OPTIONEEL] Een SQLSRV_SQLTYPE_* constante die het SQL Server datatype van de invoerwaarde specificeert.
$options [OPTIONEEL]: Een associatieve array die query-eigenschappen bepaalt. De volgende tabel geeft een overzicht van de ondersteunde sleutels en bijbehorende waarden:
| Key | Ondersteunde waarden | Description |
|---|---|---|
| ClientBufferMaxKBSize | Een positief geheel getal | Stel de grootte van de buffer in die de resultaatset voor een client-side cursor bevat. De standaard is 10240 KB. Voor meer informatie, lees Specificering van een cursortype en Selectie van rijen. |
| DecimalPlaces | Een geheel getal tussen 0 en 4 (inclusief) | Hiermee stelt u het aantal decimalen in bij het formatteren van opgehaalde geldbedragen. Alle negatieve gehele getallen of waarden die meer dan 4 zijn, worden genegeerd. Deze optie werkt alleen wanneer FormatDecimals waar is. |
| FormatDecimals |
waar of onwaar De standaardwaarde is onwaar. |
Hiermee geeft u op of voorloopnullen moeten worden toegevoegd aan decimale tekenreeksen, indien van toepassing en wordt de optie voor het DecimalPlaces opmaken van geldtypen ingeschakeld.Voor meer informatie, zie Formatting Decimale Strings and Money Values (SQLSRV Driver). |
| QueryTimeout | Een positief geheel getal | Stelt de query-timeout in binnen enkele seconden. Standaard wacht de driver eindeloos op de resultaten. |
| ReturnDatesAsStrings |
waar of onwaar De standaardwaarde is onwaar. |
Stelt de instructie zo in dat datum- en tijdtypes als strings (waar) worden opgehaald. Voor meer informatie, lees Hoe je: Datum- en tijdtypes ophalen als strings met de SQLSRV-driver. |
| Schuifbaar | SQLSRV_CURSOR_FORWARD SQLSRV_CURSOR_STATIC SQLSRV_CURSOR_DYNAMIC SQLSRV_CURSOR_KEYSET SQLSRV_CURSOR_CLIENT_BUFFERED |
Voor meer informatie over deze waarden, zie Specificering van een cursortype en Selectie van rijen. |
| SendStreamParamsAtExec |
waar of onwaar De standaardwaarde is waar. |
Je configureert de driver om alle stroomdata bij uitvoering te verzenden (waar), of om stroomgegevens in chunks te sturen (vals). Standaard wordt de waarde op waar gezet. Voor meer informatie, zie sqlsrv_send_stream_data. |
Retourwaarde
Een bron voor verklaringen. Als de instructieresource niet kan worden aangemaakt, wordt false teruggegeven.
Remarks
Wanneer je een statement voorbereidt die variabelen als parameters gebruikt, zijn de variabelen aan de statement gebonden. Dat betekent dat als je de waarden van de variabelen bijwerkt, de volgende keer dat je de instructie uitvoert, deze met bijgewerkte parameterwaarden zal draaien.
De combinatie van sqlsrv_prepare en sqlsrv_execute scheidt de voorbereiding en uitvoering van een statement in twee functieaanroepen en kan worden gebruikt om geparametriseerde queries uit te voeren. Deze functie is ideaal om een instructie meerdere keren uit te voeren met verschillende parameterwaarden voor elke uitvoering.
Voor alternatieve strategieën voor het schrijven en lezen van grote hoeveelheden informatie, zie Batches of SQL Statements en BULK INSERT.
Voor meer informatie, zie Hoe je: Outputparameters ophalen met de SQLSRV-driver.
Voorbeeld 1
Het volgende voorbeeld bereidt een instructie voor en voert deze uit. De instructie, wanneer uitgevoerd (zie sqlsrv_execute), werkt een veld bij in de Sales.SalesOrderDetail-tabel van de AdventureWorks-database. In het voorbeeld wordt ervan uitgegaan dat SQL Server en de AdventureWorks-database op de lokale computer zijn geïnstalleerd. Alle uitvoer wordt naar de console geschreven wanneer het voorbeeld via de opdrachtregel wordt uitgevoerd.
<?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);
?>
Voorbeeld 2
Het volgende voorbeeld laat zien hoe je een statement voorbereidt en deze vervolgens opnieuw uitvoert met verschillende parameterwaarden. Het voorbeeld werkt de kolom OrderQty van de Sales.SalesOrderDetail-tabel in de AdventureWorks-database bij. Nadat de updates hebben plaatsgevonden, wordt de database doorzocht om te verifiëren dat de updates succesvol waren. In het voorbeeld wordt ervan uitgegaan dat SQL Server en de AdventureWorks-database op de lokale computer zijn geïnstalleerd. Alle uitvoer wordt naar de console geschreven wanneer het voorbeeld via de opdrachtregel wordt uitgevoerd.
<?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
Het wordt aanbevolen om strings als invoer te gebruiken bij het binden van waarden aan een decimale of numerieke kolom om precisie en nauwkeurigheid te waarborgen, aangezien PHP beperkte precisie heeft voor drijvendekommagetallen. Hetzelfde geldt voor bigintkolommen, vooral wanneer de waarden buiten het bereik van een geheel getal liggen.
Voorbeeld 3
Dit codevoorbeeld laat zien hoe een decimale waarde als invoerparameter wordt gebind.
<?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);
?>
Zie ook
Naslaginformatie over de API voor SQLSRV-stuurprogramma's
Procedure: Geparameteriseerde query's uitvoeren
Informatie over codevoorbeelden in de documentatie
Procedure: Gegevens verzenden als een stream
Directionele parameters gebruiken
Gegevens bijwerken (Microsoft-stuurprogramma's voor PHP voor SQL Server)