PDO_SQLSRV 驅動程式可讓您使用數種游標之一建立可捲動的結果集。
如需有關如何使用 PDO_SQLSRV 驅動程式指定游標的資訊以及程式碼範例,請參閱 PDO::prepare。
PDO_SQLSRV 與伺服器端游標
在 Microsoft PHP for SQL Server 驅動程式 3.0 版之前,PDO_SQLSRV 驅動程式可讓您使用伺服器端僅順向或靜態資料指標建立結果集。 自適用於 SQL Server 的 Microsoft PHP 驅動程式 3.0 版起,也提供鍵集游標和動態游標。
您可以使用 PDO::prepare,從下列資料指標類型中選取一種,以指定伺服器端資料指標的類型:
PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLYPDO::ATTR_CURSOR => PDO::CURSOR_SCROLL
您可以藉由指定 PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL,然後將適當的值傳遞給 PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE,來要求動態、靜態或索引鍵集資料指標。 可傳遞給 PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE 以用於伺服器端游標的可能值如下:
PDO::SQLSRV_CURSOR_DYNAMICPDO::SQLSRV_CURSOR_STATICPDO::SQLSRV_CURSOR_KEYSET
PDO_SQLSRV 和用戶端游標
在適用於 SQL Server 的 Microsoft PHP 驅動程式 3.0 版中新增了用戶端游標,可讓您將整個結果集快取於記憶體中。 其中一個優點是執行查詢之後,就能使用資料列計數。
用戶端游標應用於小型到中型的結果集。 大量結果集應使用伺服器端游標。
使用用戶端游標時,如果緩衝區不足以容納整個結果集,查詢將傳回 false。 您可以將緩衝區大小上限提高到 PHP 記憶體限制。
您可以設定緩衝區的大小,使用 PDO::SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE 或 PDOStatement::setAttribute 的 屬性來保留結果集。 您也可以在 php.ini 檔案中使用 pdo_sqlsrv.client_buffer_max_kb_size 來設定緩衝區大小上限 (例如 pdo_sqlsrv.client_buffer_max_kb_size = 1024)。
您可以使用 PDO::prepare、指定 PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL 游標類型,然後再指定 PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_BUFFERED,以要求用戶端游標。
範例
下列範例說明如何指定緩衝游標。
<?php
$database = "AdventureWorks";
$server = "(local)";
$conn = new PDO( "sqlsrv:server=$server ; Database = $database", "", "");
$query = "select * from Person.ContactType";
$stmt = $conn->prepare( $query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_BUFFERED));
$stmt->execute();
print $stmt->rowCount();
echo "\n";
while ( $row = $stmt->fetch( PDO::FETCH_ASSOC ) ){
print "$row[Name]\n";
}
echo "\n..\n";
$row = $stmt->fetch( PDO::FETCH_BOTH, PDO::FETCH_ORI_FIRST );
print_r($row);
$row = $stmt->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_REL, 1 );
print "$row[Name]\n";
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT );
print "$row[1]\n";
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR );
print "$row[1]..\n";
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_ABS, 0 );
print_r($row);
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_LAST );
print_r($row);
?>