Compartir a través de


Cómo recuperar datos como un objeto

El Controlador de SQL Server para PHP proporciona la función sqlsrv_fetch_object para recuperar una fila de datos como un objeto PHP. En este tema se describe cómo recuperar datos cuando el parámetro opcional $className se usa en la llamada a sqlsrv_fetch_object. Para ver un ejemplo donde se muestra cómo recuperar datos como un objeto sin usar el parámetro opcional $className, vea sqlsrv_fetch_object.

Si se especifica un nombre de clase con el parámetro opcional $className, se crea una instancia de un objeto de este tipo de clase. Si las propiedades de la clase tienen nombres que coinciden con los nombres de campo del conjunto de resultados, los correspondientes valores 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.

Cuando se especifica una clase con el parámetro $className, se aplican las siguientes reglas:

  • Se produce una coincidencia con distinción de mayúsculas y minúsculas. Por ejemplo, el nombre de propiedad CustomerId no coincide con el nombre de campo CustomerID. En este caso, se agregaría una propiedad CustormerID al objeto y el valor del campo CustomerID se daría a la propiedad CustomerID.
  • La coincidencia se produce con independencia de los modificadores de acceso. Por ejemplo, si la clase especificada tiene una propiedad privada cuyo nombre coincide con el nombre de campo del conjunto de resultados, se aplica a la propiedad el valor del campo del conjunto de resultados.
  • Se pasan por alto los tipos de datos de una propiedad de clase. Si el campo "CustomerID" del conjunto de resultados es una cadena pero la propiedad de la clase "CustomerID" es un entero, el valor de la cadena del conjunto de resultados se escribe 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 acerca de cómo recuperar información de error, vea sqlsrv_errors.

Ejemplo

En el siguiente ejemplo se recupera cada fila de un conjunto de resultados como una instancia de la clase Product definida en el script. En el ejemplo se recupera información de las tablas Purchasing.PurchaseOrderDetail y Production.Product de la base de datos AdventureWorks para aquellos productos que tienen una fecha de vencimiento especificada (DueDate) y menos existencias que el valor especificado (StockQty). En el ejemplo se resaltan algunas de las reglas aplicadas al especificar una clase en una llamada a sqlsrv_fetch_object:

  • La variable $product es una instancia de la clase Product, debido a que se especificó "Product" con el parámetro $className y existe la clase Product.
  • La propiedad Name se agrega a la instancia $product porque la propiedad name existente no coincide.
  • La propiedad Color se agrega a la instancia $product porque no hay ninguna propiedad que coincida.
  • La propiedad privada UnitPrice se rellena con el valor del campo UnitPrice.

En el ejemplo se supone que SQL Server y la base de datos AdventureWorks están instalados en el equipo local. Cuando se ejecuta el ejemplo desde la línea de comandos, todos los resultados se escriben en la consola.

<?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 función sqlsrv_fetch_object siempre devuelve datos según los Tipos de datos predeterminados de PHP. Para obtener información acerca de cómo especificar el tipo de datos de PHP, vea Cómo especificar tipos de datos de PHP o Cómo recuperar un campo único.

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

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

SELECT SCOPE_IDENTITY()

Si los resultados devueltos por esta consulta se recuperan con sqlsrv_fetch_object, se descartará el valor que devuelve SELECT SCOPE_IDENTITY() y se emitirá una advertencia. Para evitar esto, 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

Vea también

Conceptos

Comparar las funciones de recuperación de datos
Acerca de ejemplos de código en la documentación

Otros recursos

Recuperar datos
Guía de programación