Если вы не можете получить его из самого PDO, рассмотрите возможность использования класса-обертки только для PDOStatement::execute()
, который будет регистрировать запрос и значения SQL, а затем вызвать execute()
в операторе. Вы должны будете реорганизовать свой код, чтобы использовать новый класс.
В качестве идентификатора я вижу, что PDOStatement имеет переменную класса $queryString
, которая содержит используемый запрос. Значения должны быть получены из того, что было передано в execute()
или bindParam()
.
Сначала некоторые полезные функции для ведения журнала:
//removes newlines and extra spaces from print_r output
function str_squeeze($str) {
if (is_array($str)) {
$str = print_r($str, true);
}
$str = preg_replace('/[(\r)?\n|\t]/', ' ', $str);
$str = trim(ereg_replace(' +', ' ', $str));
return $str;
}
function logger($str) {
//log it somewhere
}
Вариант 1: класс-оболочка для PDOStatement
class My_PDO_Utils {
public static function execute(PDOStatement &$stm, $values = array()) {
logger("QUERY: " . $stm->queryString . ", values = " . str_squeeze($values)) ;
return $stm->execute($values) ;
}
}
Тогда ваш код должен быть:
$stm = $db->prepare("SELECT * FROM table2 WHERE id = ?") ;
$res = My_PDO_Utils::execute($stm, array(79)) ;
вместо
$res = $stm->execute(array(79)) ;
Подумав немного об этом, вы можете сделать еще один шаг:
Вариант 2: расширение PDO и PDOStatement
Если вы хотите быть авантюрным, вы можете расширить PDOStatement, чтобы сделать запись для вас, и PDO, чтобы вернуть расширенный класс PDOStatement. Это потребует наименьшего возможного рефакторинга, то есть просто измените new PDO()
на new MY_PDO()
, но может оказаться сложным в его реализации, поскольку вам потребуется явно определить любую функциональность PDOStatement, которая вам нужна в MY_PDOStatement, чтобы он вызывался правильно.
class My_PDO extends PDO {
public function prepare($sql, $options = array()) {
//do normal call
$stm = parent::prepare($sql, $options) ;
//encapsulate it in your pdostatement wrapper
$myStm = new My_PDOStatement() ;
$myStm->stm = $stm ;
return $myStm ;
}
}
class My_PDOStatement extends PDOStatement {
/**
*
* @var PDOStatement
*/
public $stm ;
public function execute($values) {
logger("QUERY: " . $this->stm->queryString . ", values = " . str_squeeze($values)) ;
return $this->stm->execute($values) ;
}
public function fetchAll($fetch_style = PDO::FETCH_BOTH, $column_index = 0, $ctor_args = array()) {
return $this->stm->fetchAll($fetch_style, $column_index, $ctor_args) ;
}
}
Но теперь ваш код может быть:
$db = new My_PDO($dsn, $user, $pass) ;
$stm = $db->prepare("SELECT * FROM table2 WHERE id = ?") ;
$res = $stm->execute(array(79)) ;
$row = $stm->fetchAll() ;