SQL Server Driver for PHP에서는 데이터 행을 PHP 개체로 검색하는 sqlsrv_fetch_object 함수를 제공합니다. 이 항목에서는 sqlsrv_fetch_object 호출에 선택적 $className 매개 변수를 사용하여 데이터를 검색하는 방법에 대해 설명합니다. 선택적 $className 매개 변수를 사용하지 않고 데이터를 개체로 검색하는 방법을 보여 주는 예제는 sqlsrv_fetch_object를 참조하십시오.
선택적 $className 매개 변수에 클래스 이름을 지정한 경우 이 클래스 유형의 개체가 인스턴스화됩니다. 클래스 속성 이름이 결과 집합 필드 이름과 일치하는 경우 해당하는 결과 집합 값이 해당 속성에 적용됩니다. 결과 집합 필드 이름이 클래스 속성과 일치하지 않는 경우 결과 집합 필드 이름을 사용하는 속성이 개체에 추가되며 결과 집합 값이 속성에 적용됩니다.
$className 매개 변수를 사용하여 클래스를 지정할 때 다음 규칙이 적용됩니다.
- 일치 조건에서 대/소문자를 구분합니다. 예를 들어, 속성 이름 CustomerId는 필드 이름 CustomerID와 일치하지 않습니다. 이 경우 CustomerID 속성은 개체에 추가되며 CustomerID 필드의 값은 CustomerID 속성에 제공됩니다.
- 일치 조건은 액세스 한정자와 관계없이 발생합니다. 예를 들어, 지정된 클래스의 개인 속성 이름이 결과 집합 필드 이름과 일치하는 경우 결과 집합 필드의 값이 해당 속성에 적용됩니다.
- 클래스 속성의 데이터 형식은 무시됩니다. 결과 집합의 "CustomerID" 필드는 문자열이지만 클래스의 "CustomerID" 속성은 정수인 경우 결과 집합의 문자열 값이 "CustomerID" 속성에 기록됩니다.
- 지정된 클래스가 없는 경우 함수에서는 false를 반환하며 오류를 오류 컬렉션에 추가합니다. 오류 정보를 검색하는 방법은 sqlsrv_errors를 참조하십시오.
예
다음 예제에서는 결과 집합의 각 행을 스크립트에 정의된 Product 클래스의 인스턴스로 검색합니다. 이 예제에서는 AdventureWorks 데이터베이스의 Purchasing.PurchaseOrderDetail 및 Production.Product 테이블에 있는 제품 정보에서 재고 수량(StockQty)이 지정된 값 미만이며 지정된 기한(DueDate)을 갖는 제품을 검색합니다. sqlsrv_fetch_object 호출에서 클래스를 지정할 때 적용되는 몇 가지 규칙은 다음과 같습니다.
- "Product"는 $className 매개 변수에 지정되었고 Product 클래스가 존재하므로 $product 변수는 Product 클래스의 인스턴스입니다.
- Name 속성은 기존 name 속성과 일치하지 않으므로 $product 인스턴스에 추가됩니다.
- 일치하는 속성이 없으므로 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
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);
?>
sqlsrv_fetch_object 함수는 항상 기본 PHP 데이터 형식에 따라 데이터를 반환합니다. PHP 데이터 형식을 지정하는 방법은 방법: PHP 데이터 형식 지정 또는 방법: 단일 필드 검색을 참조하십시오.
이름이 없는 필드가 반환되는 경우 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
참고 항목
개념
데이터 검색 함수 비교
설명서에 포함된 코드 예제 정보