日期:2014-05-16  浏览次数:20793 次

PHP程序员易错用的mysql_insert_id函数

今天一早在CSDN论坛看帖子的时候,发现这个帖子说得真的不错,下面的评论也挺好的。又给自己长了点知识,不错~呵呵~

  function insert_id() {
return ($id = mysql_insert_id($this->link)) >= 0 ? $id : $this->result($this->query(“SELECT last_insert_id()”), 0);
}

先说一下大家一直认为的此函数执行:
mysql_insert_id函数只能正确返回INT型,当遇到BIGINT型就会返回错误数据(大家误认为此时会返回小于0的错误数据)。

$id = mysql_insert_id($this->link)) >= 0此函数这么写的期望是:当最新插入的记录ID是BIGINT型时会返回小于0的值。

此时,期望函数会执行$this->result($this->query(“SELECT last_insert_id()”), 0),返回正确的BIGINT型记录ID。

错误就出现在大家对$id = mysql_insert_id($this->link)) >= 0的错误认识。

它永远都不会像大家期望的那样“当最新插入的记录ID是BIGINT型时会返回小于0的值”,所以此函数永远也不会执行$this->result($this->query(“SELECT last_insert_id()”), 0)语句,永远也不会在新插入的记录ID是BIGINT型时返回正确的ID给你。

我光这么说,也许大家会不信,那我就告诉大家一个简单的验证方法:

找一个你设置有auto_increment字段的表,使用ALTER TABLE `你的表名` AUTO_INCREMENT = 8030558188959576064(一个BIGINT型数字),接下来就不用说了,写段小程序向表中插入记录,调用上面insert_id自定义函数,此时你就能看到我所描述的是正确的。

解决办法:

直接把此函数调整成如下所示:

function insert_id()
{
return $this->result($this->query(“SELECT last_insert_id()”), 0);
}

sink补充:
  1、其中函数mysql_insert_id() 函数返回上一步 INSERT 操作产生的 ID。
如果上一查询没有产生 AUTO_INCREMENT 的 ID,则 mysql_insert_id() 返回 0。故上面的?:判断是以是否大于0为分界。
  2、last_insert_id 自动返回最后一个 INSERT 或 UPDATE 操作为Auto_Increnment一个发生的值。LAST_INSERT_ID是基于单个connection的, 不可能被其它的客户端连接改变。

最后原作者的最原始链接(呵呵,我们都要学会尊重原创嘛~):http://www.goupaiba.com/thread-2233-1-1.html