sqlsrv_fetch_object
Извлекает следующую строку данных в качестве объекта 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