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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值