В PHP с PDO, как проверить заключительный SQL параметризованный запрос? [дубликат]

Я думаю, что Java мог бы быть хорошим выбором просто, потому что можно сделать графический интерфейсы пользователя легко и видеть, "что происходят прохладные вещи". По той же причине, возможно, любой из языков.NET. Я также услышал хорошие вещи о языках сценариев (Ruby и Python, особенно) для того, чтобы заставлять детей изучить, как программировать.

139
задан JB Hurteaux 24 November 2009 в 18:37
поделиться

6 ответов

Думаю, я наконец-то отвечу на свой вопрос, чтобы получить полное решение для записи. Но я должен поблагодарить Бена Джеймса и Кайласа Баду, которые дали подсказки.

Краткий ответ
Как упоминал Бен Джеймс: НЕТ .
Полный запрос SQL не существует на стороне PHP, потому что запрос с токенами и параметры отправляются в базу данных отдельно. Полный запрос существует только на стороне базы данных.

Даже попытка создать функцию для замены токенов на стороне PHP не гарантирует, что процесс замены будет таким же, как и в SQL (такие хитрые штуки, как тип токена, bindValue vs bindParam , ...)

Обходной путь
Здесь я подробно остановлюсь на ответе Кайласа Баду. Регистрируя все SQL-запросы, мы можем увидеть, что действительно выполняется на сервере. В mySQL это можно сделать, обновив my.cnf (или my.ini в моем случае с сервером Wamp) и добавив строку вроде:

log=[REPLACE_BY_PATH]/[REPLACE_BY_FILE_NAME]

Только не запускайте это в производственной среде !!!

55
ответ дан 23 November 2019 в 23:22
поделиться

Использование подготовленных операторов с параметризованными значениями - это не просто еще один способ динамического создания строки SQL . Вы создаете подготовленный оператор в базе данных, а затем отправляете только значения параметров.

Таким образом, то, что, вероятно, будет отправлено в базу данных, будет PREPARE ... , затем SET ... и, наконец, EXECUTE ... .

Вы не сможете получить некоторую строку SQL, например SELECT * FROM ... , даже если это приведет к аналогичным результатам, потому что такой запрос никогда не отправлялся в базу данных.

27
ответ дан 23 November 2019 в 23:22
поделиться

Вы также можете явно обновить ревизию, используя '-r', а затем текущий номер ревизии:

9
ответ дан 23 November 2019 в 23:22
поделиться

То, что я сделал, чтобы напечатать этот фактический запрос, немного сложно, но он работает :)

В методе, который присваивает переменные моему оператору, у меня есть еще одна переменная, которая выглядит примерно так:

$this->fullStmt = str_replace($column, '\'' . str_replace('\'', '\\\'', $param) . '\'', $this->fullStmt);

Где:
$ column - мой токен
$ param - фактическое значение, присвоенное токену
$ this-> fullStmt - мой оператор только для печати с замененными токенами

Он просто заменяет токены значениями, когда происходит настоящее назначение PDO.

Надеюсь, я не запутал вас и, по крайней мере, указал вам правильное направление.

1
ответ дан 23 November 2019 в 23:22
поделиться

Я не верю, что вы можете, но надеюсь, что кто-то докажет, что я неправ.

Я знаю, что вы можете распечатать запрос, и его метод toString покажет вам sql без замен . Это может быть удобно, если вы создаете сложные строки запроса, но не дает полного запроса со значениями.

0
ответ дан 23 November 2019 в 23:22
поделиться

You might be able to use PDOStatement->debugDumpParams. Смотрите документацию по PHP - .

.
26
ответ дан 23 November 2019 в 23:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: