2013-10-11 60 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語句?