как посмотреть запрос, обработанный с помощью php PDO? ! - PullRequest
0 голосов
/ 26 июля 2011

Я готовлю свои операторы sql и привязываю к ним параметры, и если что-то идет не так, я ловлю их в блоке catch.Но я хочу посмотреть, какой запрос я обработал.Поэтому я расширил класс PDO (нашел его в интернете, не совсем уверенный, что я делаю или для чего действительно нужен ATTR_STATEMENT_CLASS. Вот код расширения:

<code>class PDOTester extends PDO {
public function __construct($dsn, $username = null, $password = null, $driver_options = array()) {
    parent::__construct($dsn, $username, $password, $driver_options);
    $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('PDOStatementTester', array($this)));
}
}
class PDOStatementTester extends PDOStatement {
protected $connection;

protected function __construct(PDO $connection)
{
    $this->connection = $connection;
}

public function execute() {
    try {
        parent::execute();
    } catch (PDOException $e) {
        $e->errorInfo[3] = $this->queryString;
        echo '<pre>';
        var_dump($this);
        var_dump($this->connection);
        echo '
'; throw $ e;}}}

Но возникает проблема: я использовал именованные параметры для привязки к нему значений, но когда я вижу запрос SQl, я вижу именованные параметры, а не значения!

Например, я использую это как:

try { 
$sql = "INSERT INTO table (column1, column2) VALUES (:column1, :column2)"; 
$stmt = $db->preapre($sql);
$stmt->bindParam(':column1', $column1, PDO::PARAM_STR);
$stmt->bindParam(':column2', $column2, PDO::PARAM_INT);
$stmt->execute();
} catch (PDOException $e) { 
echo $e->errorInfo[3];
}

Но тогда я вижу в качестве значений: column1,: column2, вместо фактических переменных! Может кто-нибудь помочь мне (например, предоставить лучшемодификация используемого расширения)?

PHP версии 5.2.17, MySQL версии 5.0.92

Ответы [ 3 ]

0 голосов
/ 26 июля 2011

Лучшим вариантом было бы включить опцию общего журнала MySQL. Запустите следующее в терминале MySQL (или любой другой предпочтительной программе / приложении, которое вы используете для управления MySQL)

SET GLOBAL general_log = ON;
SET GLOBAL general_log_file = 'path_to_file.log';

Запустите ваш запрос, проверьте файл.

0 голосов
/ 26 июля 2011

Им действительно не нужно было расширять класс PDO, чтобы делать то, что они делали. Просто создайте новый экземпляр, а затем добавьте (или удалите) этот атрибут после создания, а не во время.

При этом существует встроенный способ вывода отладочной информации, относящейся к оператору, и он использует PDOStatement->debugDumpParams. Это не позволит вам увидеть скомпилированную версию (это делается на стороне базы данных для баз данных, которые ее поддерживают), но позволит вам легко увидеть как запрос, так и связанные параметры.

Внимание, не включайте это в реальной системе. Это может дать злоумышленникам вашего сайта большую подсказку о том, как настроена ваша система, и что они могут сделать, чтобы она захватила (и уничтожила или иным образом разрушила).

0 голосов
/ 26 июля 2011

Насколько я знаю, нет никакого способа увидеть фактический запрос при использовании подготовленных операторов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...