Проблема, с которой я столкнулся с решением по перехвату исключений PDO для целей отладки, заключается в том, что он перехватывает только исключения PDO (да), но не перехватывает синтаксические ошибки, которые были зарегистрированы как ошибки php (я не уверен, почему это так, но " почему "не имеет отношения к решению). Все мои вызовы PDO происходят из одного класса модели таблицы, который я расширил для всех моих взаимодействий со всеми таблицами ... это сложные вещи, когда я пытался отладить код, потому что ошибка регистрировала строку кода php, в которой был мой вызов выполнения позвонил, но не сказал мне, откуда, собственно, звонили. Я использовал следующий код для решения этой проблемы:
class TableModel{
var $_db;
var $_query;
function execute($sql, $params) {
global $_tm;
$this->_sql = $sql;
$this->_paramArray = $params;
$this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->_query = $this->_db->prepare($sql);
try {
set_error_handler('pdoErrorHandler');
$_tm = $this;
$this->_query->execute($params);
restore_error_handler();
} catch (Exception $ex) {
pdoErrorHandler();
return false;
}
}
}
Таким образом, приведенный выше код перехватывает ОБЕИ исключения PDO И синтаксические ошибки php и обрабатывает их одинаково. Мой обработчик ошибок выглядит примерно так:
function pdoErrorHandler() {
global $_tm;
$sql = $_tm->_sql;
$params = $_tm->_params;
$query = $tm->_query;
$message = 'PDO error: ' . $sql . ' (' . implode(', ', $params) . ") \n";
ob_start();
debug_backtrace();
$trace = ob_get_clean();
error_log($message);
if(admin(){
print_r($message);
}
}
Если у кого-то есть лучшие идеи о том, как получить соответствующую информацию для моего обработчика ошибок, чем установка модели таблицы в качестве глобальной переменной, я был бы счастлив услышать это и отредактировать свой код.
/var/log/mysql/*
. Параметры, связанные с PDO, не могут вызывать синтаксических ошибок, поэтому все, что вам нужно, - это подготовленный SQL-запрос.