2010-04-19 31 views
2

之前是可能的所以我想進行一次一對夫婦的刀片是一種互相依賴對方。假設我正在做一個狗評級網站。任何人都可以在我的數據庫中添加一條狗,但是這樣做時他們還需要添加狗的初步評級。其他人隨後可以評價狗。評級的狗是多對一的關係:狗有很多評級。Codeigniter/mySQL問題。檢查是否鑲幾個實際的插入

這意味着我的初步加,因爲我這個人既速率,並添加狗,我需要的等級,並設置一個外鍵,狗的主鍵。據我所知,這意味着我必須添加狗,然後檢查新添加的主鍵是什麼,然後在插入之前將其放入我的評分中。

現在假設出了什麼出差錯等級的插入,無論是我已經在某種程度上忽略了一個字符串太長,或什麼的。如果評分失敗,狗已經插入,但評分沒有。在這種情況下,我希望這隻狗不會首先被加入。

這是否意味着我必須編寫代碼,說明「如果評級失敗,爲狗做一個刪除」,或者有什麼方法可以預測狗的關鍵應該如何按計劃進行。有沒有辦法說「保持那個位置」,然後如果一切正常,添加它?

任何幫助將不勝感激。謝謝!!

回答

6

笨簡化了使用交易這一過程。

http://codeigniter.com/user_guide/database/transactions.html

注:

在MySQL中,你需要運行 的InnoDB或BDB表類型,而不是 更常見的MyISAM。

$this->db->trans_start(); 
$this->db->query('INSERT YOUR DOG'); 
$this->db->query('INSERT YOUR RATING'); 
$this->db->trans_complete(); 

if ($this->db->trans_status() === FALSE) 
{ 
    // Something went wrong, but nothing was committed to the database so you can handle the error here 
} 
else { 
    // Everything was added fine 
} 
+0

只有當他具有正確的表類型(innoDb ...等)時纔有效。 – SeanJA 2010-04-19 22:24:25

+0

編輯答案使這一點清晰。 – Finbarr 2010-04-19 22:33:24

+1

所以問題:如果我要這樣做,我不能使用我的模型嗎?我在一對不同的表上運行插入,但都在同一個數據庫中。我可以做一些像 $ dog_db = $ this-> load-> database('dog',true); $ dog_db-> trans_start();如果(!$ this-> dogs-> insert($ dog)) $ dog_db-> trans_rollback(); else $ dog_db-> trans_commit(); – Ethan 2010-04-19 23:08:18

3

歡迎land of transactions!我相信你會喜歡你的逗留,因爲交易是專門爲這個問題而發明的。 :)

基本上,事件發生的順序將是這個樣子到MySQL:現在

START TRANSACTION; 
INSERT INTO dogs ...; 
INSERT INTO dog_ratings...; 
COMMIT; 

,在你的代碼,你可以做各種東西,在這些查詢之間,並且在結束交易任何時候使用SQL查詢ROLLBACK。當你這樣做時,作爲事務一部分的查詢都不會被存儲到數據庫中。你必須讓它笨具體,但基本上它會是這個樣子:

$db->query("START TRANSACTION"); 
try { 
    $db->query("INSERT INTO dogs..."); 
    //did that work? Sweet. Run the next one. You can fetch the insert id 
    //here too, if you want to use it in the next query. 
    $db->query("INSERT INTO dog_ratings..."); 
    $db->query("COMMIT"); 
} 
catch (DatabaseException $e) 
{ 
    $db->query("ROLLBACK"); 
    echo "Problem! ".$e->getMessage(); 
} 

在上面的代碼中,假設$db是某種數據庫包裝對象時,查詢失敗,將拋出一個DatabaseException ,那麼如果在事務中的任何查詢遇到問題,則不會創建任何記錄

有很多瞭解的交易,因此谷歌了一下週圍。需要注意的是,使用MySQL,您需要使用InnoDB表來支持事務。如果您使用的是MyISAM,則會運行START TRANSACTIONCOMMIT等命令,但它們不會執行任何操作。

+0

BDB也是交易安全 – SeanJA 2010-04-19 22:26:04

+0

是歡迎您,zombat! – Ethan 2010-04-19 22:38:44