2015-10-15 71 views
0

我有一個主設備表,通過它的ID(FK)鏈接到其他表(特定的設備信息表)。檢查是否所有插入在外鍵上都成功

因此,我的創建表單將特定設備類型信息(例如PC HDD大小,OS ...)插入適當的設備類型表(每個設備類型有一個),然後我將$ this-> db-> insert_id(),並將其與一般設備信息(如購買日期,授權截止日期等)一起插入主設備表中。

這個效果很好。但是,如果由於任何原因主表的數據無效 - 第二個查詢將失敗,並將插入的行留在適當的設備類型表中。

有沒有一種方法來檢查查詢是否會成功之前實際執行我的模型中的完整功能?或者 - 如果第二個查詢(或第三,第四...如果我有多個插入)失敗,是否可以回滾更改?

+0

我認爲你最好檢查爲什麼第二次插入查詢失敗的原因,爲什麼以及如何將無效數據加入到你的程序中?你忘了逃避一些字符串?還有別的嗎? –

+0

啊,這不是查詢失敗 - 我只是想知道一般 - 是否有辦法確保插入代碼本身。我的插入工作是因爲我使用jQuery和後端的CI驗證設置了前端驗證,所以在插入和處理數據時這非常安全。 – Skipp

回答

1

只需在一次交易中完成所有操作。要麼全部成功,要麼全都不成功。

+0

從CI文檔: $ this-> db-> trans_start(); $ this-> db-> query('AN SQL QUERY ...'); $ this-> db-> query('ANOTHER QUERY ...'); $ this-> db-> query('AND NOT OTHERETERY ...'); $ this-> db-> trans_complete(); 使用常規活動記錄CI方法執行此項工作嗎?我不想在我的代碼中使用純SQL查詢 – Skipp

+0

這些是更新,而不是查詢。事務的ACID屬性保證了我描述的行爲。它是數據庫的一個屬性:它與CI或PHP無關。我不知道你最後一句話的意思,但你必須使用任何符合你要求的技術。 – EJP

+0

好吧,通常我只是使用CI活動記錄來編寫查詢 - 我不會在我的代碼中編寫SQL。從CI文檔看來,您需要將MYSLQ查詢字符串傳遞到$ this-> db-> query(),這是我不喜歡的。 所以我想知道是否可以將我當前的CI活動記錄代碼包裝在$ this-> db-> trans_start()和$ this-> db-> trans_complete()中? – Skipp