sqlsrv_prepare

(No version information available, might only be in Git)

sqlsrv_prepare — PrĂ©pare une requĂȘte pour exĂ©cution

Description

function sqlsrv_prepare(
    resource $conn,
    string $sql,
    array $params = ?,
    array $options = ?
): mixed

PrĂ©pare une requĂȘte pour exĂ©cution. Cette fonction est idĂ©ale pour prĂ©parer une requĂȘte qui sera exĂ©cutĂ©e plusieurs fois avec des valeurs de paramĂštres diffĂ©rents.

Liste de paramĂštres

conn
Une ressource de connexion retournée par la fonction sqlsrv_connect().
sql
La chaĂźne qui dĂ©finit la requĂȘte Ă  prĂ©parer et Ă  exĂ©cuter.
params

Un tableau spĂ©cifiant les informations de paramĂštres lors de l'exĂ©cution d'une requĂȘte contenant des paramĂštres. Les Ă©lĂ©ments du tableau peuvent ĂȘtre n'importe lequel de ceux qui suivent :

  • Une valeur littĂ©rale
  • Une variable PHP
  • Un tableau avec la structure suivante : array($value [, $direction [, $phpType [, $sqlType]]])
La table suivante décrit les éléments de la structure du tableau ci-dessus :
Structure du tableau
ÉlĂ©ment Description
$value Une valeur littérale, une variable PHP ou une variable PHP passée par référence.
$direction (optional) Une des constantes SQLSRV suivantes, utilisées pour indiquer la direction du paramÚtre : SQLSRV_PARAM_IN, SQLSRV_PARAM_OUT, SQLSRV_PARAM_INOUT. La valeur par défaut est SQLSRV_PARAM_IN.
$phpType (optional) Une constante SQLSRV_PHPTYPE_* qui spécifie le type de données PHP de la valeur retournée.
$sqlType (optional) Une constante SQLSRV_SQLTYPE_* qui spécifie le type de données du serveur SQL de la valeur d'entrée.
options
Un tableau spĂ©cifiant les options de propriĂ©tĂ©s de la requĂȘte. Les clĂ©s supportĂ©es sont dĂ©crites dans le tableau suivant :
Options de la requĂȘte
Clé Valeurs Description
QueryTimeout Une valeur entiĂšre positive. DĂ©finit le dĂ©lai maximal d'exĂ©cution de la requĂȘte, en seconde. Par dĂ©faut, le driver attendra indĂ©finiment les rĂ©sultats.
SendStreamParamsAtExec true ou false (par défaut, true) Configure le driver pour envoyer les données du flux à l'exécution (true), ou envoyer les données du flux par morceaux (false). Par défaut, la valeur est définie à true. Pour plus d'informations, se reporter à la fonction sqlsrv_send_stream_data().
Scrollable SQLSRV_CURSOR_FORWARD, SQLSRV_CURSOR_STATIC, SQLSRV_CURSOR_DYNAMIC, ou SQLSRV_CURSOR_KEYSET Voir la section sur » la spécification d'un type de curseur et la sélection de lignes de la documentation Microsoft SQLSRV.

Valeurs de retour

Retourne une ressource de requĂȘte en cas de succĂšs, ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec sqlsrv_prepare()

Cet exemple montre la façon de prĂ©parer une requĂȘte avec la fonction sqlsrv_prepare() et sa rĂ©-exĂ©cution Ă  plusieurs reprises (avec des valeurs de paramĂštres diffĂ©rents) en utilisant la fonction sqlsrv_execute().

<?php
$serverName
= "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if(
$conn === false) {
die(
print_r( sqlsrv_errors(), true));
}

$sql = "UPDATE Table_1
SET OrderQty = ?
WHERE SalesOrderID = ?"
;

// Initialise les paramĂštres et prĂ©pare la requĂȘte.
// Les variables $qty et $id sont liĂ©es Ă  la requĂȘte $stmt.
$qty = 0; $id = 0;
$stmt = sqlsrv_prepare( $conn, $sql, array( &$qty, &$id));
if( !
$stmt ) {
die(
print_r( sqlsrv_errors(), true));
}

// Définit les informations SalesOrderDetailID et OrderQty.
// Ce tableau lie l'ordre des IDs avec l'ordre des quantités avec des paires clé=>valeur.
$orders = array( 1=>10, 2=>20, 3=>30);

// ExĂ©cute la requĂȘte pour chaque ordre.
foreach( $orders as $id => $qty) {
// En raison du fait que $id et $qty sont liés à $stmt1,
// leurs valeurs mises à jour sont utilisées lors de chaque exécution
// de la requĂȘte.
if( sqlsrv_execute( $stmt ) === false ) {
die(
print_r( sqlsrv_errors(), true));
}
}
?>

Notes

Lorsque l'on prĂ©pare une requĂȘte qui utilise des variables comme paramĂštres, les variables sont liĂ©es Ă  la requĂȘte. Cela signifie que si l'on met Ă  jour les valeurs de ces variables, la prochaine exĂ©cution de la requĂȘte prendra en compte ces nouvelles valeurs. Pour les requĂȘtes que l'on ne prĂ©voit exĂ©cuter qu'une seule fois, utiliser la fonction sqlsrv_query().

Voir aussi

  • sqlsrv_execute() - ExĂ©cute une requĂȘte prĂ©parĂ©e avec la fonction sqlsrv_prepare
  • sqlsrv_query() - PrĂ©pare et exĂ©cute une requĂȘte
add a note

User Contributed Notes 2 notes

up
5
tuxedobob ¶
10 years ago
Be careful with your variables once you bind them to a statement with sqlsrv_prepare.

Consider the following:

<?php
$dude = '';
$time = new DateTime();
$sql = "INSERT INTO my_table (person, timein) VALUES (?, ?)";
$stmt = sqlsrv_prepare($conn, $sql, array(&$dude, &$time));

...
// many lines later

foreach ($times as &$time) {
   //do stuff
}

// later still...
$time = $times['start'];
if( sqlsrv_execute( $stmt ) === false ) {
          die( print_r( sqlsrv_errors(), true));
}
?>

I did something like this. I prepared a statement at the start, used the variable again in the middle, and then set the value I wanted before running the query.

Trouble is, I used the variable as an iterator instead of a simple scalar. This caused PHP to use a different location in memory, and the location it was previously bound to was invalid. So SQL simply inserted a default date/time.

Worse, because SQL just inserted a default, it didn't throw any errors, and in trying to debug it, I did something like this:

<?php
var_dump($time);
sqlsrv_execute($stmt);
$q = "SELECT * FROM my_table WHERE id=@@IDENTITY";
$r = sqlsrv_query($conn, $q);
$row = sqlsrv_fetch_array($r); $id = $row[0];
var_dump($row['time']);
?>

Having it appear as though you're sending SQL the correct data, and seeing it spitting back something else entirely is absolutely maddening.

So if SQL seems to be inserting garbage with prepared statements, MAKE SURE YOU'RE NOT USING THE VARIABLES ANYWHERE ELSE.
up
-3
matt at bigbadweb dot co dot uk ¶
11 years ago
Example of how to formally specify the params, AND get output.
<?php

// Setup connection
$serverName = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false) {
  die( print_r( sqlsrv_errors(), true));
}

// specify params - MUST be a variable that can be passed by reference!
$myparams['Item_ID'] = intval(-2);
$myparams['Item_Name'] = "Foo";

// Set up the proc params array - be sure to pass the param by reference
$procedure_params = array(
 array(&$myparams['Item_ID'], SQLSRV_PARAM_OUT),
 array(&$myparams['Item_Name'], SQLSRV_PARAM_OUT)
);

// EXEC the procedure, {call stp_Create_Item (@Item_ID = ?, @Item_Name = ?)} seems to fail with various errors in my experiments
$sql = "EXEC stp_Create_Item @Item_ID = ?, @Item_Name = ?";

$stmt = sqlsrv_prepare($conn, $sql, $procedure_params);

if( !$stmt ) {
 die( print_r( sqlsrv_errors(), true));
}

if(sqlsrv_execute($stmt)){
  while($res = sqlsrv_next_result($stmt)){
    // make sure all result sets are stepped through, since the output params may not be set until this happens
  }
  // Output params are now set,
  print_r($params);
  print_r($myparams);
}else{
  die( print_r( sqlsrv_errors(), true));
}
?>