4

CodeIgniter では、SQL クエリが失敗すると、スクリプトの実行が停止し、エラーが発生します。クエリを試すことができるようにする方法はありますか?それが失敗した場合は、それを静かに検出し、ユーザーがクエリが失敗したことを知らずに別のクエリを試行しますか?

4

5 に答える 5

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');
}

これはちょっとずさんな回避策ですが、仕事は完了します。

トランザクションも確認することをお勧めします。

トランザクションの実行

トランザクションを使用してクエリを実行するには、 次のように関数$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();

start/complete 関数の間で必要な数のクエリを実行できます。それらはすべて、特定のクエリの成功または失敗に基づいてコミットまたはロールバックされます。

于 2012-05-02T04:30:47.587 に答える
4

これを達成する方法の1つは、

初め。

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);
  }

}
于 2012-05-02T10:13:53.203 に答える
1

次を使用してデータベースエラーにアクセスできます。

  • $this->db->_error_message();
  • $this->db->_error_number();
于 2012-05-02T04:07:34.097 に答える
1

この特定のトピックの解決策について議論し、提案している公式フォーラムのこのスレッドを見ることができます: http://codeigniter.com/forums/viewthread/76524/

于 2012-05-02T05:03:13.067 に答える