共用方式為


指定資料指標類型和選取資料列

從 SQL Server Driver for PHP 1.1 版開始,您就可以根據資料指標類型,建立具有可按照任何順序存取之資料列的結果集。

資料指標類型

當您使用 sqlsrv_querysqlsrv_prepare 來建立結果集時,可以指定資料指標的類型。根據預設,系統會使用順向資料指標。順向資料指標可讓您從結果集的第一個資料列開始,一次移動一個資料列,直到達到結果集的結尾為止。這是 SQL Server Driver for PHP 1.0 版中唯一可用的資料指標類型。

從 SQL Server Driver for PHP 1.1 版開始,您就可以使用可捲動的資料指標來建立結果集,這種資料指標可讓您按照任何順序存取結果集中的任何資料列。下表將列出可傳遞給 sqlsrv_querysqlsrv_prepareScrollable 選項的值。

選項 描述

SQLSRV_CURSOR_FORWARD

這種資料指標類型可讓您從結果集的第一個資料列開始,一次移動一個資料列,直到達到結果集的結尾為止。

這是預設的資料指標類型。

sqlsrv_num_rows 會針對使用這種資料指標類型所建立的結果集傳回錯誤。

forward 是 SQLSRV_CURSOR_FORWARD 的縮寫格式。

SQLSRV_CURSOR_STATIC

這種資料指標可讓您按照任何順序存取資料列,但不會反映資料庫的變更。

static 是 SQLSRV_CURSOR_STATIC 的縮寫格式。

SQLSRV_CURSOR_DYNAMIC

這種資料指標可讓您按照任何順序存取資料列,而且將會反映資料庫的變更。

sqlsrv_num_rows 會針對使用這種資料指標類型所建立的結果集傳回錯誤。

dynamic 是 SQLSRV_CURSOR_DYNAMIC 的縮寫格式。

SQLSRV_CURSOR_KEYSET

這種資料指標可讓您按照任何順序存取資料列。不過,如果您從資料表中刪除了某個資料列,索引鍵集資料指標並不會更新資料列計數 (刪除的資料列不會傳回任何值)。

keyset 是 SQLSRV_CURSOR_KEYSET 的縮寫格式。

如果查詢產生多個結果集,Scrollable 選項就會套用至所有結果集。

選取結果集中的資料列

建立靜態、動態或索引鍵集結果集之後,您就可以使用 sqlsrv_fetchsqlsrv_fetch_arraysqlsrv_fetch_object 來指定資料列。

下表將描述您可以在 row 參數中指定的值。

參數 描述

SQLSRV_SCROLL_NEXT

下一個資料列。如果您沒有針對可捲動的結果集指定 row 參數,這就是預設值。

SQLSRV_SCROLL_PRIOR

目前資料列前面的資料列。

SQLSRV_SCROLL_FIRST

結果集中的第一個資料列。

SQLSRV_SCROLL_LAST

結果集中的最後一個資料列。

SQLSRV_SCROLL_ABSOLUTE

使用 offset 參數指定的資料列。

SQLSRV_SCROLL_RELATIVE

根據目前資料列,使用 offset 參數指定的資料列。允許使用負數。

範例

描述

下列範例將示範各種資料指標的作用。在此範例的第 33 行,您會看見指定不同資料指標的第一個查詢陳述式。其他兩個查詢陳述式則標記為註解。每次執行此程式時,請使用不同的資料指標類型,在第 47 行查看資料庫更新的作用。

程式碼

<?php
$server = "server_name";
$conn = sqlsrv_connect( $server, array( 'Database' => 'test' ));
if ( $conn === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "DROP TABLE dbo.ScrollTest" );
if ( $stmt !== false ) { 
   sqlsrv_free_stmt( $stmt ); 
}

$stmt = sqlsrv_query( $conn, "CREATE TABLE ScrollTest (id int, value char(10))" );
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 1, "Row 1" ));
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 2, "Row 2" ));
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 3, "Row 3" ));
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'keyset' ));
// $stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'dynamic' ));
// $stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'static' ));

$rows = sqlsrv_has_rows( $stmt );
if ( $rows != true ) {
   die( "Should have rows" );
}

$result = sqlsrv_fetch( $stmt, SQLSRV_SCROLL_LAST );
$field1 = sqlsrv_get_field( $stmt, 0 );
$field2 = sqlsrv_get_field( $stmt, 1 );
echo "\n$field1 $field2\n";

$stmt2 = sqlsrv_query( $conn, "delete from ScrollTest where id = 3" );
// or
// $stmt2 = sqlsrv_query( $conn, "UPDATE ScrollTest SET id = 4 WHERE id = 3" );
if ( $stmt2 !== false ) { 
   sqlsrv_free_stmt( $stmt2 ); 
}

$result = sqlsrv_fetch( $stmt, SQLSRV_SCROLL_LAST );
$field1 = sqlsrv_get_field( $stmt, 0 );
$field2 = sqlsrv_get_field( $stmt, 1 );
echo "\n$field1 $field2\n";

sqlsrv_free_stmt( $stmt );
sqlsrv_close( $conn );
?>

另請參閱

其他資源

擷取資料