codeigniter捕获db错误消息(如果dbdebug为false,则当前返回0)

kt06eoxx  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(315)

执行此查询时:

public function delete_user_test($id){
        $this->db->trans_begin();
        $this->db->where('id',$id);
        $this->db->delete($this->user_table);
        $person_id = $this->get_user_account($id)['person_id'];
        $this->db->where('id',$person_id);
        $this->db->delete($this->person_table);
        $this->db->trans_complete();
        if($this->db->trans_status()===false){
            $this->db->trans_rollback();
            return $this->db->error();
        }else{
            $this->db->trans_commit();
            return true;
        }
    }

如果数据库配置文件中的dbdebug设置为true,则会出现一个全屏错误

Error Number: 1451

Cannot delete or update a parent row: a foreign key constraint fails (`database_table`.`acc_codes`, CONSTRAINT `acc_codes_fk` FOREIGN KEY (`user_id`) REFERENCES `user_accounts` (`id`))

DELETE FROM `user_accounts` WHERE `id` = '2'

Filename: models/AccMdl.php

Line Number: 655

如何从该页获取错误消息并将其以横幅而不是整页的形式传递回去?如果我将dbdebug设置为false,那么$this->db->error()中的所有内容都是;是0。

编辑

添加了我的数据库配置。

$db['default'] = array(
    'dsn'   => '',
    'hostname' => host,
    'username' => uname,
    'password' => pw,
    'database' => name,
    'dbdriver' => drvr,
    'dbprefix' => '',
    'pconnect' => FALSE,
//  'db_debug' => (ENVIRONMENT !== 'production'),
    'db_debug' => FALSE,
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

编辑2

我设法把错误弄出来了。我使用的方法是删除trans\u begin和其他事务项。有没有办法将其与事务项集成?

$this->db->where('id',$id);
        if(!$this->db->delete($this->user_table)){
            return $this->db->error();
        }

这将产生错误消息。但我该怎么把这和其他结合起来呢?

i1icjdpr

i1icjdpr1#

首先,如果您试图手动管理事务,请不要使用 $this->db->trans_complete() . 它会召唤 rollback() 如果有问题。
其次,不要试图手动管理事务。我见过的每一个案例都有人编写与codeigniter相同的代码,但通常没有那么干净。为什么要重新发明轮子?
我建议对自动交易有信心。

function delete_user_test($id)
{
    $this->db->trans_start();
    $this->db
        ->where('id', $id)
        ->delete($this->user_table);

    $person_id = $this->get_user_account($id)['person_id'];  //huh???

    $this->db
        ->where('id', $person_id)
        ->delete($this->person_table);

    $this->db->trans_complete();

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

你可以试着用 $this->db->error(); 如果 trans_status() === false ,但要知道它只报告上一次操作的结果(使用“mysqli”驱动程序)所以使用

$error = this->db->error();

价值 $error['code'] 可能为0,因为最后一个db操作(回滚)可能成功。

mbjcgjjk

mbjcgjjk2#

$this->db->error() 返回一个数组,其中包含可以检查的“error”和“code”元素。
https://www.codeigniter.com/userguide3/database/queries.html#handling-错误
比如:

if($this->db->trans_status()===false){
    $this->db->trans_rollback();

    // Get the error array
    $error = $this->db->error();
    // Return the message - but that doesn't work with returning true/false.
    return $error('error');

} else { ...
v64noz0r

v64noz0r3#

我已经设法解决了。
所以我发现$this->db->error()只在查询本身之后立即起作用,而不在trans\u status区域中起作用。我找到的解决方法是

public function delete_user_test($id){
        $this->db->trans_begin();
        $this->db->where('id',$id);
        $result = $this->db->delete($this->user_table);
        if(!$result){return $this->db->error();}
        $person_id = $this->get_user_account($id)['person_id'];
        $this->db->where('id',$person_id);
        $result = $this->db->delete($this->person_table);
        if(!$result){return $this->db->error();}
        $this->db->trans_complete();
        if($this->db->trans_status()===false){
            $this->db->trans_rollback();
        }else{
            $this->db->trans_commit();
            return true;
        }
    }

我保留回滚只是为了以防万一,但这对我很有用

相关问题