После недель работы в фреймворке очень странно писать код на чистом php. Даже не странно — а как-то непривычно. Только что разбирал код на чистом php и PDO и обнаружил невозможность примитивного вывода текста запроса с учетом подстановки всех параметров.
Итак, как оказалось вывести запрос без учета параметров можно следующей командой:
$pdo->queryString
Но это не решает проблему подстановки параметров. И если Вы не хотите возиться с ручной подстановкой параметров или у Вас большой запрос, или просто их много предлагаю небольшой вариант решения проблемы. На авторство не претендую — пример нашел здесь, но мне он помог — т.е. 100% рабочий код, хоть и костыльный, как по мне.
_debugValues = $values;
try {
$t = parent::execute($values);
// здесь можно добавить логирование успешного запроса
} catch (PDOException $e) {
// здесь можно добавить логирование неуспшного запроса
throw $e;
}
return $t;
}
public function _debugQuery($replaced=true)
{
$q = $this->queryString;
if (!$replaced) {
return $q;
}
return preg_replace_callback('/:([0-9a-z_]+)/i', array($this, '_debugReplace'), $q);
}
protected function _debugReplace($m)
{
$v = $this->_debugValues[$m[1]];
if ($v === null) {
return "NULL";
}
if (!is_numeric($v)) {
$v = str_replace("'", "''", $v);
}
return "'". $v ."'";
}
}
// детальнее об опциях PDO - http://www.php.net/manual/en/pdo.constants.php
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_STATEMENT_CLASS => array('MyPDOStatement', array()),
);
// создаем объект уже с новым классом с $options
$pdo = new PDO($dsn, $username, $password, $options);
// prepare нашего запроса
$query = $pdo->prepare("INSERT INTO mytable (column1, column2, column3)
VALUES (:var1, :var2, :var3)");
// выполнение подготовленного запроса
$query->execute(array(
'var1' => "column1",
'var2' => "column2",
'var3' => "column3"
));
// вывод запроса БЕЗ и С подставленными параметрами
var_dump( $query->queryString, $query->_debugQuery() );
Код прост и требует установки параметров PDO, после чего мы переопределяем класс PDOStatement, расширяя его функционал методом _debugQuery().