sqlsrv_fetch_object

Ladda ned PHP-drivrutin

Hämtar nästa datarad som ett PHP-objekt.

Syntax

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

Parameters

$stmt: En satsresurs som motsvarar en exekverad sats.

$className [VALFRI]: En sträng som specificerar namnet på klassen som ska instansieras. Om ett värde för parametern $className inte specificeras, instansieras en instans av PHP stdClass .

$ctorParams [VALFRI]: En array som innehåller värden som skickas till konstruktören av den klass som specificerats med parametern $className . Om konstruktören av den specificerade klassen accepterar parametervärden måste $ctorParams-parametern användas vid anrop sqlsrv_fetch_object.

rad [VALFRI]: Ett av följande värden, som specificerar raden som ska nås i en resultatuppsättning som använder en rullbar markör. (Om rad anges måste $className och $ctorParams anges uttryckligen, även om du måste ange null för $className och $ctorParams.)

  • SQLSRV_SCROLL_NEXT

  • SQLSRV_SCROLL_PRIOR

  • SQLSRV_SCROLL_FIRST

  • SQLSRV_SCROLL_LAST

  • SQLSRV_SCROLL_ABSOLUTE

  • SQLSRV_SCROLL_RELATIVE

För mer information om dessa värden, se Specificering av en markörtyp och Val av rader.

offset [VALFRI]: Används med SQLSRV_SCROLL_ABSOLUTE och SQLSRV_SCROLL_RELATIVE för att ange vilken rad som ska hämtas. Den första posten i resultatuppsättningen är 0.

Returvärde

Ett PHP-objekt med egenskaper som motsvarar resultatmängdsfältens namn. Egenskapsvärden fylls med motsvarande fältvärden för resultatmängden. Om klassen som specificerats med den valfria $className-parametern inte existerar eller om det inte finns någon aktiv resultatmängd kopplad till det angivna uttalandet, returneras falskt. Om det inte finns fler rader att hämta returneras null .

Datatypen för ett värde i det returnerade objektet kommer att vara standarddatatypen för PHP. För information om standard PHP-datatyper, se Default PHP Data Types.

Remarks

Om ett klassnamn anges med den valfria parametern $className , instansieras ett objekt av denna klasstyp. Om klassen har egenskaper vars namn matchar fältnamnen i resultatmängden, tillämpas motsvarande resultatmängdsvärden på egenskaperna. Om ett resultatmängdsfältnamn inte matchar en klassegenskap, läggs en egenskap med resultatmängdens fältnamn till objektet och resultatmängdsvärdet appliceras på egenskapen.

Följande regler gäller när man specificerar en klass med parametern $className :

  • Matchning är skiftlägeskänslig. Till exempel matchar inte egenskapsnamnet CustomerId fältnamnet CustomerID. I detta fall skulle en egenskap CustomerID läggas till objektet och värdet av fältet CustomerID skulle ges till egenskapen CustomerID.

  • Matchning sker oavsett åtkomstmodifierare. Till exempel, om den specificerade klassen har en privat egenskap vars namn matchar ett fältnamn på en resultatmängd, tillämpas värdet från resultatmängdsfältet på egenskapen.

  • Klassegenskapsdatatyper ignoreras. Om fältet "CustomerID" i resultatuppsättningen är en sträng men egenskapen "CustomerID" för klassen är ett heltal, skrivs strängvärdet från resultatuppsättningen till egenskapen "CustomerID".

  • Om den specificerade klassen inte existerar returnerar funktionen false och lägger till ett fel i felsamlingen. För information om hur man hämtar felinformation, se sqlsrv_errors.

Om ett fält utan namn returneras kommer sqlsrv_fetch_object att kassera fältvärdet och utfärda en varning. Till exempel, betrakta denna Transact-SQL-sats som infogar ett värde i en databastabell och hämtar den servergenererade primärnyckeln:

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

Om resultaten som returneras av denna fråga hämtas med sqlsrv_fetch_object, kommer värdet som returneras av SELECT SCOPE_IDENTITY() att kasseras och en varning utfärdas. För att undvika detta kan du ange ett namn för det returnerade fältet i Transact-SQL-satsen. Följande är ett sätt att ange ett kolumnnamn i Transact-SQL:

SELECT SCOPE_IDENTITY() AS PictureID

Objektexempel

Följande exempel hämtar varje rad i en resultatmängd som ett PHP-objekt. Exemplet antar att SQL Server och AdventureWorks-databasen är installerade på den lokala datorn. Alla utdata skrivs till konsolen när exemplet körs från kommandoraden.

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

Klassexempel

Följande exempel hämtar varje rad i en resultatmängd som en instans av den produktklass som definieras i skriptet. Exemplet hämtar produktinformation från tabellerna Purchasing.PurchaseOrderDetail och Production.Product i AdventureWorks-databasen för produkter som har ett angivet förfallodatum (Due Date) och en lagrad mängd (StockQty) som är mindre än ett angivet värde. Exemplet belyser några av reglerna som gäller när man specificerar en klass i ett anrop till sqlsrv_fetch_object:

  • Variabeln $product är en instans av Product-klassen, eftersom "Product" specificerades med parametern $className och Product-klassen existerar.

  • Namnegenskapen läggs till i den $product instansen eftersom den befintliga namnegenskapen inte matchar.

  • Color-egenskapen läggs till i $product instansen eftersom det inte finns någon matchande egenskap.

  • Den privata egendomen Enhetspris fylls med värdet av Enhetsprisfältet .

Exemplet förutsätter att SQL Server och AdventureWorks-databasen är installerade på den lokala datorn. Alla utdata skrivs till konsolen när exemplet körs från kommandoraden.

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

Funktionen sqlsrv_fetch_object returnerar alltid data enligt standarddatatyperna för PHP. För information om hur man specificerar PHP-datatypen, se Hur man: Specificera PHP-datatyper.

Om ett fält utan namn returneras kommer sqlsrv_fetch_object att kassera fältvärdet och utfärda en varning. Till exempel, betrakta denna Transact-SQL-sats som infogar ett värde i en databastabell och hämtar den servergenererade primärnyckeln:

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

Om resultaten som returneras av denna fråga hämtas med sqlsrv_fetch_object, kommer värdet som returneras av SELECT SCOPE_IDENTITY() att kasseras och en varning utfärdas. För att undvika detta kan du ange ett namn för det returnerade fältet i Transact-SQL-satsen. Följande är ett sätt att ange ett kolumnnamn i Transact-SQL:

SELECT SCOPE_IDENTITY() AS PictureID