2013-10-11 41 views
1

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

用这个来执行错误处理的最好方法是什么?

基本上,我只想执行它们的串行,所以如果第一个失败,那么不要继续,基本上把一个错误回到客户端。

我已经当前存储他们的变量,比如

$sql_1 = "insert into ..." 

$sql_2 = "insert into ..." 

然后我用这是否在做变量的调用语句,但它只是似乎很凌乱。

回答

1

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

CREATE PROCEDURE MyProcedure 

BEGIN TRY 
BEGIN TRANSACTION 
Insert .... 

delete.... 
COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
ROLLBACK TRANSACTION 
SELECT 'Transaction failed' 
END CATCH 
+0

很好的点... ...是的,我将使用存储过程的,但是早期的发展过程中,我做了一些硬编码的SQL(EWWW)只是为了让我离开地面,然后打开进入SP的。我会毫不犹豫地走下去,我想我可以按照建议回退SP中的交易 – realtek

+0

可能有一些工作需要一次性传递所有插入所需的所有数据。 –

+0

的确如此,但是没有关于他会传递多少或什么样的字段的信息,所以我把它留给了@ hidden_​​4003 – Hedinn

0

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

我用下面的方法,查询只是mssql_query +一些额外的逻辑与ERROR_MESSAGE()的包装,以获得更多的信息性错误消息。

你可能想使用PDO,我得到这个从旧的项目,适用于2008年MSSQL

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); 
} 
+0

真的吗?你有一个例子吗?那将是我需要的!谢谢 – realtek

0

也许你可以使用一个exit ([ string $status ]);这会阻止你的脚本直线距离,你可以显示一个错误或将标题位置更改为错误页面。 http://php.net/manual/en/function.exit.php

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