Cara: Melakukan Kueri Berparameter
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:
Letakkan tanda tanya (?) sebagai tempat penampung parameter dalam string Transact-SQL yang merupakan kueri yang akan dijalankan.
Menginisialisasi atau memperbarui variabel PHP yang sesuai dengan tempat penampung dalam kueri Transact-SQL.
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.
Jalankan kueri:
Jika Anda menggunakan driver SQLSRV, gunakan sqlsrv_query atau sqlsrv_prepare/sqlsrv_execute.
Jika Anda menggunakan driver PDO_SQLSRV, jalankan kueri dengan PDO::p repare dan PDOStatement::execute. Topik untuk PDO::p repare dan PDOStatement::execute memiliki contoh kode.
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
Pertimbangan Keamanan untuk Driver Microsoft untuk PHP untuk SQL Server