sqlsrv_fetch_object

Stáhnout ovladač PHP

Získá další řádek dat jako PHP objekt.

Syntax

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

Parametry

$stmt: Zdroj příkazu odpovídající vykonanému příkazu.

$className [VOLITELNÉ]: Řetězec specifikující název třídy, kterou je třeba instancovat. Pokud není určena hodnota parametru $className , je instancována instance PHP stdClass .

$ctorParams [VOLITELNÉ]: Pole obsahující hodnoty předané konstruktoru třídy specifikované parametrem $className . Pokud konstruktor dané třídy přijímá hodnoty parametrů, musí být při volání sqlsrv_fetch_object použit parametr $ctorParams.

řádek [VOLITELNÉ]: Jedna z následujících hodnot, určující řádek pro přístup v sadě výsledků používající posuvný kurzor. (Pokud je řádek specifikován, $className a $ctorParams musí být explicitně uvedeny, i když musíte specifikovat null pro $className a $ctorParams.)

  • SQLSRV_SCROLL_NEXT

  • SQLSRV_SCROLL_PRIOR

  • SQLSRV_SCROLL_FIRST

  • SQLSRV_SCROLL_LAST

  • SQLSRV_SCROLL_ABSOLUTE

  • SQLSRV_SCROLL_RELATIVE

Pro více informací o těchto hodnotách viz Specifikace typu kurzoru a Výběr řádků.

offset [VOLITELNÉ]: Používá se s SQLSRV_SCROLL_ABSOLUTE a SQLSRV_SCROLL_RELATIVE pro určení řádku, který je třeba načítat. První záznam ve výsledné sadě je 0.

Návratová hodnota

PHP objekt s vlastnostmi odpovídajícími názvům polí výsledkové množiny. Hodnoty vlastností jsou vyplněny odpovídajícími hodnotami polí pro výslednou množinu. Pokud třída zadaná volitelným parametrem $className neexistuje nebo pokud není přiřazena žádná aktivní množina výsledků s daným příkazem, vrací se false (nepravdě ). Pokud už nejsou žádné řádky k vyhledání, null se vrátí.

Datový typ hodnoty ve vráceném objektu bude výchozím datovým typem PHP. Pro informace o výchozích datových typech PHP viz Výchozí PHP datové typy.

Remarks

Pokud je název třídy zadán volitelným parametrem $className , je instancován objekt tohoto typu třídy. Pokud má třída vlastnosti, jejichž názvy odpovídají názvům polí výsledné množiny, odpovídajícím hodnotám výsledné množiny se na vlastnosti aplikují. Pokud název pole výsledné množiny neodpovídá vlastnosti třídy, přidá se k objektu vlastnost s názvem pole výsledné množiny a hodnota výsledné množiny se aplikuje na vlastnost.

Při specifikaci třídy s parametrem $className platí následující pravidla:

  • Porovnávání rozlišuje malá a velká písmena. Například název vlastnosti CustomerId neodpovídá názvu pole CustomerID. V tomto případě by byla k objektu přidána vlastnost CustomerID a hodnota pole CustomerID by byla přiřazena vlastnosti CustomerID.

  • Párování probíhá bez ohledu na přístupové modifikátory. Například pokud má daná třída soukromou vlastnost, jejíž název odpovídá názvu pole výsledné množiny, hodnota z pole výsledné množiny se aplikuje na tuto vlastnost.

  • Typy dat třídních vlastností jsou ignorovány. Pokud je pole "CustomerID" ve výsledné množině řetězce, ale vlastnost "CustomerID" třídy je celočíselné, hodnota řetězce z výsledné sady se zapisuje do vlastnosti "CustomerID".

  • Pokud zadaná třída neexistuje, funkce vrátí false a přidá chybu do kolekce chyb. Pro informace o získávání chybových informací viz sqlsrv_errors.

Pokud je vráceno pole bez jména, sqlsrv_fetch_object hodnotu pole zahodí a vydá varování. Například uvažujme tento Transact-SQL příkaz, který vloží hodnotu do databázové tabulky a získá serverem generovaný primární klíč:

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

Pokud jsou výsledky vrácené tímto dotazem získány pomocí sqlsrv_fetch_object, hodnota vrácená by SELECT SCOPE_IDENTITY() bude zamítnuta a bude vydáno varování. Aby se tomu vyhnuli, můžete v příkazu Transact-SQL zadat název pro vrácené pole. Následuje jeden ze způsobů, jak specifikovat název sloupce v Transact-SQL:

SELECT SCOPE_IDENTITY() AS PictureID

Příklad objektu

Následující příklad získává každý řádek výsledné sady jako PHP objekt. Příklad předpokládá, že SQL Server a databáze AdventureWorks jsou nainstalovány na lokálním počítači. Při spuštění příkladu z příkazového řádku se veškerý výstup zapíše do konzoly.

<?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);  
?>  

Příklad třídy

Následující příklad získává každý řádek výsledné množiny jako instanci produktové třídy definované ve skriptu. Příklad získává informace o produktu z tabulek Purchase.PurchaseOrderDetail a Production.Product v databázi AdventureWorks pro produkty, které mají stanovené datum splatnosti (DueDate) a zásobované množství (StockQty) menší než stanovená hodnota. Příklad zdůrazňuje některá pravidla, která platí při specifikaci třídy ve volání sqlsrv_fetch_object:

  • Proměnná $product je instancí třídy Produkt , protože "Produkt" byl specifikován parametrem $className a třída Produkt existuje.

  • Vlastnost Jméno se přidá do $product instance, protože existující vlastnost jména nesouhlasí.

  • Vlastnost Barva se přidává k $product instanci, protože neexistuje vlastnost párování.

  • Soukromý majetek UnitPrice je vyplněn hodnotou pole UnitPrice .

Příklad předpokládá, že SQL Server a databáze AdventureWorks jsou nainstalovány v místním počítači. Při spuštění příkladu z příkazového řádku se veškerý výstup zapíše do konzoly.

<?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  
        explicitly 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);  
?>  

Funkce sqlsrv_fetch_object vždy vrací data podle výchozích typů dat PHP. Pro informace o tom, jak zadat typ dat v PHP, viz Jak specifikovat: Specifikovat PHP datové typy.

Pokud je vráceno pole bez jména, sqlsrv_fetch_object hodnotu pole zahodí a vydá varování. Například uvažujme tento Transact-SQL příkaz, který vloží hodnotu do databázové tabulky a získá serverem generovaný primární klíč:

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

Pokud jsou výsledky vrácené tímto dotazem získány pomocí sqlsrv_fetch_object, hodnota vrácená by SELECT SCOPE_IDENTITY() bude zamítnuta a bude vydáno varování. Aby se tomu vyhnuli, můžete v příkazu Transact-SQL zadat název pro vrácené pole. Následuje jeden ze způsobů, jak specifikovat název sloupce v Transact-SQL:

SELECT SCOPE_IDENTITY() AS PictureID