Возможный дубликат:
Получить (или смоделировать) полный запрос из подготовленного оператора PDO
Я не могу понять, почему мой запрос возвращает 0 строк .. он реализует некоторые очень динамические функции поиска и множество операторов if / loop и т. Д. Поэтому для его отладки я хотел бы ТОЧНО видеть, какая строка отправляется к серверу. Есть ли способ сделать это через PHP?
Может быть, есть способ спросить сервер «что такое последний запрос» или сообщить PDO «показать мне, что вы отправили»?
Я видел один ответ с использованием str_replace
чтобы вручную вводить значения вместо :fieldValue
, но это, вероятно, синтаксическая проблема (или, может быть, это неправильный цикл и т. Д.), С которым этот метод не помогает.
Использование bindValue(":fieldValue", $value);
если это имеет значение.
РЕДАКТИРОВАТЬ
Оказывается, это было просто if ($var="true") { ...
которое должно было быть, if ($var=="true") { ...
PHP Я думаю, это не то же самое, что Java в этом смысле? В любом случае, этот вопрос все еще стоит (поскольку я часто сталкиваюсь с этим). Мне пришлось использовать серию echo "You are Here";
чтобы найти эту ошибку, поскольку она была технически обоснованной, но не правильной. Если бы у меня был последний оператор SQL, я мог бы увидеть «О, мой код добавил, where column = true
, должно быть, прошел неправильный IF …».
Это самый распространенный миф об отладке SQL. «Мне нужно увидеть запрос после подготовки, чтобы узнать, произошла ли ошибка». Дело в том, что нет , и я скажу вам, почему.
После того как запрос был подготовлен, заполнитель может рассматриваться как допустимая строка / целое число . Тебе все равно, что в нем.
Кроме того, если вы правильно настроите PDO, вы получите подробное описание PDOException
котором подробно описывается ошибка, с которой вы столкнулись, и полная обратная связь, где произошла ошибка, плюс вы получаете строку ошибок из MySQL, что очень упрощает синтаксические ошибки найти.
Чтобы включить исключения PDO и отключить эмулированные подготавливает:
$pdo = new PDO("mysql:host=localhost;dbname=database_name", "user", "password"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);