2024 日本 PHP 研討會

PDOStatement::closeCursor

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.9.0)

PDOStatement::closeCursor 關閉遊標,讓敘述可以再次執行

說明

public PDOStatement::closeCursor(): 布林值

PDOStatement::closeCursor() 會釋放與伺服器的連線,以便可以發出其他 SQL 陳述式,但會將陳述式保留在可再次執行的狀態。

這個方法對於不支援在先前執行的 PDOStatement 物件仍有未提取的列時執行 PDOStatement 物件的資料庫驅動程式很有用。如果您的資料庫驅動程式有此限制,問題可能會以序列錯誤的形式出現。

PDOStatement::closeCursor() 的實作方式可以是選擇性的驅動程式特定方法(允許最大效率),或者如果未安裝驅動程式特定函式,則使用泛型 PDO 回退機制。PDO 泛型回退機制在語義上與在 PHP 指令碼中編寫以下程式碼相同:

<?php
do {
while (
$stmt->fetch())
;
if (!
$stmt->nextRowset())
break;
} while (
true);
?>

參數

此函式沒有參數。

傳回值

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

錯誤/例外

如果屬性 PDO::ATTR_ERRMODE 設定為 PDO::ERRMODE_WARNING,則會發出層級為 E_WARNING 的錯誤。

如果屬性 PDO::ATTR_ERRMODE 設定為 PDO::ERRMODE_EXCEPTION,則會擲出 PDOException 例外。

範例

範例 #1 PDOStatement::closeCursor() 範例

在以下範例中,$stmt PDOStatement 物件傳回多列,但應用程式只提取第一列,使 PDOStatement 物件處於有未提取列的狀態。為了確保應用程式可以與所有資料庫驅動程式一起使用,作者在執行 $otherStmt PDOStatement 物件之前,在 $stmt 上插入了對 PDOStatement::closeCursor() 的呼叫。

<?php
/* 建立一個 PDOStatement 物件 */
$stmt = $dbh->prepare('SELECT foo FROM bar');

/* 建立第二個 PDOStatement 物件 */
$otherStmt = $dbh->prepare('SELECT foobaz FROM foobar');

/* 執行第一個敘述 */
$stmt->execute();

/* 只擷取結果中的第一列 */
$stmt->fetch();

/* 某些驅動程式可能需要以下 closeCursor() 呼叫 */
$stmt->closeCursor();

/* 現在我們可以執行第二個敘述 */
$otherStmt->execute();
?>

另請參閱

新增筆記

使用者貢獻的筆記 1 則筆記

匿名
9 年前
如果這對任何在收到以下錯誤後來到這裡的人有幫助的話

SQLState: 24000 [Microsoft][ODBC SQL Server Driver]無效的游標狀態

PDOStatement :: closeCursor() 並沒有為我解決問題。 然而,在我的預存程序開頭添加 SET NOCOUNT ON 就可以了。
To Top