Compartir a través de


sqlsrv_fetch_object

Descargar controlador PHP

Recupera la fila siguiente de datos como un objeto PHP.

Sintaxis

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

Parámetros

$stmt: un recurso de instrucción correspondiente a una instrucción ejecutada.

$className (opcional): una cadena que especifica el nombre de la clase para crear una instancia. Si un valor del parámetro $className no se especifica, se creará una instancia PHP de stdClass .

$ctorParams (opcional): una matriz que contiene los valores que se transmiten al constructor de la clase especificada con el parámetro $className. Si el constructor de la clase especificada acepta los valores de parámetro, el parámetro $ctorParams debe usarse al llamar a sqlsrv_fetch_object.

row [OPCIONAL]: Uno de los siguientes valores; sirve para especificar la fila a la que se accederá en un conjunto de resultados que utilice un cursor desplazable (Si se indica row, se tendrá que especificar explícitamente $className y $ctorParams, aunque debe proporcionar el valor NULL para $className y $ctorParams).

  • SQLSRV_SCROLL_NEXT

  • SQLSRV_SCROLL_PRIOR

  • SQLSRV_SCROLL_FIRST

  • SQLSRV_SCROLL_LAST

  • SQLSRV_SCROLL_ABSOLUTE

  • SQLSRV_SCROLL_RELATIVE

Para obtener más información sobre estos valores, vea Especificación de un tipo de cursor y selección de filas.

offset [OPCIONAL]: Se usa con SQLSRV_SCROLL_ABSOLUTE y SQLSRV_SCROLL_RELATIVE para especificar la fila que se va a recuperar. El primer registro del conjunto de resultados es 0.

Valor devuelto

Un objeto PHP con propiedades que se corresponden con los nombres de campo del conjunto de resultados. Los valores de propiedad se rellenan con los valores de campo del conjunto de resultados correspondiente. Si la clase especificada con el parámetro $className opcional no existe o si no hay ningún conjunto de resultados activo asociado con la instrucción especificada, se devolverá el valor False . Si no hay más filas para recuperar, se devolverá el valor Null .

El tipo de datos de un valor en el objeto devuelto será el tipo de datos PHP predeterminado. Para obtener información sobre los tipos de datos PHP predeterminados, consulte Default PHP Data Types.

Observaciones

Si se especifica un nombre de clase con el parámetro opcional $className , se crea una instancia en un objeto de este tipo de clase. Si la clase tiene propiedades cuyos nombres coinciden con los nombres de campo del conjunto de resultados, los valores correspondientes del conjunto de resultados se aplican a las propiedades. Si un nombre de campo del conjunto de resultados no coincide con una propiedad de clase, se agrega una propiedad con el nombre de campo del conjunto de resultados al objeto y el valor del conjunto de resultados se aplica a la propiedad.

Las reglas siguientes se aplican cuando se especifica una clase con el parámetro $className :

  • La coincidencia distingue entre mayúsculas y minúsculas. Por ejemplo, el nombre de propiedad CustomerId no coincide con el nombre del campo CustomerID. En este caso, se agregaría una propiedad CustomerID al objeto y el valor del campo CustomerID se otorgaría a la propiedad CustomerID.

  • La coincidencia se produce independientemente de los modificadores de acceso. Por ejemplo, si la clase especificada tiene una propiedad privada cuyo nombre coincide con un nombre de campo del conjunto de resultados, el valor del campo de conjunto de resultados se aplica a la propiedad.

  • Se omiten los tipos de datos de propiedad de clase. Si el campo "CustomerID" del conjunto de resultados es una cadena, pero la propiedad "CustomerID" de la clase es un valor entero, el valor de cadena del conjunto de resultados se crea en la propiedad "CustomerID".

  • Si la clase especificada no existe, la función devuelve False y agrega un error a la colección de errores. Para obtener información sobre cómo recuperar información de errores, consulte sqlsrv_errors.

Si se devuelve un campo sin nombre, sqlsrv_fetch_object descartará el valor del campo y generará una advertencia. Por ejemplo, observe esta instrucción de Transact-SQL que inserta un valor en una tabla de base de datos y recupera la clave principal generada por el servidor:

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

Si los resultados que devuelve esta consulta se recuperan con sqlsrv_fetch_object, el valor que devuelve SELECT SCOPE_IDENTITY() se descartará y se generará una advertencia. Para evitarlo, puede especificar un nombre para el campo devuelto en la instrucción de Transact-SQL. A continuación, se muestra una forma de especificar un nombre de columna en Transact-SQL:

SELECT SCOPE_IDENTITY() AS PictureID

Ejemplo de objeto

En el siguiente ejemplo se recupera cada fila de un conjunto de resultados como un objeto PHP. En el ejemplo se da por hecho que SQL Server y la base de datos AdventureWorks están instalados en el equipo local. Los resultados se agregan a la consola cuando se ejecuta el ejemplo en la línea 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);  
?>  

Ejemplo de clase

En el ejemplo siguiente se recupera cada fila de un conjunto de resultados como una instancia de la clase Product definida en la secuencia de comandos. En el ejemplo se recupera información del producto de las tablas Purchasing.PurchaseOrderDetail y Production.Product de la base de datos AdventureWorks para productos que tienen una fecha de vencimiento especificada (DueDate) y una cantidad mantenida en existencias (StockQty) inferior a un valor determinado. En el ejemplo se resaltan algunas de las reglas que se aplican cuando se especifica una clase en una llamada a sqlsrv_fetch_object:

  • La variable $product es una instancia de la clase Product , ya que se especificó "Product" con el parámetro $className y existe la clase Product .

  • La propiedad Name se agrega a la instancia $product porque no coincide con la propiedad existente name .

  • La propiedad Color se agrega a la instancia $product porque no hay ninguna propiedad coincidente.

  • La propiedad privada UnitPrice se rellena con el valor del campo UnitPrice .

En el ejemplo se da por hecho que SQL Server y la base de datos AdventureWorks están instalados en el equipo local. Los resultados se agregan a la consola cuando se ejecuta el ejemplo en la línea 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  
        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 siempre devuelve datos según los Default PHP Data Types. Para obtener información sobre cómo especificar el tipo de datos PHP, vea Procedimiento para especificar tipos de datos PHP.

Si se devuelve un campo sin nombre, sqlsrv_fetch_object descartará el valor del campo y generará una advertencia. Por ejemplo, observe esta instrucción de Transact-SQL que inserta un valor en una tabla de base de datos y recupera la clave principal generada por el servidor:

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

Si los resultados que devuelve esta consulta se recuperan con sqlsrv_fetch_object, el valor que devuelve SELECT SCOPE_IDENTITY() se descartará y se generará una advertencia. Para evitarlo, puede especificar un nombre para el campo devuelto en la instrucción de Transact-SQL. A continuación, se muestra una forma de especificar un nombre de columna en Transact-SQL:

SELECT SCOPE_IDENTITY() AS PictureID

Consulte también

Recuperación de datos

Sobre los ejemplos de código de la documentación

Referencia de API del controlador SQLSRV