使用ezsql,更新记录时,新记录与原记录相同时的返回值

问题来源

在CI项目中,集成了ezsql库。修改某一条数据时,如果数据没有任何修改,提交后,由于提交的内容与原内容相同,所以$this->ezsql->query($sql)的结果返回的是0。如果提交的内容字段与原字段不符,那么更新成功 ,则返回的结果为1。由于更新数据,$this->ezsql->query($sql) 返回的结果为影响的记录数。查看源码得知,实际获取该结果的是通过:mysql_affected_rows()来获取结果的。点击查看:mysql_affected_rows 说明

上面的结果符合预期。但是我却在另一个项目中,该项目为常规程序,使用ezsql类来操作数据库。修改某一条数据时,如果数据没有任何修改,即修改的字段内容与数据库中的内容一样时,$db->query($sql)返回的仍是1。

于是开始查找原因,分步做以下测试:

创建表test,并创建两个字段。字段id为主键 int 自增、字段mm int型。插入一条记录

id    mm

1      1

1、不采用ezsql类

header("Content-Type:text/html;charset=utf-8");
$conn=@mysql_connect("127.0.0.1","root","123456",1,131072) or die("数据库连接错误");
mysql_select_db("dj480",$conn);
mysql_query("set names 'UTF8'");
$sql='update test set mm=2 where id=1';
mysql_query($sql);
echo @mysql_affected_rows($conn);
exit;
结果是:

执行第一次,结果为1

再执行一次,结果为0

符合要求

2、采用ezsql类

include("common/init.php");
$sql='update test set mm=3 where id=1';
echo $db->query($sql);
exit;
结果是:

执行第一次,结果为1

执行第二次,结果仍为1

不符合要求

3、在CI中采用ezsql类

在一控制器中建立一个方法:

function test()
{
    $sql='update test set mm=4 where id=1';
    echo $this->ezsql->query($sql);
    exit;
}
结果是:

执行第一次:结果为1

执行第二次:结果为0

符合预期


到这里我就纳闷,同样是ezsql类,为什么CI中可以,单独使用却不行呢?于是开始分析ezsql类的源码和集成到CI中源码的区别,初步比较发现,这两种代码基本相同。不同的是query()方法中,普通ezsql类中(ez_sql_mysql.php query方法)采用的是:

$this->rows_affected = @mysql_affected_rows($this->dbh);
而集成到CI中ezsql库(libraries/ezsql_codeigniter.php query方法)采用的是:

$this->rows_affected = $this->CI->db->affected_rows();
接着查看system/database/drivers/mysql/mysql_driver.php文件中337行:

/**
 * Affected Rows
 *
 * @access	public
 * @return	integer
 */
function affected_rows()
{
    return @mysql_affected_rows($this->conn_id);
}
这两种都是一样的。于是接着找,发现CLIENT_MULTI_RESULTS值不同。上面测试中,不采用ezsql类的情况下,我的CLIENT_MULTI_RESULTS值为:131072,而ezsql类中CLIENT_MULTI_RESULTS的值为131074。于是我将ezsql类中的CLIENT_MULTI_RESULTS值改为:131072。开始测试:

include("common/init.php");
$sql='update test set mm=5 where id=1';
echo $db->query($sql);
exit;
结果是:

执行第一次,结果为1

执行第二次,结果为0

符合预期

看样子问题就在这了,但是目前还不清楚CLIENT_MULTI_RESULTS的这两个值的具体区别,以后在探讨吧。

话说回来,为什么CI中也能符合预期呢?是不是CI对这做了处理,目前我还没有仔细看CI这方面相关源码,以后在解决吧。

其它问题

另外,mysql_affected_rows的说明文档中有这样的一句话:

如果最近一次操作是没有任何条件(WHERE)的 DELETE 查询, 在表中所有的记录都会被删除,但该函数返回值为 0。
但是我测试时:

header("Content-Type:text/html;charset=utf-8");
$conn=@mysql_connect("127.0.0.1","root","123456",1,131072) or die("数据库连接错误");
mysql_select_db("dj480",$conn);
mysql_query("set names 'UTF8'");
$sql='delete from test';
mysql_query($sql);
echo @mysql_affected_rows($conn);
exit;

得到结果不是0,而是被删除的记录数量。

将数据库连接改为:

$conn=@mysql_connect("127.0.0.1","root","123456") or die("数据库连接错误");
结果与上面一样。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值