中国PHP程序员都犯的一个错误:使用错误的自定义insert_id函数
2010-04-30 17:51
375 查看
下面这个自定义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
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
相关文章推荐
- createSQLQuery使用uniqueResult的一个错误
- SpringMVC中的自定义视图使用BeanNameViewResolver出现了不能使用的错误解决
- 使用xib封装一个自定义view的步骤
- 使用OleDbCommandBuilder时出现“Insert into 语句的语法错误”的解决方法
- 使用xib封装一个自定义view的步骤
- 使用OleDbCommandBuilder时出现“Insert into 语句的语法错误”的解决方法
- Java String replace()使用的一个小错误
- (转载) socket:10038错误{winSock的一个bug:当closesocket多次错误使用时会导致问题}
- 错误提示:操作必须使用一个可更新的查询。
- HTML DOM insertBefore() 方法 使用的时候发现一个问题,记录下
- 错误“操作必须使用一个可更新的查询”原因及解决办法
- 错误“操作必须使用一个可更新的查询”原因及解决办法
- 【错误】”将参数值从 String 转换到 Decimal 失败“ && “仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时”
- PHP 自定义错误处理函数的使用详解
- 前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误。 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected est
- 记使用WaitGroup时的一个错误
- 一个HTML的低级错误!!!与不能同时使用
- 使用maven-pax-plugin做osgi开发时遇到的一个错误
- 发生系统错误 1219。不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接。
- 致MFC新手,关于CDialogBar使用的一个小错误