当可能没有行被更新时,使用Codeigniter检查db->update是否成功

k75qkfdt  于 2023-05-20  发布在  其他
关注(0)|答案(6)|浏览(108)

我一直在使用$this->db->affected_rows()来检查更新是否成功。但当用户输入的数据与已经存储的数据相同时,这就不起作用了(因为实际上没有更新任何列)。我的解决方法是获取存储的数据,与输入的数据进行比较,如果不同则更新,如果相同则返回NO_CHANGE常量。对于JSON数据,有一个额外的解析步骤。
有没有更简单的方法来检查更新是否有错误?比如,不需要事先获取存储的数据的东西?

vql8enpb

vql8enpb1#

如果我理解正确的话,你可以使用transactions来确保更新没有错误:

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->update('table',$array);
$this->db->trans_complete();

if ($this->db->trans_status() === FALSE)
{
    // generate an error... or use the log_message() function to log your error
}

请记住,这只是验证在事务中的所有查询期间没有SQL错误。
更多信息Code Igniter Active Record Transaction

vbopmzt1

vbopmzt12#

除了可接受的答案解决方案之外,您还可以像下面这样扩展代码,以区分affected_rowstrans_status结果/错误。

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->update('table',$array);
$this->db->trans_complete();
// was there any update or error?
if ($this->db->affected_rows() == '1') {
    return TRUE;
} else {
    // any trans error?
    if ($this->db->trans_status() === FALSE) {
        return false;
    }
    return true;
}
7fhtutme

7fhtutme3#

Mirov当我们使用codeigniter时,只有当输入字段的值发生变化时,数据才会更新,然后$this->db->affected_rows()将返回大于0的值。
假设我们有两个字段nameemail,如果我们尝试在不更改任何字段的情况下提交表单,那么$this->db->affected_rows()将返回0,否则将返回1。
所以更好的方法是

if($this->db->affected_rows() >=0){
  return true; //add your code here
}else{
  return false; //add your your code here
}
sqxo8psd

sqxo8psd4#

我的“变通方法”很简单--就是包含一个 * 总是 * 更新的字段。例如,如果您有一个字段,并使用带秒的日期和时间值更新它-那么日期时间秒将始终不同,即使其他更新值仍然相同。
额外的好处是你有一个日期时间在数据库记录时,最后一次更新完成。

n53p2ov0

n53p2ov05#

我不知道为什么我们不能使用这个:

if ($this->db->update('table',$array) === FALSE){
    // generate an error... or use the log_message() function to log your error
}
kqlmhetl

kqlmhetl6#

CodeIgniter语法4:

$db->transStart();
$db->query('AN SQL QUERY...');
$db->update('table',$array);
$db->transComplete();

if ($db->transStatus() === FALSE)
{
    // generate an error
}

相关问题