带有命名参数的php sqlsrv_query存储过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有命名参数的php sqlsrv_query存储过程相关的知识,希望对你有一定的参考价值。

我使用php 5.4与sqlsrv扩展,我试图调用此示例存储过程(NorthWind数据库):

create  PROCEDURE [dbo].[GetCategories] 
@CategoryID int = null
AS
SELECT * from dbo.Categories where CategoryID= IsNull(@CategoryID,CategoryID)

我正在使用这个sqlsrv_query语法:

$sql = "{ call dbo.GetCategories (?)}";
$catID=2;
$params = array($catID);
$stmt = sqlsrv_query( $conn, $sql,$params);

我想在$ params中指定参数名称和值,就像这样:

$sql = "dbo.GetCategories";
$catID=2;
$params = array("@CategoryID"=>$catID);
$stmt = sqlsrv_query( $conn, $sql,$params);

它返回此错误:参数数组中不允许使用字符串键。

我怎么解决这个问题?谢谢

答案

我发现这个解决方案使用PDO:

$dbh = new PDO('sqlsrv:server= ...');
$sql = "{CALL dbo.GetCategories (@CategoryID=:CategoryID)}";
$stmt = $dbh ->prepare($sql);

$stmt->bindParam('CategoryID', $catID, PDO::PARAM_INT);

$stmt->execute();

$results = array();
do {
    $results []= $stmt->fetchAll();
} while ($stmt->nextRowset());

echo '<pre>';


echo($results[0][0]['CategoryID'] . ', '.
         $results[0][0]['CategoryName'] . ', '.
         $results[0][0]['Description']);
echo '</pre>';

$stmt->closeCursor();
unset($stmt);
另一答案

您不能使用关联数组将值绑定到SQL参数。数组中的元素必须与参数的顺序相同。

以上是关于带有命名参数的php sqlsrv_query存储过程的主要内容,如果未能解决你的问题,请参考以下文章

使用 NHibernate 作为带有输入参数的命名查询调用存储过程

如何使用 JDBC 调用带有命名参数的 Sybase 存储过程

sqlsrv_query 不返回行,长查询没有错误

PHP mysqli为带有out参数的存储过程准备语句

php调用oracle带有out参数的存储过程

MybatisMyBatis调用带有返回结果output参数的存储过程上与ibatis的区别