PHP 通过 SQL Server Stored Procedure 调用获取空输出



我正在尝试在MS SQL Server上调用存储过程,但是我得到一个空的结果。存储过程将用户 id 作为输入参数,并输出用户的名称、地址、城市、州和邮政编码。

下面是 SQL Server Management Studio 上存储过程的执行查询:

USE [MYDB]
GO
DECLARE @return_value int,
@Name char(60),
@Address char(60),
@City char(30),
@State char(3),
@Zip char(10)
EXEC    @return_value = [dbo].[spAddressByUserID]
@UserID = N'AB1234',
@Name = @Name OUTPUT,
@Address = @Addr1 OUTPUT,
@City = @City OUTPUT,
@State = @State OUTPUT,
@Zip = @Zip OUTPUT
SELECT  @Name as N'@Name',
@Address as N'@Address',
@City as N'@City',
@State as N'@State',
@Zip as N'@Zip'
SELECT  'Return Value' = @return_value
GO

到目前为止,我已经尝试了以下代码:

<?php
$conn = sqlsrv_connect( $host, $connectionInfo);
$user_id = 'AB1234';
$myparams['UserID'] = $user_id;
$procedure_params = array(
array(&$myparams['UserID'], SQLSRV_PARAM_IN),
array(&$myparams['Name'], SQLSRV_PARAM_IN),
array(&$myparams['Address'], SQLSRV_PARAM_IN),
array(&$myparams['City'], SQLSRV_PARAM_IN),
array(&$myparams['State'], SQLSRV_PARAM_IN),
array(&$myparams['Zip'], SQLSRV_PARAM_IN)
);
$sql = "EXEC spAddressByUserID @UserID = ?, @Name = '', @Address = '', @City = '', @State = '', @Zip = ''";
$stmt = sqlsrv_prepare($conn, $sql, $procedure_params);
if( !$stmt ) {
die( print_r( sqlsrv_errors(), true));
}
if(sqlsrv_execute($stmt)){
while($res = sqlsrv_next_result($stmt)){
print_r($res); // Gives Empty Output
}
}
else{
die( print_r( sqlsrv_errors(), true));
}

我认为我所有的语法都是正确的。但是我得到空输出。不知道我做错了什么。

编辑:

我像这样修改了查询的数组参数,但没有成功:

$procedure_params = array(
array(&$myparams['UserID'], SQLSRV_PARAM_IN, 'SQLSRV_PHPTYPE_STRING'),
array(&$myparams['Name'], SQLSRV_PARAM_OUT, 'SQLSRV_PHPTYPE_STRING'),
array(&$myparams['Address'], SQLSRV_PARAM_OUT, 'SQLSRV_PHPTYPE_STRING'),
array(&$myparams['City'], SQLSRV_PARAM_OUT, 'SQLSRV_PHPTYPE_STRING'),
array(&$myparams['State'], SQLSRV_PARAM_OUT, 'SQLSRV_PHPTYPE_STRING'),
array(&$myparams['Zip'], SQLSRV_PARAM_OUT, 'SQLSRV_PHPTYPE_STRING')
);

是否能够在 SQL 管理工作室中成功运行进程?看起来你在 PHP 中的 SQL 中缺少一些占位符。查询中只有一个?。也许这样更好?

$sql = "EXEC spAddressByUserID @UserID = ?, @Name = '?', @Address = '?', @City = '?', @State = '?', @Zip = '?'";

我对这种类型的存储过程不是很熟悉,但是对于预准备语句中的参数化占位符,您需要以正确的顺序指定所有占位符。从您发布的内容来看,在我看来,您没有在需要去的所有位置添加占位符,也许这就是您没有取回输出的原因?

最新更新