【问题标题】:Exec SQL Server stored procedure from PHP从 PHP 执行 SQL Server 存储过程
【发布时间】:2019-10-03 01:08:40
【问题描述】:

我尝试从 PHP 调用 SQL Server 存储过程。

这是我的存储过程:

CREATE procedure [dbo].[tester]
    @id NVARCHAR(MAX)
AS
BEGIN
    DECLARE @tab TABLE (myxml XML)

    INSERT INTO @tab(myxml)
        SELECT map 
        FROM forms 
        WHERE mapid = @id

    SELECT * FROM @tab
END

还有我的 PHP 脚本:

<?php
$serverName = "servername";
$connectionInfo = array("UID" => "sa","PWD" => "mypass","Database" =>  "database");  
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if ($conn) {
    $tsql = "exec tester 'FORMgRGVL7bfpEnpBpg7vz2sHoKAs5zxU5LW'";
    $result = sqlsrv_query($conn, $tsql);

    if ($result === false) {
        die( print_r( sqlsrv_errors(), true) );
        $response=array('response'=>'notok','data'=>'loyo');
        $serverresponse=JSON_encode($response);
    } else {
        $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_NUMERIC);
        $response=array('response'=>'ok','data'=>$row[0]);
        $serverresponse=JSON_encode($response);
    }

    sqlsrv_free_stmt($stmt);
} else {
    $response=array('response'=>'notok','flag'=>$flag,'data'=>'cc');        
    $serverresponse = $serverresponse=JSON_encode($response);
}

echo ($serverresponse);
?>

当我从 SSMS 执行存储过程时,它按预期返回值,但是当我从 PHP 执行它时,它返回 null。

【问题讨论】:

标签: php sql-server stored-procedures sqlsrv


【解决方案1】:

说明:

您需要将SET NOCOUNT ON 作为存储过程的第一行,以防止将受T-SQL 语句影响的行数作为结果集的一部分返回。这就是您的NULL 结果的原因。

请注意,始终使用准备好的语句和参数化查询来防止 SQL 注入。使用 PHP Driver for SQL Server,函数sqlsrv_query() 既可以进行语句准备,也可以执行语句,并且可以用于执行参数化查询。

示例:

您的脚本中有错误,在示例中已修复:

  • sqlsrv_free_stmt($stmt) 更改为 sqlsrv_free_stmt($result)
  • 变量$flag 未定义
  • $serverresponse = $serverresponse=JSON_encode($response) 更改为 $serverresponse = json_encode($response)

T-SQL:

CREATE procedure [dbo].[tester]
   @id nvarchar(max)
as
begin
   SET NOCOUNT ON

   declare @tab table (myxml xml)

   insert into @tab(myxml)
   select map from forms where mapid=@id

   select * from @tab
end

PHP:

<?php

$flag = "";    
$serverName = "servername";
$connectionInfo = array("UID" => "sa", "PWD" => "mypass", "Database" => "database"); 

$conn = sqlsrv_connect( $serverName, $connectionInfo);
if ($conn) {
    $tsql = "exec tester ?";
    $params = array('FORMgRGVL7bfpEnpBpg7vz2sHoKAs5zxU5LW');
    $result = sqlsrv_query($conn, $tsql, $params);
    if ($result === false) {
        die( print_r( sqlsrv_errors(), true) );
        $response = array('response'=>'notok', 'data'=>'loyo');
        $serverresponse = json_encode($response);
    } else {
        $row = sqlsrv_fetch_array( $result, SQLSRV_FETCH_NUMERIC);
        $response = array('response'=>'ok', 'data'=>$row[0]);
        $serverresponse = json_encode($response);
    }
    sqlsrv_free_stmt($result);
} else {
    $response = array('response'=>'notok', 'flag'=>$flag, 'data'=>'cc');        
    $serverresponse = json_encode($response);
}

echo ($serverresponse);

?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2019-02-05
    • 2015-08-28
    • 2019-04-03
    • 2015-06-18
    • 2010-10-29
    • 2010-12-11
    相关资源
    最近更新 更多