Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Det här avsnittet sammanfattar och visar hur du använder Microsoft-drivrutiner för PHP för SQL Server för att utföra en parametriserad fråga.
Stegen för att utföra en parametriserad fråga kan sammanfattas i fyra steg:
Ange frågetecken (?) som parameterplatshållare i den Transact-SQL sträng som är frågan som ska köras.
Initiera eller uppdatera PHP-variabler som motsvarar platshållarna i den Transact-SQL frågan.
Använd PHP-variabler från steg 2 för att skapa eller uppdatera en matris med parametervärden som motsvarar parameterplatshållare i Transact-SQL strängen. Parametervärdena i matrisen måste vara i samma ordning som platshållarna som är avsedda att representera dem.
Utför frågan:
Om du använder SQLSRV-drivrutinen bör du använda sqlsrv_query eller sqlsrv_prepare/ och sedan sqlsrv_execute.
Om du använder drivrutinen PDO_SQLSRV kör du frågan med PDO::prepare och PDOStatement::execute. Avsnitten för PDO::prepare och PDOStatement::execute har kodexempel.
Resten av det här avsnittet beskriver parametriserade frågor med hjälp av SQLSRV-drivrutinen.
Anmärkning
Parametrar är implicit bundna med hjälp av sqlsrv_prepare. Det innebär att om en parametriserad fråga förbereds med sqlsrv_prepare och värden i parametermatrisen uppdateras, används de uppdaterade värdena vid nästa körning av frågan. Mer information finns i det andra exemplet i det här avsnittet.
Frågeexempel
I följande exempel uppdateras kvantiteten för ett angivet produkt-ID i tabellen Production.ProductInventory i Databasen AdventureWorks. Kvantiteten och produkt-ID:t är parametrar i UPDATE-frågan.
Exemplet frågar sedan databasen för att kontrollera att kvantiteten har uppdaterats korrekt. Produkt-ID:t är en parameter i SELECT-frågan.
Exemplet förutsätter att SQL Server och AdventureWorks-databasen är installerade på den lokala datorn. Alla utdata skrivs till konsolen när exemplet körs från kommandoraden.
<?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);
?>
I föregående exempel används funktionen sqlsrv_query för att köra frågor. Den här funktionen är bra för att köra engångsfrågor eftersom den både förbereder och kör instruktionen. Kombinationen av sqlsrv_prepare/sqlsrv_execute är bäst för omkörning av en fråga med olika parametervärden. Ett exempel på omkörning av en fråga med olika parametervärden finns i nästa exempel.
Förbered exempel
I följande exempel visas implicit bindning av variabler när du använder funktionen sqlsrv_prepare . Exemplet infogar flera försäljningsorder i tabellen Sales.SalesOrderDetail . Matrisen $params är bunden till -instruktionen ($stmt) när sqlsrv_prepare anropas. Innan varje körning av en fråga som infogar en ny försäljningsorder i tabellen uppdateras den $params matrisen med nya värden som motsvarar försäljningsorderinformation. Den efterföljande frågekörningen använder de nya parametervärdena.
Exemplet förutsätter att SQL Server och AdventureWorks-databasen är installerade på den lokala datorn. Alla utdata skrivs till konsolen när exemplet körs från kommandoraden.
<?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);
?>
Se även
Säkerhetsöverväganden för Microsoft-drivrutiner för PHP för SQL Server