多个记录集/列从MSSQL存储过程回显到PHP
我试图用PHP运行一个MSSQL存储过程,然后获取结果并将其返回到页面。结果输出为两个具有一组列的不同记录集。看 我修改了一些变量名和输出以保护一些敏感信息,但下面的SQL代码正是我在MSSQL Server Management Studio中运行的代码,它返回了上面链接的输出屏幕截图 我还通过PHP尝试了以下操作,但没有返回任何结果:多个记录集/列从MSSQL存储过程回显到PHP,php,sql-server,stored-procedures,Php,Sql Server,Stored Procedures,我试图用PHP运行一个MSSQL存储过程,然后获取结果并将其返回到页面。结果输出为两个具有一组列的不同记录集。看 我修改了一些变量名和输出以保护一些敏感信息,但下面的SQL代码正是我在MSSQL Server Management Studio中运行的代码,它返回了上面链接的输出屏幕截图 我还通过PHP尝试了以下操作,但没有返回任何结果: if (!@mssql_connect($host,$username,$password)) { $error = $db_connect_erro
if (!@mssql_connect($host,$username,$password)) {
$error = $db_connect_error;
echo $error;
}
@mssql_select_db($dbname);
$stmt=mssql_init("[dbo].[stored_procedure_name]");
mssql_bind($stmt, "@StartTime", $start_last, SQLVARCHAR, FALSE);
mssql_bind($stmt, "@EndTime", $end_last, SQLVARCHAR, FALSE);
mssql_bind...continued for all variables
$result = mssql_execute($stmt);
$arr = mssql_fetch_row($result);
print_r($arr);
我已经尝试了通过谷歌搜索找到的其他几种不同的方法来获取数据,以便在PHP中回传或保存到数组中,但我所尝试的方法都不起作用
MSSQL语句在MSSQL Server Management Studio中运行时不会出现问题,这是我找到存储过程并从MSSQL SMS运行它时的默认格式:
DECLARE @RC int
DECLARE @StartTime datetime
DECLARE @EndTime datetime
DECLARE @a varchar(4000)
DECLARE @b varchar(4000)
DECLARE @c varchar(50)
DECLARE @d varchar(50)
DECLARE @e varchar(50)
DECLARE @f varchar(50)
DECLARE @g int
DECLARE @h int
DECLARE @i int
DECLARE @j int
DECLARE @k int
DECLARE @l int
DECLARE @m int
DECLARE @n int
DECLARE @o int
DECLARE @p int
DECLARE @q int
DECLARE @r varchar(100)
DECLARE @s int
DECLARE @t float
DECLARE @u float
DECLARE @v float
DECLARE @w int
-- TODO: Set parameter values here.
SET @StartTime = '2017-02-01 07:30'
SET @EndTime = '2017-02-01 19:30'
SET @a = 'string'
SET @b = 'string'
SET @c = 'string'
SET @d = 'string'
SET @e = 'string'
SET @f = 'string'
SET @g = 105
SET @h = 108
SET @i = 101
SET @j = 147
SET @k = 124
SET @l = 141
SET @m = 103
SET @n = 186
SET @o = 185
SET @p = 113
SET @q = 182
SET @r = 'string'
SET @s = 77
SET @t = 101.5
SET @u = 1000
SET @v = 25.4
SET @w = 1
EXECUTE @RC = [dbo].[spLocal_RptCvtgLinestatus]
@StartTime
,@EndTime
,@a
,@b
,@c
,@d
,@e
,@f
,@g
,@h
,@i
,@j
,@k
,@l
,@m
,@n
,@o
,@p
,@q
,@r
,@s
,@t
,@u
,@v
,@w
首先,正如我的评论所提到的,您应该考虑更新到
mysqli.*
或PDO
对于当前设置,您缺少看起来像的连接
$connection = mssql_connect($servername, $username, $password);
//Select a db
mssql_select_db('your_db_name', $connection);
//Use the connection. I do not think you need to fully qualify the sproc name.
$stmt = mssql_init('stored_procedure_name', $connection);
此外,在执行mssql_fetch_row时,它只返回一行,因此您需要循环它:
$data = array();
while ($row = mssql_fetch_row($result)){
$data[] = $row;
}
print_r($data);
首先,正如我的评论所提到的,您应该考虑更新到
mysqli.*
或PDO
对于当前设置,您缺少看起来像的连接
$connection = mssql_connect($servername, $username, $password);
//Select a db
mssql_select_db('your_db_name', $connection);
//Use the connection. I do not think you need to fully qualify the sproc name.
$stmt = mssql_init('stored_procedure_name', $connection);
此外,在执行mssql_fetch_row时,它只返回一行,因此您需要循环它:
$data = array();
while ($row = mssql_fetch_row($result)){
$data[] = $row;
}
print_r($data);
要循环浏览多个记录集,您可以尝试以下操作
$sql = "EXEC spr_MyStoredProcedure @param1 = 6, @param2 = 5;";
$conn = sqlsrv_connect( $hostname, array( "Database"=>$database, "UID"=>$username, "PWD"=>$password ));
if( !$conn) {
die( print_r( sqlsrv_errors(), true));
}
$result = sqlsrv_query($conn, $sql, null);
if($result ) {
while( $obj = sqlsrv_fetch_object($result)){ // check the first recordset
print_r($obj);
}
while( sqlsrv_next_result($result)){ // if there are any more recordsets
while( $obj = sqlsrv_fetch_object($result)){ // loop them too
print_r($obj);
}
}
}
sqlsrv_free_stmt( $result );
sqlsrv_close( $conn );
这尚未在生产环境中进行测试,因此您的里程数可能会有所不同。要循环浏览多个记录集,您可以尝试以下方法
$sql = "EXEC spr_MyStoredProcedure @param1 = 6, @param2 = 5;";
$conn = sqlsrv_connect( $hostname, array( "Database"=>$database, "UID"=>$username, "PWD"=>$password ));
if( !$conn) {
die( print_r( sqlsrv_errors(), true));
}
$result = sqlsrv_query($conn, $sql, null);
if($result ) {
while( $obj = sqlsrv_fetch_object($result)){ // check the first recordset
print_r($obj);
}
while( sqlsrv_next_result($result)){ // if there are any more recordsets
while( $obj = sqlsrv_fetch_object($result)){ // loop them too
print_r($obj);
}
}
}
sqlsrv_free_stmt( $result );
sqlsrv_close( $conn );
这尚未在生产环境中进行测试,因此您的里程可能会有所不同。您的连接在哪里?此外,您还应该考虑更新<代码> MySqLI**<代码>或<代码> PDO< /代码>。OOP,我没有添加连接信息,我把它添加到了原始PHP上面的其他PHP代码。您的连接在哪里?此外,您还应该考虑更新<代码> MySqLI**<代码>或<代码> PDO/COD>。OOP,我没有添加连接信息,我把它添加到了原始PHP上面的另一个PHP代码。非常感谢。是的,出于不同的原因,我不认为更新是一个可行的选择,但我想补充一点,为了避免一些空错误,我必须添加:mssql_query('set ANSI_NULL_DFLT_ON',$connection);啊,成功了!非常感谢。是的,出于不同的原因,我不认为更新是一个可行的选择,但我想补充一点,为了避免一些空错误,我必须添加:mssql_query('set ANSI_NULL_DFLT_ON',$connection);