次のようなメッセージを表示する代わりにCIがDBエラーに遭遇したときにexceptionをスローする方法はありますか?
データベースエラーが発生しましたエラー番号:1054 'where句'の不明な列 'foo' SELECT * FROM(
FooBar
)WHEREfoo
= '1'
注:これを1つのコントローラーでのみ実行したいです。他のコントローラーでは、DBエラーメッセージが表示されてうれしいです。
これらのCI機能をお試しください
$this->db->_error_message(); (mysql_error equivalent)
$this->db->_error_number(); (mysql_errno equivalent)
たぶんこれ:
$db_debug = $this->db->db_debug; //save setting
$this->db->db_debug = FALSE; //disable debugging for queries
$result = $this->db->query($sql); //run query
//check for errors, etc
$this->db->db_debug = $db_debug; //restore setting
Codeigniter 3.0(CI3)では、必要なことは$this->db->error()
だけです
発生した最後のエラーを取得する必要がある場合、error()メソッドはそのコードとメッセージを含む配列を返します
http://www.codeigniter.com/user_guide/database/queries.html#handling-errors
Config/database.phpでデータベースのデバッグをオフにする必要があります->
$db['default']['db_debug'] = FALSE;
あなたのウェブサイトのセキュリティに優れています。
私はこのスレッドが古いことを知っていますが、万が一他の誰かがこの問題を抱えている場合に備えて。これは、CI dbクラスに触れずに使用したトリックです。デバッグをオンのままにして、エラービューファイルで例外をスローします。
だからあなたのDB設定では、あなたが持っています:
$db['default']['db_debug'] = true;
次に、dbエラービューファイルで、私のものはapplication/errors/error_db.php
にあり、すべてのコンテンツを次のものに置き換えます。
<?php
$message = preg_replace('/(<\/?p>)+/', ' ', $message);
throw new Exception("Database error occured with message : {$message}");
?>
ビューファイルが呼び出されるため、エラーは常に例外としてスローされます。後で、異なる環境に異なるビューを追加できます。
そのための簡単なライブラリを作成しました。
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class exceptions {
public function checkForError() {
get_instance()->load->database();
$error = get_instance()->db->error();
if ($error['code'])
throw new MySQLException($error);
}
}
abstract class UserException extends Exception {
public abstract function getUserMessage();
}
class MySQLException extends UserException {
private $errorNumber;
private $errorMessage;
public function __construct(array $error) {
$this->errorNumber = "Error Code(" . $error['code'] . ")";
$this->errorMessage = $error['message'];
}
public function getUserMessage() {
return array(
"error" => array (
"code" => $this->errorNumber,
"message" => $this->errorMessage
)
);
}
}
クエリ例:
function insertId($id){
$data = array(
'id' => $id,
);
$this->db->insert('test', $data);
$this->exceptions->checkForError();
return $this->db->insert_id();
}
そして、この方法でコントローラーでキャッチできます。
try {
$this->insertThings->insertId("1");
} catch (UserException $error){
//do whatever you want when there is an mysql error
}
Application/coreフォルダーのMY_Exceptions.phpというファイルにこのコードを配置します。
<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');
/**
* Class dealing with errors as exceptions
*/
class MY_Exceptions extends CI_Exceptions
{
/**
* Force exception throwing on erros
*/
public function show_error($heading, $message, $template = 'error_general', $status_code = 500)
{
set_status_header($status_code);
$message = implode(" / ", (!is_array($message)) ? array($message) : $message);
throw new CiError($message);
}
}
/**
* Captured error from Code Igniter
*/
class CiError extends Exception
{
}
すべてのCode Igniterエラーが例外(CiError)として扱われます。次に、すべてのデータベースデバッグをオンにします。
$db['default']['db_debug'] = true;
これを使って
$this->db->_error_message();
エラーを見つけるのに適しています。サイトを完成させた後。それを使用してエラーメッセージを閉じます
$db['default']['db_debug'] = FALSE;
Configフォルダーのdatabase.phpで変更します
私のために働いた例:
$query = "some buggy sql statement";
$this->db->db_debug = false;
if(!@$this->db->query($query))
{
$error = $this->db->error();
// do something in error case
}else{
// do something in success case
}
...
ベスト
上記のすべての答えに加えて、PDOを使用する場合。
次のようにエラーを静かに記録します
$q = $this->db->conn_id->prepare($query);
if($q instanceof PDOStatement) {
// go on with bind values and execute
} else {
$dbError = $this->db->error();
$this->Logger_model->logError('Db Error', date('Y-m-d H:i:s'), __METHOD__.' Line '.__LINE__, 'Code: '.$dbError['code'].' - '.'Message: '.$dbError['message']);
}
エラーのデバッグを無効にします。
$data_user = $this->getDataUser();
$id_user = $this->getId_user();
$this->db->db_debug = false;
$this->db->where(['id' => $id_user]);
$res = $this->db->update(self::$table, $data_user['user']);
if(!$res)
{
$error = $this->db->error();
return $error;
//return array $error['code'] & $error['message']
}
else
{
return 1;
}