Hata ayıklama amacıyla PDO muafiyetlerini yakalamak için çözüm ile yaşadım sorun sadece PDO muafiyetlerini (duh) yakaladı, ancak php hataları olarak kaydedilen sözdizimi hatalarını yakalamadığıdır (bunun neden olduğundan emin değilim, ama " neden "çözümle alakasızdır). Tüm PDO çağrıları, tüm tablolarla tüm etkileşimlerim için genişlediğim tek bir tablo modeli sınıfından geliyor ... hata ayıklamaya çalıştığımda bu karmaşık şeyler, çünkü hata yürütme çağrımın olduğu php kod satırını kaydederdi aradım, ama aslında çağrının nereden yapıldığını söylemedi. Bu sorunu çözmek için aşağıdaki kodu kullandım:
/**
* Executes a line of sql with PDO.
*
* @param string $sql
* @param array $params
*/
class TableModel{
var $_db; //PDO connection
var $_query; //PDO query
function execute($sql, $params) {
//we're saving this as a global, so it's available to the error handler
global $_tm;
//setting these so they're available to the error handler as well
$this->_sql = $sql;
$this->_paramArray = $params;
$this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->_query = $this->_db->prepare($sql);
try {
//set a custom error handler for pdo to catch any php errors
set_error_handler('pdoErrorHandler');
//save the table model object to make it available to the pdoErrorHandler
$_tm = $this;
$this->_query->execute($params);
//now we restore the normal error handler
restore_error_handler();
} catch (Exception $ex) {
pdoErrorHandler();
return false;
}
}
}
Yani, yukarıdaki kod İKİ PDO istisnaları VE php sözdizimi hatalarını yakalar ve aynı şekilde davranır. Hata işleyicim şöyle görünür:
function pdoErrorHandler() {
//get all the stuff that we set in the table model
global $_tm;
$sql = $_tm->_sql;
$params = $_tm->_params;
$query = $tm->_query;
$message = 'PDO error: ' . $sql . ' (' . implode(', ', $params) . ") \n";
//get trace info, so we can know where the sql call originated from
ob_start();
debug_backtrace(); //I have a custom method here that parses debug backtrace, but this will work as well
$trace = ob_get_clean();
//log the error in a civilized manner
error_log($message);
if(admin(){
//print error to screen based on your environment, logged in credentials, etc.
print_r($message);
}
}
Herkes hata işleyiciye ilgili bilgi almak için tablo değişkeni bir genel değişken olarak ayarlamak daha iyi bir fikir varsa, duymak ve kodumu düzenlemek için mutlu olurdu.
/var/log/mysql/*
. PDO bağlı parametreler sözdizimi hatalarına neden olamaz, bu yüzden tek ihtiyacınız olan hazırlanmış SQL sorgusu.