Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Dit onderwerp bevat een overzicht van en laat zien hoe u de Microsoft-stuurprogramma's voor PHP voor SQL Server gebruikt om een geparameteriseerde query uit te voeren.
De stappen voor het uitvoeren van een geparameteriseerde query kunnen worden samengevat in vier stappen:
Plaats vraagtekens (?) als tijdelijke aanduidingen voor parameters in de Transact-SQL tekenreeks die de query is die moet worden uitgevoerd.
Initialiseer of werk PHP-variabelen bij die overeenkomen met de tijdelijke aanduidingen in de Transact-SQL query.
Gebruik PHP-variabelen uit stap 2 om een matrix met parameterwaarden te maken of bij te werken die overeenkomen met tijdelijke aanduidingen voor parameters in de Transact-SQL tekenreeks. De parameterwaarden in de matrix moeten zich in dezelfde volgorde bevinden als de tijdelijke aanduidingen die zijn bedoeld om deze weer te geven.
Voer de query uit:
Als u het SQLSRV-stuurprogramma gebruikt, maakt u gebruik van sqlsrv_query of sqlsrv_prepare/ en sqlsrv_execute.
Als u de PDO_SQLSRV-driver gebruikt, voert u de query uit met PDO::prepare en PDOStatement::execute. De onderwerpen voor PDO::prepare en PDOStatement::execute hebben voorbeeldcode.
In de rest van dit onderwerp worden geparameteriseerde query's besproken met behulp van het SQLSRV-stuurprogramma.
Opmerking
Parameters zijn impliciet gebonden met behulp van sqlsrv_prepare. Dit betekent dat als een geparameteriseerde query wordt voorbereid met behulp van sqlsrv_prepare en waarden in de parametermatrix worden bijgewerkt, de bijgewerkte waarden worden gebruikt bij de volgende uitvoering van de query. Zie het tweede voorbeeld in dit onderwerp voor meer informatie.
Queryvoorbeeld
In het volgende voorbeeld wordt de hoeveelheid voor een opgegeven product-id bijgewerkt in de tabel Production.ProductInventory van de AdventureWorks-database. De hoeveelheid en product-id zijn parameters in de UPDATE-query.
In het voorbeeld wordt vervolgens een query uitgevoerd op de database om te controleren of de hoeveelheid correct is bijgewerkt. De product-id is een parameter in de SELECT-query.
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 Transact-SQL query.
Use question marks as parameter placeholders. */
$tsql1 = "UPDATE Production.ProductInventory
SET Quantity = ?
WHERE ProductID = ?";
/* Initialize $qty and $productId */
$qty = 10; $productId = 709;
/* Execute the statement with the specified parameter values. */
$stmt1 = sqlsrv_query( $conn, $tsql1, array($qty, $productId));
if( $stmt1 === false )
{
echo "Statement 1 could not be executed.\n";
die( print_r( sqlsrv_errors(), true));
}
/* Free statement resources. */
sqlsrv_free_stmt( $stmt1);
/* Now verify the updated quantity.
Use a question mark as parameter placeholder. */
$tsql2 = "SELECT Quantity
FROM Production.ProductInventory
WHERE ProductID = ?";
/* Execute the statement with the specified parameter value.
Display the returned data if no errors occur. */
$stmt2 = sqlsrv_query( $conn, $tsql2, array($productId));
if( $stmt2 === false )
{
echo "Statement 2 could not be executed.\n";
die( print_r(sqlsrv_errors(), true));
}
else
{
$qty = sqlsrv_fetch_array( $stmt2);
echo "There are $qty[0] of product $productId in inventory.\n";
}
/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt2);
sqlsrv_close( $conn);
?>
In het vorige voorbeeld wordt de sqlsrv_query-functie gebruikt om query's uit te voeren. Deze functie is geschikt voor het uitvoeren van eenmalige query's, omdat hiermee zowel de voorbereiding van de instructie als de uitvoering worden uitgevoerd. De combinatie van sqlsrv_prepare/sqlsrv_execute is het beste voor het opnieuw uitvoeren van een query met verschillende parameterwaarden. Zie het volgende voorbeeld voor een voorbeeld van het opnieuw uitvoeren van een query met verschillende parameterwaarden.
Voorbeeld voorbereiden
In het volgende voorbeeld ziet u de impliciete binding van variabelen wanneer u de functie sqlsrv_prepare gebruikt. In het voorbeeld worden verschillende verkooporders ingevoegd in de tabel Sales.SalesOrderDetail . De $params matrix is gebonden aan de instructie ($stmt) wanneer sqlsrv_prepare wordt aangeroepen. Voordat elke uitvoering van een query die een nieuwe verkooporder in de tabel invoegt, wordt de $params matrix bijgewerkt met nieuwe waarden die overeenkomen met verkooporderdetails. De volgende queryuitvoering maakt gebruik van de nieuwe parameterwaarden.
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));
}
$tsql = "INSERT INTO Sales.SalesOrderDetail (SalesOrderID,
OrderQty,
ProductID,
SpecialOfferID,
UnitPrice)
VALUES (?, ?, ?, ?, ?)";
/* Each sub array here will be a parameter array for a query.
The values in each sub array are, in order, SalesOrderID, OrderQty,
ProductID, SpecialOfferID, UnitPrice. */
$parameters = array( array(43659, 8, 711, 1, 20.19),
array(43660, 6, 762, 1, 419.46),
array(43661, 4, 741, 1, 818.70)
);
/* Initialize parameter values. */
$orderId = 0;
$qty = 0;
$prodId = 0;
$specialOfferId = 0;
$price = 0.0;
/* Prepare the statement. $params is implicitly bound to $stmt. */
$stmt = sqlsrv_prepare( $conn, $tsql, array( &$orderId,
&$qty,
&$prodId,
&$specialOfferId,
&$price));
if( $stmt === false )
{
echo "Statement could not be prepared.\n";
die( print_r( sqlsrv_errors(), true));
}
/* Execute a statement for each set of params in $parameters.
Because $params is bound to $stmt, as the values are changed, the
new values are used in the subsequent execution. */
foreach( $parameters as $params)
{
list($orderId, $qty, $prodId, $specialOfferId, $price) = $params;
if( sqlsrv_execute($stmt) === false )
{
echo "Statement could not be executed.\n";
die( print_r( sqlsrv_errors(), true));
}
else
{
/* Verify that the row was successfully inserted. */
echo "Rows affected: ".sqlsrv_rows_affected( $stmt )."\n";
}
}
/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn);
?>
Zie ook
Beveiligingsoverwegingen voor de Microsoft-stuurprogramma's voor PHP voor SQL Server