sqlsrv_execute

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

sqlsrv_executeExécute une requête préparée avec la fonction sqlsrv_prepare()

Description

sqlsrv_execute(resource $stmt): bool

Exécute une requête préparée avec la fonction sqlsrv_prepare(). Cette fonction est idéale pour exécuter une requête préparée à plusieurs reprises avec des valeurs différentes pour les paramètres.

Liste de paramètres

stmt

Une ressource de requête retournée par la fonction sqlsrv_prepare().

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec sqlsrv_execute()

Cet exemple montre la façon pour préparer une requête avec la fonction sqlsrv_prepare() ainsi que l'exécution à plusieurs reprises (avec des valeurs différentes pour les paramètres) 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éfinition des informations SalesOrderDetailID et OrderQty.
// Ce tableau lie l'ID order à la quantitié order dans une paire key=>value.
$orders = array( 1=>10, 2=>20, 3=>30);

// Exécute la requête pour chaque ordre.
foreach( $orders as $id => $qty) {
// En raison du que $id et $qty sont liés à $stmt1, leurs valeurs
// mise à 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 vous préparez une requête qui utilisent des variables comme paramètres, les variables sont liées à la requête. Cela signifie que si vous mettez à jour les valeurs des variables, la prochaine exécution de la requête utilisera les valeurs mises à jour. Pour les requêtes que vous prévoyez d'utiliser qu'une seule fois, utilisez plutôt la fonction sqlsrv_query().

Voir aussi

add a note add a note

User Contributed Notes 3 notes

up
10
tuxedobob
8 years ago
If you're used to working with sqlsrv_query, you're probably used to the following flow:

<?php
$query
= "SELECT * FROM mytable WHERE id=?";
$result = sqlsrv_query($conn, $query, array($myID));
$row = sqlsrv_fetch_array($result);
?>

Given that, you might think the following works:

<?php
$myID
= 0;
$query = "SELECT * FROM mytable WHERE id=?";
$stmt = sqlsrv_prepare($conn, $query, array(&$myID));
$result = sqlsrv_execute($stmt);
$row = sqlsrv_fetch_array($result);
?>

It doesn't. The reason is that sqlsrv_execute, as noted above, returns true or false on success or failure, respectively. The variable that has your result is actually $stmt. Change the last row to

<?php
$row
= sqlsrv_fetch_array($stmt);
?>

and it works as expected.
up
2
vavra at 602 dot cz
6 years ago
Attention!
If the sql contains INSERT, UPDATE or DELETE statements, the number of affected rows must be consumed. The sqlsrv_query returns a sql cursor that must be read to finish the transaction, if the result is non false. This same is valid for sqlsrv_execute. In this case the cursor must be also read using the prepared statement handle $smt.

Another solution is to place SET NOCOUNT ON at the top of the sqlsrv statement and all called procedures, functions and triggers.

We've practically observed it with sql statement with 500 inserts but only 368 was inserted without false returned. Prefixing by SET NOCOUNT ON or reading a cursor all rows were inserted.

See Processing Results (ODBC): https://docs.microsoft.com/en-us/sql/relational-databases/native-client-odbc-results/processing-results-odbc Each INSERT, UPDATE, and DELETE statement returns a result set containing only the number of rows affected by the modification. This count is made available when application calls SQLRowCount. ODBC 3.x applications must either call SQLRowCount to retrieve the result set or SQLMoreResults to cancel it. When an application executes a batch or stored procedure containing multiple INSERT, UPDATE, or DELETE statements, the result set from each modification statement must be processed using SQLRowCount or cancelled using SQLMoreResults. These counts can be cancelled by including a SET NOCOUNT ON statement in the batch or stored procedure.
up
1
esundberg at nitelusa dot com
4 years ago
Working PDO Prepare and Execute Example

Code
----------------------------------------
print "<h1>PDO Example</h1>";

print "<h2>PDO Connection</h2>";
try {
    $pdo = new PDO("sqlsrv:server=$sql_server;Database=$sql_database",$sql_username,$sql_password,['ReturnDatesAsStrings'=>true]);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
    die("Database Connection Error");
   
}

print "<h2>Check for PDO Connection</h2>";
if($pdo === false) {
    print "No DB Connection<br>";
} else {
    print "Good DB Connection<br>";
}

print "<h2>PDO Query Example 1 with SQL Injection</h2>";
print "I Personally prefer pdo due to binding of paramaters by name.<br>";
$sql = "SELECT username, active FROM users WHERE username = :username";
print "SQL: $sql\n";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':username', $username);
$stmt->execute();
while($r = $stmt->fetch(PDO::FETCH_OBJ)) {
    print_r($r);
}

------------------------------------------------------
PDO Example
PDO Connection
Check for PDO Connection
Good DB Connection
PDO Query Example 1 with SQL Injection
I Personally prefer pdo due to binding of paramaters by name.
SQL: SELECT username, active FROM users WHERE username = :username
stdClass Object
(
    [username] => admin
    [active] => 1
)
To Top