Как я вижу окончательный текст запроса, получающегося в результате вызова mysqli-> prepare? - PullRequest
2 голосов
/ 15 апреля 2010

После кода, подобного этому:

$stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
$stmt->bind_param("s", $city);
$stmt->execute();
$stmt->bind_result($district);
$stmt->fetch();
printf("%s is in district %s\n", $city, $district);

Как посмотреть фактический оператор SQL, который был выполнен?

(это должно выглядеть примерно так: «ВЫБЕРИТЕ район из города ГДЕ Имя =« Сими Вэлли »;»)

Я уже понимаю, что в этом упрощенном случае было бы очень легко просто восстановить запрос ... но как я могу получить к нему общий доступ, который будет работать для очень сложных подготовленных операторов, и в случаях, когда я не могу обязательно уже понимаете предполагаемую структуру запроса и т. д. Разве нет какой-либо функции или метода, который можно вызвать для объекта оператора, который будет возвращать фактический текст запроса SQL после привязки?

Ответы [ 2 ]

4 голосов
/ 16 апреля 2010

Когда вы используете подготовленные операторы, отсутствует « SQL-запрос »:

  • Во-первых, у вас есть заявление, которое содержит заполнители
    • Этот оператор отправляется на сервер БД и готовится там
    • , что означает, что оператор SQL проанализирован , проанализирован и что некоторая структура данных, представляющая его, подготовлена ​​в памяти
  • И тогда у вас есть связанные переменные
    • которые отправляются на сервер
    • и подготовленный оператор выполняется - работает с этими данными

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

Итак, нет способа получить подготовленный оператор SQL - так как такого SQL нет .


Если вам нужно просмотреть некоторую информацию для целей отладки, как вы сказали, у вас обычно есть два вида опций:

  • Либо создайте SQL-запрос, который будет соответствовать подготовленной инструкции + привязка вручную .
  • Или выведите код оператора вместе с заполнителями; и список данных
    • Это означает, что у вас не будет реального SQL-запроса, который можно выполнить
    • Но, как правило, этого будет достаточно, чтобы помочь с отладкой
0 голосов
/ 08 декабря 2017

PDO имитирует связывание, если вы установите его так; в этой теме вы можете прочитать об операторе debugDumpParams, который также находится в документации PHP . Однако нет способа проверить правильность подстановки значений, когда вы оставляете это реальному движку SQL; одним из обходных путей может быть SELECT с заполнителями полей, так что в результате вы получите фактические строковые значения:

SELECT :field1 as field1, :field2 as field2

Если вы свяжете и получите этот файл, он будет содержать значения:

Array
(
    [field1] => Lorem ipsum
    [field2] => dolor sit amet
)

Таким образом, вы можете создать свою собственную функцию отладки, которая объединяет исходную строку запроса, используя CONCAT sql - но вы многому из этого не научитесь, поскольку SQL достаточно надежен в отношении привязки параметров:)

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