PHP Conference Japan 2024

sqlsrv_execute

(沒有版本資訊,可能只在 Git 中)

sqlsrv_execute執行以 sqlsrv_prepare() 準備的陳述式

說明

sqlsrv_execute(資源 $stmt): 布林值

執行以 sqlsrv_prepare() 準備的陳述式。此函式非常適合使用不同的參數值多次執行已準備好的陳述式。

參數

stmt

sqlsrv_prepare() 返回的陳述式資源。

傳回值

成功時傳回 true,失敗時傳回 false

範例

範例 #1 sqlsrv_execute() 範例

此範例示範如何使用 sqlsrv_prepare() 準備陳述式,並使用 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 = ?"
;

// 初始化參數並準備敘述。
// 變數 $qty 和 $id 會繫結到敘述 $stmt。
$qty = 0; $id = 0;
$stmt = sqlsrv_prepare( $conn, $sql, array( &$qty, &$id));
if( !
$stmt ) {
die(
print_r( sqlsrv_errors(), true));
}

// 設定 SalesOrderDetailID 和 OrderQty 資訊。
// 這個陣列以鍵值對的方式將訂單 ID 對應到訂單數量。
$orders = array( 1=>10, 2=>20, 3=>30);

// 對每個訂單執行敘述。
foreach( $orders as $id => $qty) {
// 因為 $id 和 $qty 繫結到 $stmt,每次執行敘述時都會使用它們更新後的值。
if( sqlsrv_execute( $stmt ) === false ) {
die(
print_r( sqlsrv_errors(), true));
}
}
?>

注意事項

當您準備使用變數作為參數的敘述時,變數會繫結到敘述。這表示如果您更新變數的值,則下次執行敘述時,它將使用更新後的參數值執行。對於您只打算執行一次的敘述,請使用 sqlsrv_query()

另請參閱

新增註解

使用者貢獻的註解 3 則註解

tuxedobob
8 年前
如果您習慣使用 sqlsrv_query,您可能習慣以下流程

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

考慮到這一點,您可能會認為以下程式碼可以運作

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

但它不會。原因是如上所述,sqlsrv_execute 在成功或失敗時分別返回 true 或 false。 實際上包含結果的變數是 $stmt。 將最後一行更改為

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

它就會如預期般運作。
vavra at 602 dot cz
6 年前
注意!
如果 SQL 包含 INSERT、UPDATE 或 DELETE 陳述式,則必須使用受影響的列數。 如果結果不是 false,sqlsrv_query 會返回一個必須讀取才能完成交易的 SQL 游標。 這同樣適用於 sqlsrv_execute。 在這種情況下,也必須使用準備好的陳述式控制代碼 $smt 讀取游標。

另一個解決方案是在 sqlsrv 陳述式以及所有被呼叫的預存程序、函式和觸發程序的頂部放置 SET NOCOUNT ON。

我們實際上在包含 500 個插入的 SQL 陳述式中觀察到它,但只插入了 368 個而沒有返回 false。 透過在前面加上 SET NOCOUNT ON 或讀取游標的所有列,即可插入所有列。

查看處理結果 (ODBC):https://docs.microsoft.com/en-us/sql/relational-databases/native-client-odbc-results/processing-results-odbc 每個 INSERT、UPDATE 和 DELETE 陳述式都會傳回一個結果集,其中僅包含受修改影響的資料列數。當應用程式呼叫 SQLRowCount 時,即可取得此計數。ODBC 3.x 應用程式必須呼叫 SQLRowCount 來擷取結果集,或呼叫 SQLMoreResults 來取消它。當應用程式執行包含多個 INSERT、UPDATE 或 DELETE 陳述式的批次或預存程序時,必須使用 SQLRowCount 處理每個修改陳述式的結果集,或使用 SQLMoreResults 取消它。可以透過在批次或預存程序中包含 SET NOCOUNT ON 陳述式來取消這些計數。
esundberg at nitelusa dot com
4 年前
可運作的 PDO Prepare 和 Execute 範例

程式碼
----------------------------------------
print "<h1>PDO 範例</h1>";

print "<h2>PDO 連線</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 "連線失敗:" . $e->getMessage();
die("資料庫連線錯誤");

}

print "<h2>檢查 PDO 連線</h2>";
if($pdo === false) {
print "無資料庫連線<br>";
} else {
print "資料庫連線正常<br>";
}

print "<h2>PDO 查詢範例 1 (含 SQL 注入)</h2>";
print "我個人偏好使用 PDO,因為它可以透過名稱綁定參數。<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 範例
PDO 連線
檢查 PDO 連線
資料庫連線正常
PDO 查詢範例 1 (含 SQL 注入)
我個人偏好使用 PDO,因為它可以透過名稱綁定參數。
SQL: SELECT username, active FROM users WHERE username = :username
stdClass 物件
(
[username] => admin
[active] => 1
)
To Top