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

本文探讨了在使用CodeIgniter框架执行批量插入操作时,affected_rows()函数返回值不准确的情况。通过分析代码流程,作者发现批量插入功能会在数据量超过100条时分多次执行。为了解决这个问题,作者提出了一种改进的方法,即对插入数据进行求余运算,并将affected_rows()的结果与实际插入数量进行对比,确保数据正确插入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值