前言 - MySQL的 insert 和 update 檢查方式不太一樣
下午在開發時,把之前用來insert的model function 完完整整地複製,
把insert 改成 update
into 改成set … 之類的。
結果在檢查的時候發現update語法都正確,但回傳了失敗。
(都用$this->db->last_query()
回傳印出來看都正常)
之後就開始檢討自己的檢查方式是不是哪裡有問題,
後來發現是判斷的方法不太對,所以稍微寫下來與大家分享。
MySQL insert 的檢查方式
以在codeigniter 中,使用$this->db->query($sql, $bind)
insert 成功之後,
若想知道剛剛的insert 是否失敗,通常有幾個辦法:
- 判斷
if ( $this->db->query($sql, $bind) == FALSE)
在這裡,我們採用雙等號,因為這個值在全等的時候,
不會剛好為一個boolean 值 FALSE,寫出三等號容易判斷失敗。 - 判斷
if ($this->db->affected_rows() == 0)
用來判斷是否有成功的insert 進db,
若有的話確實在影響行數會大於0。 - 判斷
if ($this->db->insert_id <= 0)
通常用於關聯時,有id傳遞的時候,
這個方法需要在該table有 primary key, 且有auto increment的時候才可用。
成功insert 時,此數字會大於零,為一個自然數。
*如果使用$this->db->insert_batch時,若insert複數筆資料,則使用$this->db->insert_id 回傳第一筆的insert_id值,若需要最後一個id,則需要自行計算。
MySQL update 檢查方式與小坑
今天在insert時,忘記不能使用前述第二點if ($this->db->affected_rows() == 0)
來判斷,
原因是,如果table內的資料與你的指定資料欄位值相同時,此時的affected_row()取得為0,會直接被視為更新失敗,
因此正確的做法應該以第一個判斷if ( $this->db->query($sql, $bind) == FALSE)
為準
*delete 的成功與否也與update相同
總結
以下簡要列出可用的檢查方式:
判斷方法 | INSERT | UPDATE | DELETE |
---|---|---|---|
$this->db->query($sql, $bind) == FALSE | V | V | V |
$this->db->affected_rows() == 0 | V | △ | △ |
$this->db->insert_id <= 0 | * | X | X |
*需要有id, 且id欄位為primary key, auto increment 性質才可以使用。
X 無法使用。
△ 建議不要使用,判斷可能會失敗。在delete時,也有語法正確,但影響行數為零的情形發生。此時若沒有該筆資料,則視為刪除成功。