Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Ez a témakör összefoglalja és bemutatja, hogyan használható a Microsoft Drivers for PHP for SQL Server paraméteres lekérdezés végrehajtására.
A paraméteres lekérdezés végrehajtásának lépései négy lépésben foglalhatók össze:
Kérdőjeleket (?) adjon meg paraméterhelyőrzőként a végrehajtandó Transact-SQL lekérdezés karakterláncában.
A Transact-SQL lekérdezés helyőrzőinek megfelelő PHP-változók inicializálása vagy frissítése.
A 2. lépésben használt PHP-változókkal olyan paraméterértékekből álló tömböt hozhat létre vagy frissíthet, amelyek megfelelnek a Transact-SQL sztring paraméterhelyőrzőinek. A tömb paraméterértékeinek ugyanabban a sorrendben kell lenniük, mint az őket ábrázoló helyőrzőknek.
Hajtsa végre a lekérdezést:
Ha az SQLSRV-illesztőt használja, használja sqlsrv_query vagy sqlsrv_prepare/sqlsrv_execute.
Ha a PDO_SQLSRV illesztőt használja, hajtsa végre a lekérdezést az PDO::prepare és a PDOStatement::execute paranccsal. Az PDO::prepare és PDOStatement::execute témakörök példakódokkal rendelkeznek.
A témakör további része az SQLSRV-illesztőprogramot használó paraméteres lekérdezéseket ismerteti.
Megjegyzés:
Az sqlsrv_prepare függvénnyel a paraméterek implicit módon vannak kötve. Ez azt jelenti, hogy ha egy paraméteres lekérdezést sqlsrv_prepare használ, és a paramétertömb értékei frissülnek, a frissített értékek a lekérdezés következő végrehajtásakor lesznek felhasználva. További részletekért tekintse meg a témakör második példáját.
Példa lekérdezésre
Az alábbi példa frissíti egy adott termékazonosító mennyiségét az AdventureWorks adatbázis Production.ProductInventory táblájában. A mennyiség és a termékazonosító az UPDATE lekérdezés paraméterei.
A példa ezután lekérdezi az adatbázist annak ellenőrzéséhez, hogy a mennyiség megfelelően lett-e frissítve. A termékazonosító a SELECT lekérdezés egyik paramétere.
A példa feltételezi, hogy az SQL Server és az AdventureWorks adatbázis telepítve van a helyi számítógépen. A rendszer minden kimenetet a konzolra ír, amikor a példa a parancssorból fut.
<?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);
?>
Az előző példa a sqlsrv_query függvényt használja a lekérdezések végrehajtásához. Ez a függvény jó az egyszeri lekérdezések végrehajtásához, mivel az utasítás-előkészítést és a végrehajtást is elvégzi. A sqlsrv_prepare/sqlsrv_execute kombinációja a legjobb megoldás a különböző paraméterértékekkel rendelkező lekérdezések újrafuttatásához. A különböző paraméterértékekkel rendelkező lekérdezések újrafuttatásának példáját a következő példában tekintheti meg.
Példa előkészítése
Az alábbi példa a változók implicit kötését mutatja be a sqlsrv_prepare függvény használatakor. A példa több értékesítési rendelést szúr be a Sales.SalesOrderDetail táblába. A $params tömb a sqlsrv_prepare meghívásakor az utasításhoz ($stmt) van kötve. Az új értékesítési rendelést a táblába beszúró lekérdezések végrehajtása előtt a $params tömb frissül az értékesítési rendelés részleteinek megfelelő új értékekkel. Az ezt követő lekérdezés végrehajtása az új paraméterértékeket használja.
A példa feltételezi, hogy az SQL Server és az AdventureWorks adatbázis telepítve van a helyi számítógépen. A rendszer minden kimenetet a konzolra ír, amikor a példa a parancssorból fut.
<?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);
?>
Lásd még:
Biztonsági megfontolások a Microsoft SQL Server PHP for PHP illesztőprogramjaihoz