2012-09-27 29 views
0

中成功執行我正在php中執行兩個不同的mysql查詢,
但我還需要檢查它們是否都成功。如果其中一個失敗,我需要拋出錯誤回憶所做的更改。檢查是否有多個查詢在mysql_ *

有沒有簡單的方法來做到這一點?

PS:一種是update,另一種是insert

編輯目前我有兩個疑問:

INSERT INTO table1 (warning) VALUES (0) WHERE con_id = 1 
UPDATE table2 SET no_alerts = 1 WHERE con_id = 1 

我使用的基本mysql_插入和更新,沒有PDO。

+1

顯示您目前擁有的代碼..以獲得最佳建議。 – BugFinder

+1

在感謝信息中停止編輯。我刪除它的原因。 – PeeHaa

回答

2

有沒有簡單的方法來做到這一點?

Transactions是你在找什麼。

我正在使用普通插入和更新,沒有PDO。

沒有「plain inserts/updates」這樣的東西。如果你正在談論使用古代mysql_*功能,請停止使用它們。他們不再維護,社區已開始deprecation process。請參閱red box?相反,您應該瞭解prepared statements並使用PDOMySQLi。如果你不能決定,this article將有助於選擇。如果你在意學習,here is a good PDO tutorial

如果您使用的是PDO/mysqli,則可以在事務中進行查詢。這樣,您可以輕鬆地回滾更改而不是提交更改。

UPDATE

如果你擔心舊系統(儘管PDO是5.1.0+和mysqli的是5+)有一些東西,你可以做,但它是一個破解受制於人對錯誤和事情可能會搞砸。您可以存儲查詢的最後一個插入ID,如果更新查詢失敗,您可以手動刪除插入的行,但是如前所述,這在併發系統上很容易出錯。

查詢失敗的原因是什麼?也許有更好的做事方式?

+0

所以基本上,它不能用'mysql_ *'函數完成? – Peon

+0

不可以。正如我所說,你不應該使用它們。 – PeeHaa

+0

好吧,有人也必須維護一些舊系統;) – Peon

0

我猜你正在尋找這樣的事情

$result1 = mysql_query('INSERT INTO table1 (warning) VALUES (0) WHERE con_id = 1'); 
$result2 = mysql_query('UPDATE table2 SET no_alerts = 1 WHERE con_id = 1'); 

if(!$result1 || !$result2) { 
    echo 'error'; 
} 

您應該使用PDO ...的mysql_query已被棄用。

+0

更新了問題。 – Peon

+0

@DainisAbols更新了答案。 – Erik

+0

但是在這種情況下,如果更新成功但插入失敗,我該如何自動回滾更新? – Peon

0
echo($resultQuery1 && $resultQuery2) ? 'No error' : 'Error'; 
0

我覺得有兩種方法。首先,如果有可能無法插入或更新,我會首先檢查表格的狀況,看看是否可能。如果您需要進行原子操作,則可以在此過程中鎖定表,以確保其他進程不會在檢查表和執行更新之間更改表。如果你需要高水平的併發性,這可能會減慢速度。或者,如果您使用事務引擎(InnoDB具有事務處理能力,MyISAM沒有),您可以啓動一個事務,然後監視更新和插入的返回值。

START TRANSACTION 

..然後檢查您的操作結果。從PHP文檔:

對於SELECT,SHOW,描述,解釋等語句返回的結果集 ,請求mysql_query()成功返回的資源,或 錯誤FALSE。

對於其他類型的SQL語句,INSERT,UPDATE,DELETE,DROP等, mysql_query()在成功時返回TRUE或在錯誤時返回FALSE。

返回的結果資源應該傳遞給mysql_fetch_array(), 和其他函數來處理結果表,來訪問 返回的數據。

使用mysql_num_rows()來找出有多少行被返回的 SELECT語句或mysql_affected_rows()函數來找出有多少行 受到影響由DELETE,INSERT,REPLACE或UPDATE語句。

如果不能成功,你可以回滾所做的更改:

ROLLBACK 

最後,不知道更多關於你的應用程序,我不能肯定,但你可以設計數據集和應用程序,這樣你就不會在這種情況下更快地出現這種情況。事務和鎖定表都很慢,所以我會避免它們,除非有必要。