带有命名参数的php sqlsrv_查询存储过程

带有命名参数的php sqlsrv_查询存储过程,php,sql-server,stored-procedures,parameters,Php,Sql Server,Stored Procedures,Parameters,我使用PHP5.4和sqlsrv扩展,并尝试调用此示例存储过程(NorthWind数据库): 我使用这个sqlsrv_查询语法: $sql = "{ call dbo.GetCategories (?)}"; $catID=2; $params = array($catID); $stmt = sqlsrv_query( $conn, $sql,$params); 我想在$params中指定参数名称和值,如下所示: $sql = "dbo.GetCategories"; $catID=2; $

我使用PHP5.4和sqlsrv扩展,并尝试调用此示例存储过程(NorthWind数据库):

我使用这个sqlsrv_查询语法:

$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);
$dbh=newpdo('sqlsrv:server=…');
$sql=“{调用dbo.GetCategories(@CategoryID=:CategoryID)}”;
$stmt=$dbh->prepare($sql);
$stmt->bindParam('CategoryID',$catID,PDO::PARAM_INT);
$stmt->execute();
$results=array();
做{
$results[]=$stmt->fetchAll();
}而($stmt->nextRowset());
回声';
echo($results[0][0]['CategoryID'].','。
$results[0][0]['CategoryName'].','。
$results[0][0][Description']);
回声';
$stmt->closeCursor();
未结算(stmt);

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

$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);