注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Bioinformatics home

 
 
 

日志

 
 

中国PHP程序员都容易犯的一个错误:使用错误的自定义insert_id函数  

2010-05-07 20:49:55|  分类: 生物信息编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
下面这个自定义insert_id()函数,所有中国PHP程序员都奉行真理一般在自己的数据库操作函数类中使用。殊不知它是一个完全错误的函数,也许有一天你的应用莫名其妙的出错而你又苦找寻不错程序的任何错误时,那有可能就是你对这个错误的无知。说“中国PHP程序员都容易犯的一个错误”可能是夸张了点,但我至今看到所有的PHP开源应用中都是原版使用下面的函数。

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);
}

请大家支持我的知识和劳动,转载时请不要删除原创地址。

原创:http://www.goupaiba.com/thread-2233-1-1.html
  评论这张
 
阅读(559)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017