Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este tópico resume e demonstra como usar os Microsoft Drivers for PHP para SQL Server para realizar uma consulta parametrizada.
Os passos para realizar uma consulta parametrizada podem ser resumidos em quatro passos:
Coloque pontos de interrogação (?) como marcadores de parâmetros na cadeia de Transact-SQL que é a consulta a executar.
Inicialize ou atualize as variáveis PHP que correspondam aos marcadores de posição na consulta Transact-SQL.
Use variáveis PHP do passo 2 para criar ou atualizar um array de valores de parâmetros que correspondem a marcadores de parâmetros na cadeia Transact-SQL. Os valores dos parâmetros no array devem estar na mesma ordem dos marcadores de posição destinados a representá-los.
Execute a consulta:
Se estiveres a usar o driver SQLSRV, usa sqlsrv_query ou sqlsrv_prepare/sqlsrv_execute.
Se estiver a usar o driver PDO_SQLSRV, execute a consulta com PDO::prepare e PDOStatement::execute. Os tópicos para PDO::prepare e PDOStatement::execute têm exemplos de código.
O resto deste tópico discute consultas parametrizadas usando o driver SQLSRV.
Observação
Os parâmetros são implicitamente ligados usando sqlsrv_prepare. Isto significa que, se uma consulta parametrizada for preparada usando sqlsrv_prepare e os valores no array de parâmetros forem atualizados, os valores atualizados serão usados na próxima execução da consulta. Veja o segundo exemplo deste tópico para mais detalhes.
Exemplo de consulta
O exemplo seguinte atualiza a quantidade para um ID de produto especificado na tabela Production.ProductInventory da base de dados AdventureWorks. A quantidade e o ID do produto são parâmetros na consulta UPDATE.
O exemplo consulta então a base de dados para verificar se a quantidade foi atualizada corretamente. O ID do produto é um parâmetro na consulta SELECT.
O exemplo assume que o SQL Server e a base de dados AdventureWorks estão instalados no computador local. Toda a saída é escrita para a consola quando o exemplo é executado a partir da linha de comandos.
<?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);
?>
O exemplo anterior usa a função sqlsrv_query para executar consultas. Esta função é boa para executar consultas únicas, pois faz a preparação e a execução das instruções. A combinação de sqlsrv_prepare/sqlsrv_execute é a melhor para a reexecução de uma consulta com valores de parâmetro diferentes. Para ver um exemplo de reexecução de uma consulta com valores de parâmetro diferentes, veja o próximo exemplo.
Preparar exemplo
O exemplo seguinte demonstra a ligação implícita de variáveis quando se usa a função sqlsrv_prepare . O exemplo insere várias encomendas de venda na tabela Sales.SalesOrderDetail . O $params array está ligado à instrução ($stmt) quando sqlsrv_prepare é chamado. Antes de cada execução de uma consulta que insere uma nova ordem de venda na tabela, o array de $params é atualizado com novos valores correspondentes aos detalhes da ordem de venda. A execução subsequente da consulta utiliza os novos valores de parâmetro.
O exemplo assume que o SQL Server e a base de dados AdventureWorks estão instalados no computador local. Toda a saída é escrita para a consola quando o exemplo é executado a partir da linha de comandos.
<?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);
?>
Ver também
Considerações de Segurança para os Controladores de PHP da Microsoft para SQL Server