방법: 매개 변수가 있는 쿼리 수행
이 항목에서는 MICROSOFT Drivers for PHP for SQL Server를 사용하여 매개 변수가 있는 쿼리를 수행하는 방법을 요약하여 보여줍니다.
매개 변수가 있는 쿼리를 수행하는 단계는 다음 네 단계로 요약할 수 있습니다.
실행할 쿼리인 Transact-SQL 문자열에 매개 변수 자리 표시자로 물음표(?)를 넣습니다.
Transact-SQL 쿼리의 자리 표시자에 해당하는 PHP 변수를 초기화하거나 업데이트합니다.
2단계의 PHP 변수를 사용하여 Transact-SQL 문자열의 매개 변수 자리 표시자에 해당하는 매개 변수 값의 배열을 만들거나 업데이트합니다. 배열의 매개 변수 값은 이를 나타내는 자리 표시자와 순서가 동일해야 합니다.
쿼리를 실행합니다.
SQLSRV 드라이버를 사용하는 경우 sqlsrv_query 또는 sqlsrv_prepare/sqlsrv_execute를 사용합니다.
PDO_SQLSRV 드라이버를 사용하는 경우 PDO::prepare 및 PDOStatement::execute를 사용하여 쿼리를 실행합니다. PDO::prepare 및 PDOStatement::execute에 대한 항목에서는 코드 예시를 제공합니다.
이 항목의 나머지 부분에서는 SQLSRV 드라이버를 사용한 매개 변수가 있는 쿼리에 대해 설명합니다.
참고 항목
매개 변수는 sqlsrv_prepare를 사용합니다. 즉, sqlsrv_prepare를 사용하여 매개 변수가 있는 쿼리를 준비하고 매개 변수 배열의 값을 업데이트하면 다음에 쿼리를 실행할 때 업데이트된 값이 사용됩니다. 자세한 내용은 이 항목의 두 번째 예시를 참조하세요.
쿼리 예시
다음 예시에서는 AdventureWorks 데이터베이스의 Production.ProductInventory 테이블에서 지정된 제품 ID에 대한 수량을 업데이트합니다. 수량 및 제품 ID는 업데이트 쿼리의 매개 변수입니다.
그런 다음 데이터베이스를 쿼리하여 수량이 올바르게 업데이트되었는지 확인합니다. 제품 ID는 SELECT 쿼리의 매개 변수입니다.
이 예시에서는 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));
}
/* Define the Transact-SQL query.
Use question marks as parameter placeholders. */
$tsql1 = "UPDATE Production.ProductInventory
SET Quantity = ?
WHERE ProductID = ?";
/* Initialize $qty and $productId */
$qty = 10; $productId = 709;
/* Execute the statement with the specified parameter values. */
$stmt1 = sqlsrv_query( $conn, $tsql1, array($qty, $productId));
if( $stmt1 === false )
{
echo "Statement 1 could not be executed.\n";
die( print_r( sqlsrv_errors(), true));
}
/* Free statement resources. */
sqlsrv_free_stmt( $stmt1);
/* Now verify the updated quantity.
Use a question mark as parameter placeholder. */
$tsql2 = "SELECT Quantity
FROM Production.ProductInventory
WHERE ProductID = ?";
/* Execute the statement with the specified parameter value.
Display the returned data if no errors occur. */
$stmt2 = sqlsrv_query( $conn, $tsql2, array($productId));
if( $stmt2 === false )
{
echo "Statement 2 could not be executed.\n";
die( print_r(sqlsrv_errors(), true));
}
else
{
$qty = sqlsrv_fetch_array( $stmt2);
echo "There are $qty[0] of product $productId in inventory.\n";
}
/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt2);
sqlsrv_close( $conn);
?>
이전 예시에서는 쿼리를 실행하기 위해 sqlsrv_query 함수를 사용했습니다. 이 함수는 문 준비와 실행을 모두 수행하므로 일회성 쿼리를 실행하는 데 유용합니다. 다른 매개 변수 값을 가진 쿼리를 다시 실행하기 위해서는 sqlsrv_prepare/sqlsrv_execute 조합이 가장 적합합니다. 다른 매개 변수 값을 사용하여 쿼리를 다시 실행하는 예시를 살펴보려면 다음 예시를 참조하세요.
예시 준비
다음 예시에서는 sqlsrv_prepare 함수를 사용할 때 변수의 암시적 바인딩을 보여줍니다. 이 예시에서는 여러 판매 주문을 Sales.SalesOrderDetail 테이블에 삽입합니다. sqlsrv_prepare가 호출될 때 $params 배열이 문($stmt)에 바인딩됩니다. 테이블에 새 판매 주문을 삽입하는 쿼리를 실행할 때마다 판매 주문 세부 정보에 해당하는 새 값으로 $params 배열이 업데이트됩니다. 이후 쿼리 실행에서는 새 매개 변수 값을 사용합니다.
이 예시에서는 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));
}
$tsql = "INSERT INTO Sales.SalesOrderDetail (SalesOrderID,
OrderQty,
ProductID,
SpecialOfferID,
UnitPrice)
VALUES (?, ?, ?, ?, ?)";
/* Each sub array here will be a parameter array for a query.
The values in each sub array are, in order, SalesOrderID, OrderQty,
ProductID, SpecialOfferID, UnitPrice. */
$parameters = array( array(43659, 8, 711, 1, 20.19),
array(43660, 6, 762, 1, 419.46),
array(43661, 4, 741, 1, 818.70)
);
/* Initialize parameter values. */
$orderId = 0;
$qty = 0;
$prodId = 0;
$specialOfferId = 0;
$price = 0.0;
/* Prepare the statement. $params is implicitly bound to $stmt. */
$stmt = sqlsrv_prepare( $conn, $tsql, array( &$orderId,
&$qty,
&$prodId,
&$specialOfferId,
&$price));
if( $stmt === false )
{
echo "Statement could not be prepared.\n";
die( print_r( sqlsrv_errors(), true));
}
/* Execute a statement for each set of params in $parameters.
Because $params is bound to $stmt, as the values are changed, the
new values are used in the subsequent execution. */
foreach( $parameters as $params)
{
list($orderId, $qty, $prodId, $specialOfferId, $price) = $params;
if( sqlsrv_execute($stmt) === false )
{
echo "Statement could not be executed.\n";
die( print_r( sqlsrv_errors(), true));
}
else
{
/* Verify that the row was successfully inserted. */
echo "Rows affected: ".sqlsrv_rows_affected( $stmt )."\n";
}
}
/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn);
?>