2014-03-31 126 views
1

我正在構建一個登錄系統,該系統在一個稱爲用戶,會話和登錄的mysql數據庫(PHP)中使用三個表。所有表都有一個自動增量索引。在成功登錄後,用戶行通過存儲在新登錄行中的值鏈接到會話行。我想知道在這個過程中是否安全使用mysqli_insert_id()。我擔心,如果在會話行INSERT期間出現錯誤,登錄行將收到不正確的會話索引號,並且用戶將登錄到錯誤的會話。是mysqli_insert_id可靠嗎?

這會是一個問題嗎?如果是這樣,是否有一個好辦法來處理它?

+0

您如何看待這樣的錯誤可能會發生?您*可以*檢查插入是否有效。 – Popnoodles

+2

如果您擔心數據一致性,請使用'TRANSACTION'。 'mysql_insert_id'對每個PHP運行都是安全的。 – Halcyon

+0

如果你擔心這個問題,你不應該直接使用'mysqli'。相反,請使用[開發框架](http://codegeekz.com/best-php-frameworks-for-developers/)或[學說](http://www.doctrine-project.org/)等ORM。或[Propel](http://propelorm.org/)爲您可靠地處理此問題。 – tadman

回答

0

它的更好,如果你使用觸發

觸發,當你觸發另一

see this tutorial

+0

創建一個觸發器是一個好主意返回剛剛創建的行?或者在用戶登錄時創建幾個完全更新數據庫的觸發器? – Hoytman

+0

觸發器對於像這樣簡單的事情來說是一種**巨大的**痛苦,並且不能解決檢索插入的最後一行的ID的問題。 – tadman

+0

是的,你可以創建幾個觸發器來更新多個表,因此當用戶登錄時只需插入日誌表中,觸發器將爲你完成剩下的工作 –

2

這種方法會產生可靠的結果如果會做一個查詢:

  • 最後INSERT操作成功。
  • 結果被檢查立即INSERT成功後,在相同的數據庫連接。

大多數情況下,只要調用INSERT然後獲取插入的ID作爲下一個操作即可,只要您使用相同的數據庫句柄即可。

一個框架會自動爲你做所有這些,所以它通常不是你應該關心的。

0

如果你想確保數據的完整性&你執行的操作,那麼我建議你去「全部或無」的方法。這意味着您的所有查詢都將單獨傳遞,否則即使失敗,它們也將全部失敗。您可以在MySQL中使用TRANSACTION & ROLLBACK功能來實現此功能。欲瞭解更多信息,您可以訪問:http://www.tutorialspoint.com/sql/sql-transactions.htm