【问题标题】:PHP & SQL Server Error Handling?PHP & SQL Server 错误处理?
【发布时间】:2013-10-19 12:02:53
【问题描述】:

我有一个 PHP 页面,它在 SQL Server 数据库中执行并插入 3 个不同的查询。

对此执行错误处理的最佳方法是什么?

基本上,我只想按顺序执行它们,所以如果第一个失败,则不要继续,基本上将错误返回给客户端。

我目前已将它们存储在变量中,例如

$sql_1 = "insert into ..."

$sql_2 = "insert into ..."

然后我使用了 if 语句来调用变量,但它看起来很乱。

【问题讨论】:

    标签: javascript php mysql ajax


    【解决方案1】:

    我建议您在存储过程中执行所有查询,然后从您的 PHP 页面调用该存储过程,如果出现故障,存储过程可以返回错误。 一个非常基本的存储过程示例

    CREATE PROCEDURE MyProcedure
    
    BEGIN TRY
    BEGIN TRANSACTION
     Insert ....
    
     delete....
    COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
    ROLLBACK TRANSACTION
    SELECT 'Transaction failed'
    END CATCH
    

    【讨论】:

    • 非常好的点...是的,我将使用存储过程,但在早期开发过程中,我正在做一些硬编码的 SQL (ewww),只是为了让我离开地面,然后变成 SP。我会坚定地走这条路,我想我可以按照建议回滚 SP 中的事务
    • 可能需要一次性传递所有插入所需的所有数据。
    • 是的,但没有关于他将传递多少或什么样的字段的信息,所以我把它省略了@hidden_​​4003
    【解决方案2】:

    您可以使用exit ([ string $status ] );,这会立即停止您的脚本,您可以显示错误或将标题位置更改为错误页面。 http://php.net/manual/en/function.exit.php

    其他明智的使用一系列 if 语句?

    【讨论】:

      【解决方案3】:

      Php 具有用于有效错误处理的 Try 和 Catch 语法。以下链接可能很有趣。

      PHP Try and Catch for SQL Insert

      http://php.net/manual/en/language.exceptions.php

      【讨论】:

        【解决方案4】:

        为什么不简单地使用事务呢?如果任何查询失败,您将执行回滚并将错误发布到客户端。

        我使用以下内容,查询只是 mssql_query 的包装 + 一些带有 ERROR_MESSAGE() 的附加逻辑,以获得更多信息性错误消息。

        您可能想要使用 PDO,我从一个旧项目中得到这个,适用于 MSSQL 2008。

        function StartTransaction() {
            $sql = "SET TRANSACTION ISOLATION LEVEL REPEATABLE READ";       
            $res = $this->Query($sql);
        
            $sql = "set implicit_transactions on;";
            $res = $this->Query($sql);
        
        }
        function RollbackTransaction() {
            $sql = "IF @@TRANCOUNT > 0 ROLLBACK TRAN";
            $res = $this->Query($sql);
        
            $sql = "set implicit_transactions off;";
            $res = $this->Query($sql);
        
            $sql = "SET TRANSACTION ISOLATION LEVEL READ COMMITTED";       
            $res = $this->Query($sql);
        }
        function CommitTransaction() {
            $sql = "IF @@TRANCOUNT > 0 COMMIT TRAN";
            $res = $this->Query($sql);
        
            $sql = "set implicit_transactions off;";
            $res = $this->Query($sql);
        
            $sql = "SET TRANSACTION ISOLATION LEVEL READ COMMITTED";       
            $res = $this->Query($sql);
        }
        

        【讨论】:

        • 真的吗?你有一个例子吗?那正是我所需要的!谢谢
        猜你喜欢
        • 2015-06-28
        • 1970-01-01
        • 2016-04-11
        • 1970-01-01
        • 1970-01-01
        • 2010-09-10
        • 1970-01-01
        • 2014-05-08
        • 2019-12-27
        相关资源
        最近更新 更多