カーソルの種類の指定と行の選択

SQL Server Driver for PHP Version 1.1 以降、カーソルの種類に応じて、任意の順番でアクセスできる行を持つ結果セットを作成できるようになりました。

カーソルの種類

結果セットを sqlsrv_query または sqlsrv_prepare を指定して作成する場合、カーソルの種類を指定できます。既定では、順方向専用カーソルが使用されます。順方向専用カーソルを使用すると、結果セットの最初の行から開始し、結果セットの最後まで一度に 1 行ずつ移動できます。SQL Server Driver for PHP Version 1.0 で使用できるカーソルはこの種類のみでした。

SQL Server Driver for PHP Version 1.1 以降、スクロール可能なカーソルを使用して結果セットを作成できるようになり、これを使用すると、結果セットの任意の行に任意の順番でアクセスできます。次の表に、sqlsrv_query または sqlsrv_prepareScrollable オプションに渡すことができる値の一覧を示します。

オプション 説明

SQLSRV_CURSOR_FORWARD

この種類のカーソルを使用すると、結果セットの最初の行から開始し、結果セットの最後まで一度に 1 行ずつ移動できます。

このカーソルの種類が既定値です。

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_array、または sqlsrv_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 行目に、異なるカーソルを指定する 3 つのクエリ ステートメントの最初のステートメントがあります。クエリ ステートメントのうち 2 つはコメント アウトされています。このプログラムを実行するたびに、異なるカーソルの種類を使用して 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 );
?>

参照

その他のリソース

データの取得