Procédure : exécuter des requêtes paramétrées

Cette rubrique résume et illustre l'utilisation du Pilote SQL Server pour PHP dans le cadre de l'exécution d'une requête paramétrable.

La procédure à suivre pour exécuter une requête paramétrable peut se résumer en quatre étapes :

  1. Placez des points d'interrogation (?) en tant qu'espaces réservés aux paramètres dans la chaîne Transact-SQL qui représente la requête à exécuter.
  2. Initialisez ou mettez à jour les variables PHP qui correspondent aux espaces réservés dans la requête Transact-SQL.
  3. Utilisez les variables PHP de l'étape 2 pour créer ou mettre à jour un tableau de valeurs de paramètre dont l'ordre correspond aux espaces réservés aux paramètres dans la chaîne Transact-SQL.
  4. Exécutez la requête avec sqlsrv_query ou sqlsrv_prepare/sqlsrv_execute.
Cc296201.note(fr-fr,SQL.90).gifRemarque :
Les paramètres sont implicitement liés à l'aide de sqlsrv_prepare. En d'autres termes, si une requête paramétrable est préparée à l'aide de sqlsrv_prepare et si les valeurs du tableau de paramètres sont mises à jour, ces dernières sont utilisées lors de la prochaine exécution de la requête. Pour plus d'informations, consultez le deuxième exemple de cette rubrique.

Exemple

L'exemple suivant montre comment mettre à jour la quantité correspondant à un ID de produit spécifique dans la table Production.ProductInventory de la base de données AdventureWorks. La quantité et l'ID de produit sont des paramètres dans la requête UPDATE.

L'exemple montre ensuite comment interroger la base de données pour vérifier si la quantité a été correctement mise à jour. L'ID de produit est un paramètre dans la requête SELECT.

L'exemple suppose que SQL Server et la base de données AdventureWorks sont installés sur l'ordinateur local. Toutes les données de sortie sont écrites dans la console lorsque l'exemple est exécuté à partir de la ligne de commande.

<?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);
?>

L'exemple précédent utilise la fonction sqlsrv_query pour exécuter les requêtes. Cette fonction est adaptée à l'exécution de requêtes à usage unique, car elle effectue à la fois la préparation et l'exécution des instructions. La combinaison sqlsrv_prepare/sqlsrv_execute est idéale pour la réexécution d'une requête avec des valeurs de paramètre différentes. Pour obtenir un exemple de réexécution de requête avec des valeurs de paramètre différentes, consultez le prochain exemple ou Procédure : exécuter une requête à plusieurs reprises.

L'exemple suivant illustre la liaison implicite des variables lorsque vous utilisez la fonction sqlsrv_prepare. L'exemple montre comment insérer plusieurs commandes client dans la table Sales.SalesOrderDetail. Le tableau $params est lié à l'instruction ($stmt) lorsque sqlsrv_prepare est appelé. Avant chaque exécution d'une requête qui insère une nouvelle commande client dans la table, le tableau $params est mis à jour à partir des nouvelles valeurs correspondant aux détails des commandes client. L'exécution de requête suivante utilise les nouvelles valeurs de paramètre.

L'exemple suppose que SQL Server et la base de données AdventureWorks sont installés sur l'ordinateur local. Toutes les données de sortie sont écrites dans la console lorsque l'exemple est exécuté à partir de la ligne de commande.

<?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);
?>

Voir aussi

Référence

sqlsrv_rows_affected

Concepts

Considérations relatives à la sécurité
À propos des exemples de code dans la documentation

Autres ressources

Considérations relatives à la conception
Conversion des types de données