sqlsrv_fetch_object

Télécharger le pilote PHP

Récupère la ligne suivante de données sous la forme d’un objet PHP.

Syntaxe

sqlsrv_fetch_object( resource $stmt [, string $className [, array $ctorParams[, row[, ]offset]]])  

Paramètres

$stmt : ressource d’instruction correspondant à une instruction exécutée.

$className [FACULTATIF]: chaîne spécifiant le nom de la classe à instancier. Si aucune valeur n’est spécifiée pour le paramètre $className , une instance de stdClass PHP est instanciée.

$ctorParams [FACULTATIF] : tableau qui contient les valeurs passées au constructeur de la classe spécifiée avec le paramètre $className. Si le constructeur de la classe spécifiée accepte des valeurs de paramètre, le paramètre $ctorParams doit être utilisé durant l’appel de sqlsrv_fetch_object.

row [FACULTATIF] : l’une des valeurs suivantes, spécifiant la ligne à laquelle accéder dans un jeu de résultats qui utilise un curseur de défilement. (Si row est spécifié, $className et $ctorParams doivent être explicitement spécifiés, même si vous devez spécifier une valeur Null pour $className et $ctorParams.)

  • SQLSRV_SCROLL_NEXT

  • SQLSRV_SCROLL_PRIOR

  • SQLSRV_SCROLL_FIRST

  • SQLSRV_SCROLL_LAST

  • SQLSRV_SCROLL_ABSOLUTE

  • SQLSRV_SCROLL_RELATIVE

Pour plus d’informations sur ces valeurs, consultez Spécification d’un type de curseur et sélection de lignes.

décaler [FACULTATIF] : Utilisé avec SQLSRV_SCROLL_ABSOLUTE et SQLSRV_SCROLL_RELATIVE pour spécifier la ligne à récupérer. Le premier enregistrement dans le jeu de résultats est 0.

Valeur de retour

Objet PHP avec des propriétés qui correspondent à des noms de champ du jeu de résultats. Les valeurs de propriété sont renseignées avec les valeurs de champ de jeu de résultats correspondantes. Si la classe spécifiée avec le paramètre $className facultatif n’existe pas ou s’il n’existe aucun jeu de résultats actif associé à l’instruction spécifiée, false est retourné. S’il n’y a plus aucune ligne à récupérer, la valeur null est retournée.

Le type de données d’une valeur dans l’objet retourné correspond au type de données PHP par défaut. Pour plus d’informations sur les types de données PHP par défaut, consultez Default PHP Data Types.

Notes

Si un nom de classe est spécifié avec le paramètre $className facultatif, un objet de ce type de classe est instancié. Si la classe a des propriétés dont les noms correspondent aux noms de champ du jeu de résultats, les valeurs du jeu de résultats correspondantes sont appliquées aux propriétés. Si un nom de champ du jeu de résultats ne correspond pas à une propriété de classe, une propriété avec le nom de champ du jeu de résultats est ajoutée à l’objet et la valeur de jeu de résultats est appliquée à la propriété.

Les règles suivantes s’appliquent lors de la spécification d’une classe avec le paramètre $className :

  • La mise en correspondance respecte la casse. Par exemple, le nom de propriété CustomerId ne correspond pas au nom de champ CustomerID. Dans ce cas, une propriété CustomerID est ajoutée à l’objet et la valeur du champ CustomerID est donnée à la propriété CustomerID.

  • La mise en correspondance se produit indépendamment des modificateurs d’accès. Par exemple, si la classe spécifiée a une propriété privée dont le nom correspond à un nom de champ du jeu de résultats, la valeur de ce champ est appliquée à la propriété.

  • Les types de données des propriétés de classe sont ignorés. Si le champ CustomerID dans le jeu de résultats est une chaîne, alors que la propriété CustomerID de la classe est un entier, la valeur de la chaîne du jeu de résultats est écrite dans la propriété CustomerID.

  • Si la classe spécifiée n’existe pas, la fonction retourne false et ajoute une erreur à la collection d’erreurs. Pour plus d’informations sur la récupération des informations d’erreur, consultez sqlsrv_errors.

Si un champ sans nom est retourné, sqlsrv_fetch_object ignore la valeur du champ et émet un avertissement. Par exemple, considérez cette instruction Transact-SQL qui insère une valeur dans une table de base de données et récupère la clé primaire générée par le serveur :

INSERT INTO Production.ProductPhoto (LargePhoto) VALUES (?);  
SELECT SCOPE_IDENTITY()

Si les résultats retournés par cette requête sont récupérés avec sqlsrv_fetch_object, la valeur retournée par SELECT SCOPE_IDENTITY() est ignorée, et un avertissement est émis. Pour éviter cela, vous pouvez spécifier un nom pour le champ retourné dans l’instruction Transact-SQL. Voici un moyen de spécifier un nom de colonne dans Transact-SQL :

SELECT SCOPE_IDENTITY() AS PictureID

Exemple d’objet

L’exemple suivant récupère chaque ligne d’un jeu de résultats sous la forme d’un objet PHP. L’exemple part du principe que SQL Server et la base de données AdventureWorks sont installés sur l’ordinateur local. Toute la sortie est écrite dans la console quand l’exemple est exécuté à partir de la ligne de commande.

<?php  
/* Connect to the local server using Windows Authentication and  
specify the AdventureWorks database as the database in use. */  
$serverName = "(local)";  
$connectionInfo = array( "Database"=>"AdventureWorks");  
$conn = sqlsrv_connect( $serverName, $connectionInfo);  
if( $conn === false )  
{  
     echo "Could not connect.\n";  
     die( print_r( sqlsrv_errors(), true));  
}  
  
/* Set up and execute the query. */  
$tsql = "SELECT FirstName, LastName  
         FROM Person.Contact  
         WHERE LastName='Alan'";  
$stmt = sqlsrv_query( $conn, $tsql);  
if( $stmt === false )  
{  
     echo "Error in query preparation/execution.\n";  
     die( print_r( sqlsrv_errors(), true));  
}  
  
/* Retrieve each row as a PHP object and display the results.*/  
while( $obj = sqlsrv_fetch_object( $stmt))  
{  
      echo $obj->LastName.", ".$obj->FirstName."\n";  
}  
  
/* Free statement and connection resources. */  
sqlsrv_free_stmt( $stmt);  
sqlsrv_close( $conn);  
?>  

Exemple de classe

L’exemple suivant récupère chaque ligne d’un jeu de résultats sous la forme d’une instance de la classe Product définie dans le script. L’exemple récupère, à partir des tables Purchasing.PurchaseOrderDetail et Production.Product de la base de données AdventureWorks, les informations sur les produits qui ont une date d’échéance spécifique (DueDate), et dont la quantité en stock (StockQty) est inférieure à la valeur spécifiée. L’exemple met en évidence certaines des règles qui s’appliquent durant la spécification d’une classe dans un appel à sqlsrv_fetch_object:

  • La variable $product est une instance de la classe Product , car Product a été spécifié avec le paramètre $className et la classe Product existe.

  • La propriété Name est ajoutée à l’instance $product , car la propriété name existante ne correspond pas.

  • La propriété Color est ajoutée à l’instance $product , car il n’existe pas de propriété correspondante.

  • La propriété privée UnitPrice est renseignée avec la valeur du champ UnitPrice .

L’exemple part du principe que SQL Server et la base de données AdventureWorks sont installés sur l’ordinateur local. Toute la sortie est écrite dans la console quand l’exemple est exécuté à partir de la ligne de commande.

<?php  
/* Define the Product class. */  
class Product  
{  
     /* Constructor */  
     public function Product($ID)  
     {  
          $this->objID = $ID;  
     }  
     public $objID;  
     public $name;  
     public $StockedQty;  
     public $SafetyStockLevel;  
     private $UnitPrice;  
     function getPrice()  
     {  
          return $this->UnitPrice;  
     }  
}  
  
/* Connect to the local server using Windows Authentication, and  
specify the AdventureWorks database as the database in use. */  
$serverName = "(local)";  
$connectionInfo = array( "Database"=>"AdventureWorks");  
$conn = sqlsrv_connect( $serverName, $connectionInfo);  
if( $conn === false )  
{  
     echo "Could not connect.\n";  
     die( print_r( sqlsrv_errors(), true));  
}  
  
/* Define the query. */  
$tsql = "SELECT Name,  
                SafetyStockLevel,  
                StockedQty,  
                UnitPrice,  
                Color  
         FROM Purchasing.PurchaseOrderDetail AS pdo  
         JOIN Production.Product AS p  
         ON pdo.ProductID = p.ProductID  
         WHERE pdo.StockedQty < ?  
         AND pdo.DueDate= ?";  
  
/* Set the parameter values. */  
$params = array(3, '2002-01-29');  
  
/* Execute the query. */  
$stmt = sqlsrv_query( $conn, $tsql, $params);  
if ( $stmt )  
{  
     echo "Statement executed.\n";  
}   
else   
{  
     echo "Error in statement execution.\n";  
     die( print_r( sqlsrv_errors(), true));  
}  
  
/* Iterate through the result set, printing a row of data upon each  
 iteration. Note the following:  
     1) $product is an instance of the Product class.  
     2) The $ctorParams parameter is required in the call to  
        sqlsrv_fetch_object, because the Product class constructor is  
        explicity defined and requires parameter values.  
     3) The "Name" property is added to the $product instance because  
        the existing "name" property does not match.  
     4) The "Color" property is added to the $product instance  
        because there is no matching property.  
     5) The private property "UnitPrice" is populated with the value  
        of the "UnitPrice" field.*/  
$i=0; //Used as the $objID in the Product class constructor.  
while( $product = sqlsrv_fetch_object( $stmt, "Product", array($i)))  
{  
     echo "Object ID: ".$product->objID."\n";  
     echo "Product Name: ".$product->Name."\n";  
     echo "Stocked Qty: ".$product->StockedQty."\n";  
     echo "Safety Stock Level: ".$product->SafetyStockLevel."\n";  
     echo "Product Color: ".$product->Color."\n";  
     echo "Unit Price: ".$product->getPrice()."\n";  
     echo "-----------------\n";  
     $i++;  
}  
  
/* Free statement and connection resources. */  
sqlsrv_free_stmt( $stmt);  
sqlsrv_close( $conn);  
?>  

La variable sqlsrv_fetch_object retourne toujours des données en fonction des Default PHP Data Types. Pour plus d’informations sur la façon de spécifier le type de données PHP, consultez Procédure : spécifier des types de données PHP.

Si un champ sans nom est retourné, sqlsrv_fetch_object ignore la valeur du champ et émet un avertissement. Par exemple, considérez cette instruction Transact-SQL qui insère une valeur dans une table de base de données et récupère la clé primaire générée par le serveur :

INSERT INTO Production.ProductPhoto (LargePhoto) VALUES (?);  
SELECT SCOPE_IDENTITY()

Si les résultats retournés par cette requête sont récupérés avec sqlsrv_fetch_object, la valeur retournée par SELECT SCOPE_IDENTITY() est ignorée, et un avertissement est émis. Pour éviter cela, vous pouvez spécifier un nom pour le champ retourné dans l’instruction Transact-SQL. Voici un moyen de spécifier un nom de colonne dans Transact-SQL :

SELECT SCOPE_IDENTITY() AS PictureID

Voir aussi

Récupération de données

À propos des exemples de code dans la documentation

Informations de référence sur l’API du pilote SQLSRV