Share via


Hoe te: Een geparameteriseerde query uitvoeren

PHP-stuurprogramma downloaden

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:

  1. Plaats vraagtekens (?) als tijdelijke aanduidingen voor parameters in de Transact-SQL tekenreeks die de query is die moet worden uitgevoerd.

  2. Initialiseer of werk PHP-variabelen bij die overeenkomen met de tijdelijke aanduidingen in de Transact-SQL query.

  3. 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.

  4. Voer de query uit:

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

Gegevenstypen converteren

Beveiligingsoverwegingen voor de Microsoft-stuurprogramma's voor PHP voor SQL Server

Informatie over codevoorbeelden in de documentatie

sqlsrv_rows_affected