Php. PDO. Как просмотреть запрос?


После недель работы в фреймворке очень странно писать код на чистом 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().

, ,

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *