php - 如何使用sqlsrv和 "?"样式参数在php中执行存储过程

标签 php sql stored-procedures sql-server-2005 sqlsrv

我查看了其他几个看起来(从标题上看)与此相同的问题。但是,我的情况有点不同。

以下工作(即我获得“成功”并且我的数据库执行了我在使用给定变量运行过程时所期望的):

$sql = "MyDB.dbo.myProcedure {$var1}, {$var2}, {$var3}";
$result = sqlsrv_query($myConn, $sql);
if (!$result) {
    echo 'Your code is fail.';
}
else {
    echo 'Success!';
}

我想通过使用参数创建 SQL 字符串来避免(或减少 SQL 注入(inject)的可能性)。例如:

$sql = "select * from aTable where col1 = ? AND col2 = ?";
$result = sqlsrv_query($myConn, $sql, array($var1, $var2));
//please note. This code WILL work!

但是当我使用存储过程执行此操作时,它失败了。它失败了,没有通过 sqlsrv_errors() 报告错误,没有在数据库中采取任何行动,并且 $result === false

需要明确的是,以下操作失败了:

$sql = "MyDB.dbo.myProcedure ?, ?, ?";
$result = sqlsrv_query($myConn, $sql, array($var1, $var2, $var3));

同样,以相同方式创建的准备/执行语句也会失败:

$sql = "MyDB.dbo.myProcedure ?, ?, ?";
$stmt = sqlsrv_prepare($myConn, $sql, array(&$var1, &$var2, &$var3));
foreach($someArray as $key => $var3) {
    if(sqlsrv_execute($stmt) === false) {
        echo 'mucho fail.';
    }
}
//this code also fails.

为了完整起见,我已经确认所讨论的存储过程直接在 SQL Management Studio 中工作,并且如果按照我上面提到的方式调用的话。同样,我已经确认我可以对任何原始查询(例如插入、选择、更新与存储过程)使用参数化查询。

所以,我的问题是如何使用参数化查询调用存储过程,而不是将变量嵌入到查询字符串中?

更重要的是,我实际上想使用准备/执行,所以希望答案也能让它工作。

最佳答案

php.net 上的用户贡献有一篇关于如何使用 sqlsrv-prepare 执行存储过程的文章。

如果将来从 php.net 用户贡献中删除,这里是它列出的内容:

$procedure_params = array(
array(&$myparams['Item_ID'], SQLSRV_PARAM_OUT),
array(&$myparams['Item_Name'], SQLSRV_PARAM_OUT)
);
// EXEC the procedure, {call stp_Create_Item (@Item_ID = ?, @Item_Name = ?)} seems to fail with various errors in my experiments
$sql = "EXEC stp_Create_Item @Item_ID = ?, @Item_Name = ?";
$stmt = sqlsrv_prepare($conn, $sql, $procedure_params);

这是手册页,http://php.net/manual/en/function.sqlsrv-prepare.php

关于php - 如何使用sqlsrv和 "?"样式参数在php中执行存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31575135/

相关文章:

php - 使用 fpdf 从数组输出项目符号列表

mysql - 使用 MySQL,我想从另一个表更新 1 个表 id 值并使用 ma

sql - 基于sql中的空/非空参数构建where子句

sql - oracle在选择内部调用存储过程

php - 从 API 获取数据并保存到 Postgresql 数据库中

PHP $_SERVER [‘SERVER_ADDR’ ] 变量总是返回 127.0.0.1

php - 使用 PHP_XLSXWriter 设置列宽

java - 如何仅针对用户输入的值更新数据库?

mysql - SQL语句是否立即执行?

返回更新记录的 SQL Server 存储过程