Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu konu başlığında, parametreli sorgu gerçekleştirmek üzere SQL Server için PHP için Microsoft Sürücüleri'nin nasıl kullanılacağı özetlenmiş ve gösterilmiştir.
Parametreli sorgu gerçekleştirme adımları dört adımda özetlenebilir:
Yürütülecek sorgu olan Transact-SQL dizesine parametre yer tutucuları olarak soru işaretlerini (?) koyun.
Transact-SQL sorgusundaki yer tutuculara karşılık gelen PHP değişkenlerini başlatın veya güncelleştirin.
Transact-SQL dizesindeki parametre yer tutucularına karşılık gelen bir parametre değerleri dizisi oluşturmak veya güncelleştirmek için 2. adımdaki PHP değişkenlerini kullanın. Dizideki parametre değerleri, bunları temsil etmek için kullanılan yer tutucularla aynı sırada olmalıdır.
Sorguyu yürüt:
SQLSRV sürücüsünü kullanıyorsanız sqlsrv_query veya sqlsrv_prepare sqlsrv_execute/ kullanın.
PDO_SQLSRV sürücüsünü kullanıyorsanız, sorguyu PDO::prepare ve PDOStatement::execute ile yürütün. PDO::prepare ve PDOStatement::execute ile ilgili konular kod örnekleri içerir.
Bu konunun geri kalanında SQLSRV sürücüsünü kullanan parametreli sorgular ele alınmaktadır.
Uyarı
Parametreler , sqlsrv_prepare kullanılarak örtük olarak bağlıdır. Bu, parametreli bir sorgu sqlsrv_prepare kullanılarak hazırlanırsa ve parametre dizisindeki değerler güncelleştirilirse, güncelleştirilmiş değerlerin sorgunun bir sonraki yürütülmesinde kullanılacağı anlamına gelir. Daha fazla ayrıntı için bu konunun ikinci örneğine bakın.
Sorgu örneği
Aşağıdaki örnek, AdventureWorks veritabanının Production.ProductInventory tablosunda belirtilen ürün kimliği için miktarı güncelleştirir. Miktar ve ürün kimliği, UPDATE sorgusundaki parametrelerdir.
Daha sonra örnek, miktarın doğru güncelleştirildiğini doğrulamak için veritabanını sorgular. Ürün kimliği, SELECT sorgusundaki bir parametredir.
Örnekte SQL Server ve AdventureWorks veritabanının yerel bilgisayarda yüklü olduğu varsayılır. Örnek komut satırından çalıştırıldığında tüm çıkış konsola yazılır.
<?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);
?>
Önceki örnek sorguları yürütmek için sqlsrv_query işlevini kullanır. Bu fonksiyon, hem sorgu hazırlığı hem de çalıştırma gerçekleştirdiğinden tek seferlik sorguları yürütmek için iyidir. sqlsrv_prepare/sqlsrv_execute birleşimi, farklı parametre değerlerine sahip bir sorgunun yeniden yürütülmesi için en iyisidir. Farklı parametre değerlerine sahip bir sorgunun yeniden yürütülmesine ilişkin bir örnek görmek için sonraki örne bakın.
Örneği hazırlama
Aşağıdaki örnekte sqlsrv_prepare işlevini kullandığınızda değişkenlerin örtük olarak bağlanması gösterilmektedir. Örnek Sales.SalesOrderDetail tablosuna birkaç satış siparişi ekler. $params dizisi, sqlsrv_prepare çağrıldığında deyimine ($stmt) bağlıdır. Tabloya yeni bir satış siparişi ekleyen bir sorgunun her yürütülmesinden önce , $params dizisi satış siparişi ayrıntılarına karşılık gelen yeni değerlerle güncelleştirilir. Sonraki sorgu yürütme yeni parametre değerlerini kullanır.
Örnekte SQL Server ve AdventureWorks veritabanının yerel bilgisayarda yüklü olduğu varsayılır. Örnek komut satırından çalıştırıldığında tüm çıkış konsola yazılır.
<?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);
?>
Ayrıca Bkz.
SQL Server için PHP Microsoft Sürücüleriyle İlgili Güvenlik Konuları