CodeIgniter では、SQL クエリが失敗すると、スクリプトの実行が停止し、エラーが発生します。クエリを試すことができるようにする方法はありますか?それが失敗した場合は、それを静かに検出し、ユーザーがクエリが失敗したことを知らずに別のクエリを試行しますか?
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 関数の間で必要な数のクエリを実行できます。それらはすべて、特定のクエリの成功または失敗に基づいてコミットまたはロールバックされます。
これを達成する方法の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);
}
}
次を使用してデータベースエラーにアクセスできます。
$this->db->_error_message();
$this->db->_error_number();
この特定のトピックの解決策について議論し、提案している公式フォーラムのこのスレッドを見ることができます: http://codeigniter.com/forums/viewthread/76524/