sqlsrv_fetch_object

Descarregar o driver PHP

Recupera a próxima linha de dados como objeto PHP.

Syntax

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

Parâmetros

$stmt: Um recurso de instrução correspondente a uma instrução executada.

$className [OPCIONAL]: Uma cadeia que especifica o nome da classe a instanciar. Se não for especificado um valor para o parâmetro $className , é instanciada uma instância da stdClass PHP.

$ctorParams [OPCIONAL]: Um array que contém valores passados ao construtor da classe especificada com o parâmetro $className . Se o construtor da classe especificada aceitar valores de parâmetro, o parâmetro $ctorParams deve ser usado ao chamar sqlsrv_fetch_object.

linha [OPCIONAL]: Um dos seguintes valores, especificando a linha a aceder num conjunto de resultados que utiliza um cursor deslizável. (Se a linha for especificada, $className e $ctorParams devem ser explicitamente especificados, mesmo que seja necessário especificar nulo para $className e $ctorParams.)

  • SQLSRV_SCROLL_NEXT

  • SQLSRV_SCROLL_PRIOR

  • SQLSRV_SCROLL_FIRST

  • SQLSRV_SCROLL_LAST

  • SQLSRV_SCROLL_ABSOLUTE

  • SQLSRV_SCROLL_RELATIVE

Para mais informações sobre estes valores, consulte Especificar um Tipo de Cursor e Selecionar Linhas.

deslocamento [OPCIONAL]: Usado com SQLSRV_SCROLL_ABSOLUTE e SQLSRV_SCROLL_RELATIVE para especificar a linha a recuperar. O primeiro registo no conjunto de resultados é 0.

Valor de retorno

Um objeto PHP com propriedades que correspondem a nomes de conjuntos de resultados. Os valores das propriedades são preenchidos com os valores correspondentes do conjunto de resultados. Se a classe especificada com o parâmetro $className opcional não existir ou se não houver um conjunto de resultados ativo associado à instrução especificada, o false é devolvido. Se não houver mais linhas para recuperar, o null é devolvido.

O tipo de dado de um valor no objeto devolvido será o tipo de dado PHP predefinido. Para informações sobre os tipos de dados PHP predefinidos, consulte Tipos de Dados PHP Padrão.

Observações

Se o nome de uma classe for especificado com o parâmetro opcional $className , um objeto deste tipo de classe é instanciado. Se a classe tiver propriedades cujos nomes correspondem aos nomes dos campos do conjunto de resultados, os valores correspondentes do conjunto de resultados são aplicados às propriedades. Se o nome do campo do conjunto de resultados não corresponder a uma propriedade de classe, uma propriedade com o nome do campo do conjunto de resultados é adicionada ao objeto e o valor do conjunto de resultados é aplicado à propriedade.

Aplicam-se as seguintes regras ao especificar uma classe com o parâmetro $className :

  • A correspondência é sensível a maiúsculas e minúsculas. Por exemplo, o nome da propriedade CustomerId não corresponde ao nome do campo CustomerID. Neste caso, uma propriedade CustomerID seria adicionada ao objeto e o valor do campo CustomerID seria atribuído à propriedade CustomerID.

  • A correspondência ocorre independentemente dos modificadores de acesso. Por exemplo, se a classe especificada tiver uma propriedade privada cujo nome corresponde ao nome do campo do conjunto de resultados, o valor do campo do conjunto de resultados é aplicado à propriedade.

  • Os tipos de dados de propriedade de classe são ignorados. Se o campo "CustomerID" no conjunto de resultados for uma string mas a propriedade "CustomerID" da classe for um inteiro, o valor da string do conjunto de resultados é escrito na propriedade "CustomerID".

  • Se a classe especificada não existir, a função retorna false e adiciona um erro à coleção de erros. Para informações sobre a obtenção de informações de erro, consulte sqlsrv_errors.

Se um campo sem nome for devolvido, sqlsrv_fetch_object irá descartar o valor do campo e emitir um aviso. Por exemplo, considere esta Transact-SQL instrução que insere um valor numa tabela de base de dados e recupera a chave primária gerada pelo servidor:

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

Se os resultados devolvidos por esta consulta forem recuperados com sqlsrv_fetch_object, o valor devolvido por SELECT SCOPE_IDENTITY() será descartado e será emitido um aviso. Para evitar isto, pode especificar um nome para o campo devolvido na instrução Transact-SQL. Segue-se uma forma de especificar o nome de uma coluna no Transact-SQL:

SELECT SCOPE_IDENTITY() AS PictureID

Exemplo de objeto

O exemplo seguinte recupera cada linha de um conjunto de resultados como um objeto PHP. O exemplo assume que o SQL Server e a base de dados AdventureWorks estão instalados no computador local. Toda a saída é escrita para a consola quando o exemplo é executado a partir da linha de comandos.

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

Exemplo de classe

O exemplo seguinte recupera cada linha de um conjunto de resultados como uma instância da classe Product definida no script. O exemplo recupera informações de produto das tabelas Compração.CompraEncomendaDetalhe e Produção.Produto da base de dados AdventureWorks para produtos que têm uma data de vencimento especificada (Data de Vencimento) e uma quantidade armazenada (StockQty) inferior a um valor especificado. O exemplo destaca algumas das regras que se aplicam ao especificar uma classe numa chamada para sqlsrv_fetch_object:

  • A variável $product é uma instância da classe Produto , porque "Produto" foi especificado com o parâmetro $className e a classe Produto existe.

  • A propriedade Nome é adicionada à instância $product porque a propriedade de nome existente não corresponde.

  • A propriedade Color é adicionada à instância $product porque não existe uma propriedade de correspondência.

  • A propriedade privada UnitPrice é preenchida com o valor do campo UnitPrice .

O exemplo assume que o SQL Server e a base de dados AdventureWorks estão instalados no computador local. Toda a saída é escrita para a consola quando o exemplo é executado a partir da linha de comandos.

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

A função sqlsrv_fetch_object devolve sempre os dados de acordo com os Tipos de Dados PHP Padrão. Para informações sobre como especificar o tipo de dado PHP, veja Como: Especificar Tipos de Dados PHP.

Se um campo sem nome for devolvido, sqlsrv_fetch_object irá descartar o valor do campo e emitir um aviso. Por exemplo, considere esta Transact-SQL instrução que insere um valor numa tabela de base de dados e recupera a chave primária gerada pelo servidor:

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

Se os resultados devolvidos por esta consulta forem recuperados com sqlsrv_fetch_object, o valor devolvido por SELECT SCOPE_IDENTITY() será descartado e será emitido um aviso. Para evitar isto, pode especificar um nome para o campo devolvido na instrução Transact-SQL. Segue-se uma forma de especificar o nome de uma coluna no Transact-SQL:

SELECT SCOPE_IDENTITY() AS PictureID