下面这个自定义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(若你无权发带连接内容删除此行)原创:goupaiba.com/thread-2233-1-1.html

解决方案 »

  1.   

    看了楼主的文章 
    得到一个结论:我不是中国的php程序员
      

  2.   

    很负责的告诉你我经常用bigint没问题
      

  3.   

    $a = 8030558188959576064;echo $a; //8.03055818896E+18 var_dump($a+1 >= 0); //bool(true)
      

  4.   

    很负责的告诉你我经常用bigint没问题那我就很负责的告诉你,你只是字段使用bigint型,而ID值还没有达到bigint型这当然不会出问题。你把ID值变更成bigint后再试一试。