Procédure : exécuter une requête à plusieurs reprises

L'exemple de cette rubrique montre comment utiliser le Pilote SQL Server pour PHP afin d'exécuter à plusieurs reprises une instruction préparée. En associant sqlsrv_prepare et sqlsrv_execute, une instruction est compilée une seule fois sur le serveur et peut ensuite être exécutée à plusieurs reprises avec différentes valeurs de paramètre.

Cc296157.note(fr-fr,SQL.90).gifRemarque :
Pour les requêtes à usage unique, il est conseillé d'utiliser sqlsrv_query.

Lorsque vous préparez une instruction qui utilise des variables en tant que paramètres, ces variables sont liées à l'instruction. En d'autres termes, si vous mettez à jour les valeurs des variables, la prochaine fois que vous exécuterez l'instruction, elle utilisera des valeurs de paramètre mises à jour.

Exemple

L'exemple suivant montre comment préparer une instruction, puis comment la réexécuter avec d'autres valeurs de paramètre. L'exemple met à jour la colonne OrderQty de la table Sales.SalesOrderDetail dans la base de données AdventureWorks. Une fois les mises à jour effectuées, la base de données est interrogée pour vérifier si les mises à jour ont réussi. 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 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);
?>

Pour obtenir d'autres stratégies en matière d'écriture et de lecture de grandes quantités d'informations, consultez Batches of SQL Statements (en anglais) et BULK INSERT.

Voir aussi

Tâches

Procédure : exécuter des requêtes paramétrées
Procédure : utiliser plusieurs jeux de résultats

Autres ressources

Considérations relatives à la conception
Récupération des données
Mise à jour des données (pilote SQL Server pour PHP)
Référence de l'API (Pilote SQL Server pour PHP)