首页 文章

PHP - MSSQL从存储过程中获取结果

提问于
浏览
2

我是一名老学校开发人员,刚进入WWW编程世界 . 我正在为我正在使用的公司开发一个带有HTML,CSS,PHP和MSSQL Server 2008 R2的应用程序 .

在我的应用程序中,我使用存储过程从/向数据库插入,修改,删除或查询信息 . 根本不使用TSQL指令,只是从PHP代码执行存储过程 .

我正在使用PHP 5和SQLSRV驱动程序进行数据库交互 .

到目前为止一切正常,但现在我被卡在插件上...如果一切正常,SP会插入记录,如果没有,它不会......但是我没有看到结果,直到我再次查询表只是为了查看记录是否存在 .

我在PHP中使用以下代码来运行在表中插入记录的SP:

function spinserta($tabla, $columnas, $valores, $cnct) {

   $stmt = 'Exec spinsert @tabla=?,@columnas=?,@valores=?';         
   $params = array($tabla,$columnas,$valores);

   $result = sqlsrv_query($cnct,$stmt,$params) ;

   return $result;
}

如果事务不成功,我不会在$ result变量中获取任何内容,并希望从SP获得结果消息,以便向用户显示错误消息 .

如何从SP获得结果消息(如果是错误则无关紧要)?

提前致谢!

2 回答

  • 0

    经过几个小时的研究......终于得到了这个概念!事情就是这样:最初的PHP代码是:

    function spinserta($tabla, $columnas, $valores, $cnct) {
       $stmt = 'Exec spinsert @tabla=?,@columnas=?,@valores=?';         
       $params = array($tabla,$columnas,$valores);
    
       $result = sqlsrv_query($cnct,$stmt,$params) ;
    
       return $result;
    }
    

    最初的SP是:

    ALTER PROCEDURE [dbo].[spinsert] 
        @tabla varchar(50),
        @columnas varchar(8000),
        @valores varchar(8000)
    AS
    BEGIN
        SET NOCOUNT ON;
        declare @orden varchar(8000)
        declare @return_value int
    
        set @orden='Insert into ' + @tabla + ' (' + @columnas + ') values (' + @valores + ')';
        execute (@orden);
    
        return 
    END
    

    非常直接......当执行php代码并且SP成功时,变量$ result加载了“Resource id#14”,如果SP失败,$ result值为null .

    事情进展顺利!但不是我想要的方式 . 然后我发现这篇文章:http://msdn.microsoft.com/en-us/library/ms178592.aspx

    基于此我修改了SP:

    ALTER PROCEDURE [dbo].[spinsert] 
        @tabla varchar(50),
        @columnas varchar(8000),
        @valores varchar(8000)
    AS
    BEGIN
        SET NOCOUNT ON;
        declare @orden varchar(8000)
        declare @return_value int
    
        begin try
            set @orden='Insert into ' + @tabla + ' (' + @columnas + ') values (' + @valores + ')';
            set @return_value=0;
            execute (@orden);
        end try
    
        begin catch
            DECLARE @ErrorMessage NVARCHAR(4000);
            DECLARE @ErrorSeverity INT;
            DECLARE @ErrorState INT;
    
            SELECT @return_value = ERROR_NUMBER()
            SELECT 
                @ErrorMessage = ERROR_MESSAGE(),
                @ErrorSeverity = ERROR_SEVERITY(),
                @ErrorState = ERROR_STATE();
    
            RAISERROR (@ErrorMessage, -- Message text.
                       @ErrorSeverity, -- Severity.
                       @ErrorState -- State.
                       );
        end catch
    
        return @return_value
    
    END
    

    和PHP代码:

    function spinserta($tabla,$columnas,$valores,$cnct) {
        $tsql = 'Exec spinsert @tabla=?,@columnas=?,@valores=?';            
        $params = array($tabla,$columnas,$valores);
    
        $stmt = sqlsrv_query($cnct,$tsql,$params) ; 
        $errors=sqlsrv_errors();
    
        if ($stmt === false or $stmt===0) {
            foreach( $errors as $error ) {
                $stmt=str_replace("'","","Error: ". $error['code']. " - " . $error['message']);
                }
        } else {
            $stmt="1";
        }       
    
        return $stmt;
    }
    

    我的原始方法有两个问题,1在数据库引擎端,即使语句失败,SP也没有真正产生系统错误 . 使用Try-Catch技术,采用RAISEERROR概念,SP最终在状态失败时产生系统错误 . 在此之后,只需对PHP代码进行微调即可 .

    通过这种方法,发送到数据库的信息的验证在数据库引擎端完成,无需编写大量代码,只是为了在提交时验证表单中的字段 . 所需要的是确保数据库表,关系,约束,完整性和其他应用得到很好的应用,并且数据库将保护自己免受不正确的数据的影响 . 如果提交表单中提供的信息错误,数据库将拒绝它们,代码将向用户显示正确的错误 .

    我想看看类似的东西是否与MySQL相似......我想是的!

    非常感谢Maximus2012!干杯!!!

  • 1

    这是我的一个应用程序中的一些代码 . 看看它是否有帮助:

    //Query SQL
    $tsql = "Exec spinsert @tabla=?,@columnas=?,@valores=?"; 
    $params = array($tabla,$columnas,$valores);
    
    //Execute the stored query 
    $stmt = sqlsrv_query($conn, $tsql, $params);
    if ($stmt === false)
    {
        echo "<h3>Error in query preparation or execution.</h3>";
        ListErrors();
        die;
    }
    else {
        echo "Insert Successful";
    }
    
    // this should help for the non-insert/update case
    $arr = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
    var_dump($arr);
    

相关问题