Поделиться через


sqlsrv_fetch_object

Скачать драйвер PHP

Извлекает следующую строку данных в качестве объекта PHP.

Синтаксис

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

Параметры

$stmt: ресурс инструкции, соответствующий выполненной инструкции.

$className (НЕОБЯЗАТЕЛЬНО): строка, задающая имя класса, экземпляр которого требуется создать. Если значение параметра $className не указано, создается экземпляр stdClass PHP.

$ctorParams (НЕОБЯЗАТЕЛЬНО): массив значений, которые передаются в конструктор класса, указанного с помощью параметра $className. Если конструктор указанного класса принимает значения параметров, при вызове $ctorParams object sqlsrv_fetch_object.

row (НЕОБЯЗАТЕЛЬНО): одно из следующих значений, определяющее строку, к которой требуется получить доступ в результирующем наборе, использующем прокручиваемый курсор. (Если указан параметр row, необходимо явным образом указать параметры $className и $ctorParams, даже если для $className и $ctorParams потребуется указать значение NULL.)

  • SQLSRV_SCROLL_NEXT

  • SQLSRV_SCROLL_PRIOR

  • SQLSRV_SCROLL_FIRST

  • SQLSRV_SCROLL_LAST

  • SQLSRV_SCROLL_ABSOLUTE

  • SQLSRV_SCROLL_RELATIVE

Дополнительные сведения об этих значениях см. в статье Указание типа курсора и выбор строк.

offset (необязательно): используется с SQLSRV_SCROLL_ABSOLUTE и SQLSRV_SCROLL_RELATIVE для указания извлекаемой строки. Первой записью в результирующем наборе является 0.

Возвращаемое значение

Объект PHP со свойствами, соответствующими именам полей результирующего набора. Значения свойств заполняются соответствующими значениями полей результирующего набора. Если класс, указанный с помощью необязательного параметра $className , не существует или отсутствует активный результирующий набор, сопоставленный с указанной инструкцией, возвращается значение false . Если больше нет строк для извлечения, возвращается значение null .

Для значения в возвращенном объекте используется тип данных PHP по умолчанию. Дополнительные сведения о типах данных PHP по умолчанию см. в статье Default PHP Data Types.

Замечания

Если имя класса указано с помощью необязательного параметра $className , создается экземпляр объекта этого типа класса. Если класс имеет свойства, имена которых совпадают с именами полей результирующего набора, к свойствам применяются соответствующие значения результирующего набора. Если имя поля результирующего набора не соответствует свойству класса, к объекту добавляется свойство с именем поля результирующего набора, а к этому свойству применяется значение результирующего набора.

При указании класса с помощью параметра $className применяются следующие правила:

  • Сравнение осуществляется с учетом регистра. Например, имя свойства CustomerId не соответствует имени поля CustomerID. В этом случае к объекту добавляется свойство CustomerID, а значение поля CustomerID присваивается свойству CustomerID.

  • Сравнение осуществляется независимо от модификаторов доступа. Например, если указанный класс имеет закрытое свойство, имя которого соответствует имени поля результирующего набора, к свойству применяется значение из этого поля результирующего набора.

  • Типы данных свойств класса не учитываются. Если поле "CustomerID" результирующего набора является строкой, а свойство "CustomerID" класса является целым числом, в свойство "CustomerID" записывается строковое значение из результирующего набора.

  • Если указанный класс не существует, функция возвращает значение false и добавляет ошибку в коллекцию ошибок. Информацию об извлечении сведений об ошибках см. в статье sqlsrv_errors.

Если возвращается поле без имени, sqlsrv_fetch_object отменяет значение поля и выдает предупреждение. Например, рассмотрим эту инструкцию Transact-SQL, которая вставляет значение в таблицу базы данных и извлекает созданный сервером первичный ключ:

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

Если результаты, возвращаемые этим запросом, извлекаются с помощью sqlsrv_fetch_object, значение, возвращаемое SELECT SCOPE_IDENTITY() , отменяется и выдается предупреждение. Чтобы избежать этого, можно указать имя возвращаемого поля в инструкции Transact-SQL. Ниже приведен один из способов указания имени столбца в Transact-SQL.

SELECT SCOPE_IDENTITY() AS PictureID

Пример объекта

Следующий пример извлекает каждую строку результирующего набора в виде объекта PHP. В примере предполагается, что SQL Server и база данных AdventureWorks установлены на локальном компьютере. При выполнении примера из командной строки все выходные данные выводятся в консоль.

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

Пример класса

Следующий пример извлекает каждую строку результирующего набора в виде экземпляра класса Product , определенного в скрипте. В примере извлекаются сведения о продукте из таблиц Purchasing.PurchaseOrderDetail и Production.Product базы данных AdventureWorks для продуктов, имеющих указанный срок (DueDate) и количество запасов (StockQty) меньше указанного значения. В примере представлены некоторые правила, применяемые при указании класса в вызове sqlsrv_fetch_object:

  • Переменная $product является экземпляром класса Product , так как "Product" был указан с параметром $className , а класс Product существует.

  • Свойство Name добавляется в экземпляр $product , так как существующее свойство name не совпадает.

  • Свойство Color добавляется в экземпляр $product , так как отсутствует совпадающее свойство.

  • Закрытое свойство UnitPrice заполняется значением поля UnitPrice .

В примере предполагается, что SQL Server и базы данных AdventureWorks установлены на локальном компьютере. При выполнении примера из командной строки все выходные данные выводятся в консоль.

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

Переменная sqlsrv_fetch_object всегда возвращает данные в соответствии с Default PHP Data Types. (Дополнительные сведения об указании типа данных PHP см. в статье How to: Specify PHP Data Types.)

Если возвращается поле без имени, sqlsrv_fetch_object отменяет значение поля и выдает предупреждение. Например, рассмотрим эту инструкцию Transact-SQL, которая вставляет значение в таблицу базы данных и извлекает созданный сервером первичный ключ:

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

Если результаты, возвращаемые этим запросом, извлекаются с помощью sqlsrv_fetch_object, значение, возвращаемое SELECT SCOPE_IDENTITY() , отменяется и выдается предупреждение. Чтобы избежать этого, можно указать имя возвращаемого поля в инструкции Transact-SQL. Ниже приведен один из способов указания имени столбца в Transact-SQL.

SELECT SCOPE_IDENTITY() AS PictureID

См. также

Извлечение данных

Информация о примерах кода в документации

Справочник по API для драйвера SQLSRV