|
下面這個自定義insert_id()函數(shù),所有中國PHP程序員都奉行真理一般在自己的數(shù)據(jù)庫操作函數(shù)類中使用。殊不知它是一個完全錯誤的函數(shù),也許有一天你的應用莫名其妙的出錯而你又苦找尋不錯程序的任何錯誤時,那有可能就是你對這個錯誤的無知。說“中國PHP程序員都容易犯的一個錯誤”可能是夸張了點,但我至今看到所有的PHP開源應用中都是原版使用下面的函數(shù)。
function insert_id() { return ($id = mysql_insert_id($this->link)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0); } 先說一下大家一直認為的此函數(shù)執(zhí)行: mysql_insert_id函數(shù)只能正確返回INT型,當遇到BIGINT型就會返回錯誤數(shù)據(jù)(大家誤認為此時會返回小于0的錯誤數(shù)據(jù))。 $id = mysql_insert_id($this->link)) >= 0此函數(shù)這么寫的期望是:當最新插入的記錄ID是BIGINT型時會返回小于0的值。 此時,期望函數(shù)會執(zhí)行$this->result($this->query("SELECT last_insert_id()"), 0),返回正確的BIGINT型記錄ID。 錯誤就出現(xiàn)在大家對$id = mysql_insert_id($this->link)) >= 0的錯誤認識。 它永遠都不會像大家期望的那樣“當最新插入的記錄ID是BIGINT型時會返回小于0的值”,所以此函數(shù)永遠也不會執(zhí)行$this->result($this->query("SELECT last_insert_id()"), 0)語句,永遠也不會在新插入的記錄ID是BIGINT型時返回正確的ID給你。 我光這么說,也許大家會不信,那我就告訴大家一個簡單的驗證方法: 找一個你設(shè)置有auto_increment字段的表,使用ALTER TABLE `你的表名` AUTO_INCREMENT = 8030558188959576064(一個BIGINT型數(shù)字),接下來就不用說了,寫段小程序向表中插入記錄,調(diào)用上面insert_id自定義函數(shù),此時你就能看到我所描述的是正確的。 解決辦法: 直接把此函數(shù)調(diào)整成如下所示: function insert_id() { return $this->result($this->query("SELECT last_insert_id()"), 0); } 請大家支持我的知識和勞動,轉(zhuǎn)載時請不要刪除原創(chuàng)地址。 原創(chuàng):http://www./thread-2233-1-1.html(若你無權(quán)發(fā)帶連接內(nèi)容刪除此行) 原創(chuàng):/thread-2233-1-1.html |
|
|