Cara Menjalankan Kueri Berparameter

Unduh driver PHP

Topik ini meringkas dan menunjukkan cara menggunakan Driver Microsoft untuk PHP untuk SQL Server untuk melakukan kueri berparameter.

Langkah-langkah untuk melakukan kueri berparameter dapat diringkas menjadi empat langkah:

  1. Letakkan tanda tanya (?) sebagai tempat penampung parameter dalam string Transact-SQL yang merupakan kueri yang akan dijalankan.

  2. Inisialisasi atau perbarui variabel PHP yang sesuai dengan placeholder dalam kueri Transact-SQL.

  3. Gunakan variabel PHP dari langkah 2 untuk membuat atau memperbarui array nilai parameter yang sesuai dengan tempat penampung parameter dalam string Transact-SQL. Nilai parameter dalam array harus berada dalam urutan yang sama dengan placeholder yang diwakilinya.

  4. Jalankan kueri:

Topik lainnya membahas kueri berparameter menggunakan driver SQLSRV.

Catatan

Parameter secara implisit terikat dengan menggunakan sqlsrv_prepare. Ini berarti bahwa jika kueri berparameter disiapkan menggunakan sqlsrv_prepare dan nilai dalam array parameter diperbarui, nilai yang diperbarui akan digunakan pada eksekusi kueri berikutnya. Lihat contoh kedua dalam topik ini untuk detail selengkapnya.

Contoh kueri

Contoh berikut memperbarui kuantitas untuk ID produk tertentu dalam tabel Production.ProductInventory database AdventureWorks. Kuantitas dan ID produk adalah parameter dalam UPDATE kueri.

Contoh kemudian meminta database untuk memverifikasi bahwa kuantitas telah diperbarui dengan benar. ID produk adalah parameter dalam kueri SELECT.

Contoh mengasumsikan bahwa SQL Server dan database AdventureWorks diinstal di komputer lokal. Semua output ditulis ke konsol saat contoh dijalankan dari baris perintah.

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

Contoh sebelumnya menggunakan fungsi sqlsrv_query untuk menjalankan kueri. Fungsi ini cocok untuk mengeksekusi kueri satu kali karena fungsi ini menyiapkan pernyataan dan mengeksekusinya. Kombinasi sqlsrv_execute sqlsrv_prepare/adalah yang terbaik untuk eksekusi ulang kueri dengan nilai parameter yang berbeda. Untuk melihat contoh eksekusi ulang kueri dengan nilai parameter yang berbeda, lihat contoh berikutnya.

Siapkan contoh

Contoh berikut menunjukkan pengikatan implisit variabel saat Anda menggunakan fungsi sqlsrv_prepare . Contoh ini menyisipkan beberapa pesanan penjualan ke dalam tabel Sales.SalesOrderDetail. Array $params terikat ke pernyataan ($stmt) saat sqlsrv_prepare dipanggil. Sebelum setiap eksekusi kueri yang menyisipkan pesanan penjualan baru ke dalam tabel, array $params diperbarui dengan nilai baru yang sesuai dengan detail pesanan penjualan. Eksekusi kueri berikutnya menggunakan nilai parameter baru.

Contoh mengasumsikan bahwa SQL Server dan database AdventureWorks diinstal di komputer lokal. Semua output ditulis ke konsol saat contoh dijalankan dari baris perintah.

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