php - 如果发生数据库查询错误,CodeIgniter 3不会返回false

标签 php codeigniter error-handling codeigniter-3 codeigniter-database

我已经阅读了许多与此错误相关的答案。但是,没有问题(或答案)是关于CodeIgniter的数据库 Activity 查询类应在应返回FALSE时返回FALSE(因为发生错误)。它所做的只是将查询错误打印到application/logs中的错误日志文件中并退出。
DB_DEBUG值为false。$db['default']['db_debug'] = FALSE;这是正在执行的查询:

$this->db
    ->where('col_1_name', 'value')
    ->where_in('col_2_name', $array)
    ->delete('table_name');
发生错误是因为$array是不是问题的空数组BUT-问题是它确实不会返回错误的,而只是将查询错误打印到application/logs/中的错误日志文件。如果发生错误,它应该返回false,不是吗?否则,任何人将如何捕获数据库错误?
在将该查询的错误写入日志文件后,它将退出该过程。我已经通过在上述方法之前和之后添加log_messages()进行了验证。
注意:我已经尝试使用DB_DEBUG = TRUE以及FALSE,在两种情况下都会发生相同的情况。
注意:CodeIgniter 3的文档说delete()方法(以及许多其他DB方法)在失败时返回FALSE。 https://www.codeigniter.com/userguide3/database/query_builder.html#CI_DB_query_builder::delete

最佳答案

根据您的网站设置方式,这不是错误。遇到数据库错误时,该方法不会神奇地返回false
如果db_debug设置为true,则CI3在遇到数据库错误时会中止执行,将错误输出到屏幕上并记录下来,但是您没有机会评估错误。
但是,db_debug设置为false,您可以在运行查询后立即检查$this->db->error()的值,在这里可以检查查询是否运行正常。
我用select语句尝试了此操作,但是deleteupdate等的行为完全相同。

$query = $this->db->get();
log_message('debug', "Err: ".json_encode($this->db->error()));
记录:
DEBUG - 2020-10-09 12:09:44 --> Err: {"code":0,"message":""}
没有错误时,以及
 Err: {"code":1064,"message":"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 4"}
有错误时。$this->db->error()实际上是一个数组,因此您不仅可以记录它,还可以检查类似
$err = $this->db->error();
if ($err['code'] !== 0)
{
  // do something about the error or handle the excepcion
}

else
{
  // query ran OK, keep the method going
}

关于php - 如果发生数据库查询错误,CodeIgniter 3不会返回false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64280884/

相关文章:

php - 帮助格式化 PHP 中的新闻条目

php - 从数据库中获取匹配的短语

jquery ajax返回错误但成功

c# - 当我期望相等的两个值不相等时抛出什么异常? (C#)

c# - 如何在.Net中以中间层结构化方式处理错误或异常

php - Ruby 通过模板从字符串中选择数据,就像 php preg_match 做的那样

php - 在 Codeigniter 中加载主页时如何跳过数据库文件或模型文件?

mysql - 无法使用 CodeIgniter 连接到 MySQL。可能的 DNS 问题?

validation - Play Framework 2 中的显示错误

php - 如何在将链接保存到数据库之前自动在链接前附加 "http://"?