如何从CodeIgniter中的失败数据库查询中恢复?

时间:2012-05-02 03:48:56

标签: php mysql database codeigniter error-handling

在CodeIgniter中,如果您的sql查询失败,则脚本停止运行并且您收到错误。有没有办法做到这一点,所以你可以尝试一个查询,如果它失败了,那么你静静地检测它并尝试不同的查询,而用户不知道查询失败了?

5 个答案:

答案 0 :(得分:5)

您可以将Exceptions类修改为...抛出异常。只需在MY_Exceptions.php中创建application/core/

class MY_Exceptions extends CI_Exceptions {

    function show_error($heading, $message, $template = 'error_general', $status_code = 500)
    {
        // BEGIN EDIT
        if ($template === 'error_db')
        {
            throw new Exception(implode("\n", (array) $message));
        }
        // END EDIT

        set_status_header($status_code);

        $message = '<p>'.implode('</p><p>', ( ! is_array($message)) ? array($message) : $message).'</p>';

        if (ob_get_level() > $this->ob_level + 1)
        {
            ob_end_flush();
        }
        ob_start();
        include(APPPATH.'errors/'.$template.'.php');
        $buffer = ob_get_contents();
        ob_end_clean();
        return $buffer;
    }
}

然后使用try / catch块检查错误并尝试运行另一个查询:

try {
    $this->db->get('table1');
} catch (Exception $e) {
    $this->db->get('table2');
}

这是一种草率的解决方法,但它完成了工作。

您可能也想查看transactions

  

正在运行的交易

     

要使用事务运行查询,您将使用   $this->db->trans_start()$this->db->trans_complete()的功能如下   如下:

     

$this->db->trans_start();
  $this->db->query('AN SQL QUERY...');
  $this->db->query('ANOTHER QUERY...');
  $this->db->query('AND YET ANOTHER QUERY...');
  $this->db->trans_complete();

     

您可以在开始/完成之间运行任意数量的查询   函数,它们都将基于提交或回滚   任何给定查询的成功或失败。

答案 1 :(得分:4)

实现这一目标的方法之一是

首先。

Set  ['db_debug'] = FALSE; in config/database.php

然后,

在你的模特中 -

public function attempt_one($data) {
  //build your query ....
  $query_result = $this->db->insert('table_name');

  if(!$query_result) {
     $this->error = $this->db->_error_message();
     $this->errorno = $this->db->_error_number();
     return false;
  }
  return $something;
}

public function attempt_two() {
  //another query goes in here ...
}

在您的控制器中 -

public function someAction ()
{
  //some code 
  $data = $some_data;
  $result1 = $this->yourmodel->attempt_one($data);
  if($result1 === false)
  {
    //Some code to send an email alert that first query failed with error message 
    //and/or log the error message/ number 
    $result2 = $this->yourmodel->attempt_two($data);
  }

}

答案 2 :(得分:2)

只需使用

$this->db->simple_query() 

而不是

$this->db->query()

简单查询将返回true / false。

答案 3 :(得分:1)

您可以使用以下方式访问数据库错误:

  • $this->db->_error_message();
  • $this->db->_error_number();

答案 4 :(得分:1)

您可以从他们的官方论坛中查看此主题,讨论并建议针对此特定主题的解决方案:  http://codeigniter.com/forums/viewthread/76524/