次の方法で共有


パラメーター化されたクエリを実行する方法

このトピックでは、SQL Server Driver for PHP を使用してパラメータ化されたクエリを実行する方法について説明します。

パラメータ化されたクエリを実行する方法は、4 つの手順にまとめることができます。

  1. 実行対象のクエリである Transact-SQL 文字列に、パラメータのプレースホルダとして疑問符 (?) を含めます。
  2. Transact-SQL クエリ内のプレースホルダに対応する PHP 変数を初期化または更新します。
  3. 手順 2. の PHP 変数を使用して、Transact-SQL 文字列内のパラメータ プレースホルダに順番に対応するパラメータ値の配列を作成または更新します。
  4. sqlsrv_query、または sqlsrv_preparesqlsrv_execute の組み合わせを使用して、クエリを実行します。

注意

パラメータは、sqlsrv_prepare を使用することにより、暗黙的にバインドされます。つまり、sqlsrv_prepare を使用してパラメータ化されたクエリを準備し、パラメータ配列内の値を更新した場合、更新した値は、クエリを次回実行するときに使用されます。詳細については、このトピックの 2 番目の例を参照してください。

次の例では、AdventureWorks データベースの Production.ProductInventory テーブル内の指定した製品 ID の数量を更新します。数量および製品 ID は、UPDATE クエリのパラメータです。

次に、この例では、データベースに対してクエリを実行して、数量が正常に更新されたことを確認します。製品 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 関数を使用してクエリを実行しています。この関数は、ステートメントの準備と実行の両方を行うため、1 回限りのクエリを実行するのに適しています。sqlsrv_preparesqlsrv_execute の組み合わせは、異なるパラメータ値を使用してクエリを再実行する場合に適しています。異なるパラメータ値を使用してクエリを再実行する例については、次の例または「クエリを複数回実行する方法」を参照してください。

次の例は、sqlsrv_prepare 関数を使用する際の変数の暗黙的なバインドを示しています。この例では、複数の販売注文を Sales.SalesOrderDetail テーブルに挿入します。$params 配列は、sqlsrv_prepare が呼び出されるときにステートメント ($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);
?>

参照

リファレンス

sqlsrv_rows_affected

概念

セキュリティに関する注意点
ドキュメントのコード例について

その他のリソース

設計上の注意事項
データ型の変換