Bagikan melalui


Cara: Melakukan 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. Menginisialisasi atau memperbarui variabel PHP yang sesuai dengan tempat penampung 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 dalam urutan yang sama dengan tempat penampung yang dimaksudkan untuk mewakilinya.

  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 kueri UPDATE.

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 baik untuk menjalankan kueri satu kali karena melakukan persiapan pernyataan dan eksekusi. 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.

Contoh persiapan

Contoh berikut menunjukkan pengikatan implisit variabel saat Anda menggunakan fungsi sqlsrv_prepare . Contoh 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);  
?>  

Lihat Juga

Mengonversi Tipe Data

Pertimbangan Keamanan untuk Driver Microsoft untuk PHP untuk SQL Server

Tentang Contoh Kode dalam Dokumentasi

sqlsrv_rows_affected