方法:パラメーター化クエリを実行するHow to: Perform Parameterized Queries

ダウンロードPHP Driver のダウンロードDownloadDownload PHP Driver

このトピックでは、 Microsoft SQL Server 用 Drivers for PHPMicrosoft Drivers for PHP for SQL Server を使用してパラメーター化クエリを実行する方法を説明し、実例を示します。This topic summarizes and demonstrates how to use the Microsoft SQL Server 用 Drivers for PHPMicrosoft Drivers for PHP for SQL Server to perform a parameterized query.

パラメーター化クエリを実行する手順は、次の 4 つのステップにまとめることができます。The steps for performing a parameterized query can be summarized into four steps:

  1. 実行するクエリである Transact-SQL の文字列にパラメーターのプレースホルダーとして疑問符 (?) を配置します。Put question marks (?) as parameter placeholders in the Transact-SQL string that is the query to be executed.

  2. Transact-SQL クエリ内のプレースホルダーに対応する PHP 変数を初期化または更新します。Initialize or update PHP variables that correspond to the placeholders in the Transact-SQL query.

  3. ステップ 2 の PHP 変数を使用して、Transact-SQL 文字列内のパラメーター プレースホルダーに対応するパラメーター値の配列を作成または更新します。Use PHP variables from step 2 to create or update an array of parameter values which correspond to parameter placeholders in the Transact-SQL string. 配列内のパラメーター値は、それらを表すためのプレースホルダーと同じ順序にする必要があります。The parameter values in the array must be in the same order as the placeholders meant to represent them.

  4. クエリを実行します。Execute the query:

以降では、SQLSRV ドライバーを使用するパラメーター化クエリについて説明します。The rest of this topic discusses parameterized queries using the SQLSRV driver.

注意

パラメーターは、 sqlsrv_prepareを使用します。Parameters are implicitly bound by using sqlsrv_prepare. つまり、 sqlsrv_prepare を使用してパラメーター化クエリを準備し、パラメーター配列内の値を更新した場合、更新された値はクエリの次の実行時に使用されます。This means that if a parameterized query is prepared using sqlsrv_prepare and values in the parameter array are updated, the updated values will be used upon the next execution of the query. 詳細については、このトピックの 2 番目の例を参照してください。See the second example in this topic for more detail.

クエリの例Query example

次の例では、AdventureWorks データベースの Production.ProductInventory テーブルで指定した製品 ID の数量を更新します。The following example updates the quantity for a specified product ID in the Production.ProductInventory table of the AdventureWorks database. 数量と製品 ID は、UPDATE クエリのパラメーターです。The quantity and product ID are parameters in the UPDATE query.

次の例では、データベースにクエリを発行して数量が正しく更新されたことを確認しています。The example then queries the database to verify that the quantity has been correctly updated. 製品 ID は、SELECT クエリのパラメーターです。The product ID is a parameter in the SELECT query.

この例では、ローカル コンピューターに SQL Server および AdventureWorks データベースがインストールされていることを前提にしています。The example assumes that SQL Server and the AdventureWorks database are installed on the local computer. コマンド ラインからこの例を実行すると、すべての出力はコンソールに書き込まれます。All output is written to the console when the example is run from the command line.

<?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 関数を使用してクエリを実行しています。The previous example uses the sqlsrv_query function to execute queries. この関数は、ステートメントの準備と実行の両方を行うため、1 回限りのクエリを実行するのに便利です。This function is good for executing one-time queries since it does both statement preparation and execution. 異なるパラメーター値でクエリを再実行するには、sqlsrv_prepare/sqlsrv_execute の組み合わせが最善です。The combination of sqlsrv_prepare/sqlsrv_execute is best for re-execution of a query with different parameter values. 異なるパラメーター値でクエリを再実行する例については、次の例を参照してください。To see an example of re-execution of a query with different parameter values, see the next example.

準備の例Prepare example

次の例では、 sqlsrv_prepare 関数を使用するときに変数を暗黙的にバインドする方法を示します。The following example demonstrates the implicit binding of variables when you use the sqlsrv_prepare function. この例では、複数の注文を Sales.SalesOrderDetail テーブルに挿入します。The example inserts several sales orders into the Sales.SalesOrderDetail table. sqlsrv_prepare を呼び出すと、 $params 配列がステートメント ( $stmt) にバインドされます。The $params array is bound to the statement ($stmt) when sqlsrv_prepare is called. テーブルに新しい注文を挿入する各クエリを実行する前に、 $params 配列が注文の詳細に対応する新しい値で更新されます。Before each execution of a query that inserts a new sales order into the table, the $params array is updated with new values corresponding to sales order details. 後続のクエリ実行では、新しいパラメーター値が使用されます。The subsequent query execution uses the new parameter values.

この例では、ローカル コンピューターに SQL Server および AdventureWorks データベースがインストールされていることを前提にしています。The example assumes that SQL Server and the AdventureWorks database are installed on the local computer. コマンド ラインからこの例を実行すると、すべての出力はコンソールに書き込まれます。All output is written to the console when the example is run from the command line.

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

参照See Also

データ型の変換Converting Data Types

Microsoft Drivers for PHP for SQL Server のセキュリティに関する考慮事項Security Considerations for the Microsoft Drivers for PHP for SQL Server

ドキュメントのコード例についてAbout Code Examples in the Documentation

sqlsrv_rows_affectedsqlsrv_rows_affected