Procédure : récupérer des données sous forme d'objet
Le Pilote SQL Server pour PHP offre la fonction sqlsrv_fetch_object qui permet de récupérer une ligne de données sous forme d'objet PHP. Cette rubrique explique comment récupérer des données lorsque le paramètre optionnel $className est utilisé dans l'appel de la fonction sqlsrv_fetch_object. Pour obtenir un exemple de récupération des données sous forme d'objet sans utiliser le paramètre optionnel $className, consultez sqlsrv_fetch_object.
Si un nom de classe est spécifié avec le paramètre optionnel $className, un objet de ce type de classe est instancié. Si les noms des propriétés de la classe sont identiques aux noms de champs 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 est différent de celui d'une propriété de classe, une propriété nommée comme le champ du jeu de résultats est ajoutée à l'objet et la valeur du jeu de résultats est appliquée à la propriété.
Les règles suivantes sont appliquées lorsqu'une classe est spécifiée avec le paramètre $className :
- La correspondance respecte la casse. Par exemple, le nom de propriété CustomerId ne correspond pas au nom de champ CustomerID. Dans ce cas, la propriété CustomerID est ajoutée à l'objet et la valeur du champ CustomerID est appliquée à la propriété CustomerID.
- La correspondance ne tient pas compte des modificateurs d'accès. Par exemple, si la classe spécifiée possède une propriété privée dont le nom est identique à celui d'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 de la propriété de classe sont ignorés. Si le champ CustomerID du jeu de résultats est une chaîne mais que la propriété CustomerID de la classe est une valeur entière, la valeur de chaîne du jeu de résultats est appliquée à 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 relatives aux erreurs, consultez sqlsrv_errors.
Exemple
L'exemple suivant récupère chaque ligne d'un jeu de résultats sous forme d'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, des informations sur les produits dont l'échéance est spécifiée (DueDate) et dont la quantité en stock (StockQty) est inférieure à une valeur spécifiée. L'exemple met en évidence quelques-unes des règles qui sont appliquées lorsqu'une classe est spécifiée 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 elle n'est pas identique à la propriété name existante.
- La propriété Color est ajoutée à l'instance $product, car elle ne correspond à aucune autre propriété.
- La propriété UnitPrice prend la valeur du champ UnitPrice.
L'exemple suppose que SQL Server et la base de données AdventureWorks sont installés sur l'ordinateur local. Toutes les données de sortie sont écrites dans la console lorsque 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 fonction sqlsrv_fetch_object retourne toujours les données selon les Types de données PHP par défaut. Pour plus d'informations sur la façon de spécifier le type de données PHP, consultez Procédure : spécifier les types de données PHP ou Procédure : récupérer un champ unique.
Si un champ sans nom est retourné, sqlsrv_fetch_object ignore la valeur du champ et émet un avertissement. Par exemple, l'instruction Transact-SQL suivante insère une valeur dans la 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é directement dans l'instruction Transact-SQL. L'exemple suivant montre une méthode pour spécifier un nom de colonne dans une instruction Transact-SQL :
SELECT SCOPE_IDENTITY() AS PictureID
Voir aussi
Concepts
Comparaison des fonctions de récupération des données
À propos des exemples de code dans la documentation