执行此查询时:
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();
}
这将产生错误消息。但我该怎么把这和其他结合起来呢?
3条答案
按热度按时间i1icjdpr1#
首先,如果您试图手动管理事务,请不要使用
$this->db->trans_complete()
. 它会召唤rollback()
如果有问题。其次,不要试图手动管理事务。我见过的每一个案例都有人编写与codeigniter相同的代码,但通常没有那么干净。为什么要重新发明轮子?
我建议对自动交易有信心。
你可以试着用
$this->db->error();
如果trans_status() === false
,但要知道它只报告上一次操作的结果(使用“mysqli”驱动程序)所以使用价值
$error['code']
可能为0,因为最后一个db操作(回滚)可能成功。mbjcgjjk2#
$this->db->error()
返回一个数组,其中包含可以检查的“error”和“code”元素。https://www.codeigniter.com/userguide3/database/queries.html#handling-错误
比如:
v64noz0r3#
我已经设法解决了。
所以我发现$this->db->error()只在查询本身之后立即起作用,而不在trans\u status区域中起作用。我找到的解决方法是
我保留回滚只是为了以防万一,但这对我很有用