Pesquisando na internet, achei isso uma solução aceitável. Uma classe diferente é usada em vez das funções DOP e DOP são chamadas por meio de chamadas de funções mágicas. Não tenho certeza se isso cria sérios problemas de desempenho. Mas pode ser usado até que um recurso de registro sensível seja adicionado ao DOP.
Portanto, de acordo com esse encadeamento , você pode escrever um invólucro para a conexão PDO, que pode registrar e gerar uma exceção quando receber um erro.
Aqui está um exemplo simples:
class LoggedPDOSTatement extends PDOStatement {
function execute ($array) {
parent::execute ($array);
$errors = parent::errorInfo();
if ($errors[0] != '00000'):
throw new Exception ($errors[2]);
endif;
}
}
para que você possa usar essa classe em vez de PDOStatement:
$this->db->setAttribute (PDO::ATTR_STATEMENT_CLASS, array ('LoggedPDOStatement', array()));
Aqui, uma implementação do decorador da DOP mencionada:
class LoggedPDOStatement {
function __construct ($stmt) {
$this->stmt = $stmt;
}
function execute ($params = null) {
$result = $this->stmt->execute ($params);
if ($this->stmt->errorCode() != PDO::ERR_NONE):
$errors = $this->stmt->errorInfo();
$this->paint ($errors[2]);
endif;
return $result;
}
function bindValue ($key, $value) {
$this->values[$key] = $value;
return $this->stmt->bindValue ($key, $value);
}
function paint ($message = false) {
echo '<pre>';
echo '<table cellpadding="5px">';
echo '<tr><td colspan="2">Message: ' . $message . '</td></tr>';
echo '<tr><td colspan="2">Query: ' . $this->stmt->queryString . '</td></tr>';
if (count ($this->values) > 0):
foreach ($this->values as $key => $value):
echo '<tr><th align="left" style="background-color: #ccc;">' . $key . '</th><td>' . $value . '</td></tr>';
endforeach;
endif;
echo '</table>';
echo '</pre>';
}
function __call ($method, $params) {
return call_user_func_array (array ($this->stmt, $method), $params);
}
}
/var/log/mysql/*
. Os parâmetros vinculados ao PDO não podem causar erros de sintaxe, portanto, tudo o que você precisa é da consulta SQL preparada.