Aracılığıyla paylaş


Nasıl yapılır: Parametreli Sorgular Gerçekleştirme

PHP sürücüsünü indirme

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:

  1. Yürütülecek sorgu olan Transact-SQL dizesine parametre yer tutucuları olarak soru işaretlerini (?) koyun.

  2. Transact-SQL sorgusundaki yer tutuculara karşılık gelen PHP değişkenlerini başlatın veya güncelleştirin.

  3. 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.

  4. Sorguyu yürüt:

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.

Veri Türlerini Dönüştürme

SQL Server için PHP Microsoft Sürücüleriyle İlgili Güvenlik Konuları

Belgelerde Kod Örnekleri Hakkında

sqlsrv_rows_affected