***codeigniter 2.2 affected_rows()返回值不准确

http://blog.icodeu.com/?p=596

问题描述
今天在完成一个项目调用想要检验一下计划插入的数据是否都正常插入了。调用insert_batch()方法插入一百多条数据的时候发现affected_rows()返回值不准确。
问题分析
1.第一步打印last_query()发现插入的数据和affected_rows()数值确实是一样的
2.检查数据库,发现需要插入的一百多条数据也确实正常插入了
3.查看了一下代码,才知道在insert_batch()和update_batch()的时候,如果数据量大于100条,将会分多次插入,每次最多只会插入一百条。
详见下面的代码

帮助


1

2

3

4

5

6

// Batch this baby

for ($i = 0, $total = count($this->ar_set); $i < $total; $i = $i + 100)

{

    $sql = $this->_update_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->ar_set, $i, 100), $this->_protect_identifiers($index), $this->ar_where);

    $this->query($sql);

}

影响范围
insert_batch(),update_batch()
解决方案
对插入的数据进行求余然后和affected_rows()进行对比检验插入数据是否正确

github上官方已经修复了这个问题

https://github.com/bcit-ci/CodeIgniter/tree/2.2-stable

帮助


1

2

3

4

5

6

7

    // Batch this baby

$affected_rows = 0;

for ($i = 0, $total = count($this->qb_set); $i < $total; $i += 100)

{

$this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, 100)));

$affected_rows += $this->affected_rows();

}

时间: 2024-10-07 21:38:21

***codeigniter 2.2 affected_rows()返回值不准确的相关文章

EF5中 执行 sql语句使用Database.ExecuteSqlCommand 返回影响的行数 ; EF5执行sql查询语句 Database.SqlQuery 带返回值

一: 执行sql语句,返回受影响的行数 在mysql里面,如果没有影响,那么返回行数为  -1 ,sqlserver 里面  还没有测试过 using (var ctx = new MyDbContext()) { ctx.Database.ExecuteSqlCommand("UPDATE Person SET Name = 'Michael' WHERE PersonID = 1"); } 二 : Database.SqlQuery<T>   EF5执行sql查询语句

关于socket阻塞与非阻塞情况下的recv、send、read、write返回值(转载)

1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值 <0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续接收.只是阻塞模式下recv会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要 循环读取 2.阻塞模式与非阻塞模式下writ

stl中的transform()注意其与for_each的不同点(有无返回值)

#include<iostream> using namespace std; #include"vector" #include"algorithm" #include"list" #include"functional" // void PrintV(vector <int > &temp) { for (vector<int>::iterator it = temp.begin

Python之路16-函数返回值

#函数返回值 def test1():     print ('in the test1')     return 0     print ('test end') #return 结束函数 #return返回值 x = test1() def test1():     print ('in the test1') def test2():     print ('in the test2')     return 0 def test3():     print ('in the test3'

Activity的跳转及返回值,activity的生命周期

Activity生命周期 从创建到销毁的生命周期: onCreate()→onStart()→onResume()→onPouse()→onStop()→onDestroy() 从起动到后台再到前台: onCreate()→onStart()→onResume()→onPouse()→onStop()→onRestart()→onStart()→onResume() 启动第二个activity 1. 创建new activity 2. 创建对应的new xml布局文件 3. 在new activ

Request.QueryString/Form 返回值类型 与 CInt()

一直以为 Request.QueryString/Form 找不到指定的变量时会返回空字符串. 其实不然,Request.QueryString/Form 找不到指定的变量时,返回值的类型是 Empty. Empty 是 Variant 的子类型. CInt() 不接受空字符串,但是却可以接受 Empty 类型. 下面是关于 VBScript 数据类型的一些介绍. VBScript 只有一种数据类型,称为 Variant. Variant 是一种特殊的数据类型,根据使用的方式,它可以包含不同类别

社保系列10——返回值速查表

9000 命令执行成功 6006 依据传输模式,所要读取的字节长度错 61xx 正常处理.'xx'表示可以通过后续 GET RESPONSE命令得到的额外数据长度 6281 回送数据可能出错 6282 文件长度<Le 6283 选择文件无效 6284 FCI格式与P2指定的不符 6300 认证失败 63Cx 验证失败,x =0 表示不提供计数器 x !=0 表示重试次数 6581 EEPROM损坏,导致卡锁定 6700 Lc或Le长度错 6900 无信息提供 6901 命令不接受(无效状态) 6

关于Oracle返回值

http://blog.csdn.net/liangweiwei130/article/details/38223319 对于各种存储类型非常详细的描述 http://www.jb51.net/article/74612.htm 如何操作游标类型 https://www.2cto.com/database/201301/186608.html 如何处理返回值或者返出值为游标类型的变量 http://www.cnblogs.com/medci/archive/2012/10/21/2733166.

myBatis中的注解@Param、返回值为Map、JAVA读取Excel并解析文本、Class.getResource()和ClassLoader.getResource()

myBatis中的注解@Param:http://blog.csdn.net/gao36951/article/details/44258217:  http://www.cnblogs.com/thomas12112406/p/6217211.html. myBatis返回值为Map:http://blog.csdn.net/werewr342352321df/article/details/11892755. ====================== JAVA读取Excel并解析文本:h