Spécification d'un type de curseur et sélection de lignes
À partir de la version 1.1 du Pilote SQL Server pour PHP, vous pouvez créer un jeu de résultats comportant des lignes auxquelles vous pouvez accéder dans n'importe quel ordre, en fonction du type de curseur.
Types de curseurs
Lorsque vous créez un jeu de résultats avec sqlsrv_query ou sqlsrv_prepare, vous pouvez spécifier le type de curseur. Par défaut, un curseur avant uniquement est utilisé. Ce type de curseur vous permet de vous déplacer d'une ligne à la fois, en partant de la première ligne du jeu de résultats jusqu'à ce que vous en atteigniez la fin. Il s'agissait du seul type de curseur disponible dans la version 1.0 du Pilote SQL Server pour PHP.
À partir de la version 1.1 du Pilote SQL Server pour PHP, vous pouvez créer un jeu de résultats avec un curseur à défilement variable, ce qui vous permet d'accéder à n'importe quelle ligne du jeu de résultats, dans l'ordre de votre choix. Le tableau suivant répertorie les valeurs qui peuvent être passées à l'option Scrollable dans sqlsrv_query ou sqlsrv_prepare.
Option | Description |
---|---|
SQLSRV_CURSOR_FORWARD |
Ce type de curseur vous permet de vous déplacer d'une ligne à la fois, en partant de la première ligne du jeu de résultats jusqu'à ce que vous en atteigniez la fin. Il s'agit du type de curseur par défaut. sqlsrv_num_rows retourne une erreur pour les jeux de résultats créés avec ce type de curseur. forward représente la forme abrégée de SQLSRV_CURSOR_FORWARD. |
SQLSRV_CURSOR_STATIC |
Ce curseur vous permet d'accéder aux lignes dans n'importe quel ordre, mais ne reflète pas les changements apportés dans la base de données. static représente la forme abrégée de SQLSRV_CURSOR_STATIC. |
SQLSRV_CURSOR_DYNAMIC |
Ce curseur vous permet d'accéder aux lignes dans n'importe quel ordre et reflète les changements apportés dans la base de données. sqlsrv_num_rows retourne une erreur pour les jeux de résultats créés avec ce type de curseur. dynamic représente la forme abrégée de SQLSRV_CURSOR_DYNAMIC. |
SQLSRV_CURSOR_KEYSET |
Ce curseur vous permet d'accéder aux lignes dans n'importe quel ordre. Cependant, un curseur de jeu de clés ne met pas à jour le nombre de lignes si une ligne est supprimée de la table (une ligne supprimée est retournée sans valeur). keyset représente la forme abrégée de SQLSRV_CURSOR_KEYSET. |
Si une requête génère plusieurs jeux de résultats, l'option Scrollable s'appliquent à tous ces jeux.
Sélection de lignes dans un jeu de résultats
Une fois que vous avez créé un jeu de résultats statique, dynamique ou de jeu de clés, vous pouvez utiliser sqlsrv_fetch, sqlsrv_fetch_array ou sqlsrv_fetch_object pour spécifier une ligne.
Le tableau suivant décrit les valeurs que vous pouvez spécifier dans le paramètre row.
Paramètre | Description |
---|---|
SQLSRV_SCROLL_NEXT |
Ligne suivante. Il s'agit de la valeur par défaut si vous ne spécifiez pas le paramètre row pour un jeu de résultats à défilement. |
SQLSRV_SCROLL_PRIOR |
Ligne figurant avant la ligne actuelle. |
SQLSRV_SCROLL_FIRST |
Première ligne du jeu de résultats. |
SQLSRV_SCROLL_LAST |
Dernière ligne du jeu de résultats. |
SQLSRV_SCROLL_ABSOLUTE |
Ligne spécifiée avec le paramètre offset. |
SQLSRV_SCROLL_RELATIVE |
Ligne spécifiée avec le paramètre offset de la ligne actuelle. Les nombres négatifs sont autorisés. |
Exemple
Description
L'exemple suivant illustre l'utilisation des différents curseurs. À la ligne 33, vous voyez la première des trois instructions de requête spécifiant les différents curseurs. Deux des instructions de requête possèdent des commentaires. Chaque fois que vous exécutez le programme, utilisez un type de curseur différent afin de visualiser l'effet de la mise à jour de la base de données à la ligne 47.
Code
<?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 );
?>