Мы используем Doctrine, PHP ORM. Я создаю запрос как этот:
$q = Doctrine_Query::create()->select('id')->from('MyTable');
а затем в функцию, которую я добавляю в различные предложения where и тому подобное, как это
$q->where('normalisedname = ? OR name = ?', array($string, $originalString));
Позже, перед- execute()
этим объектом запроса, я хочу распечатать исходный SQL-код, чтобы изучить его, и сделать это:
$q->getSQLQuery();
Однако это только печатает подготовленный оператор, а не полный запрос. Я хочу посмотреть, что он отправляет в MySQL, но вместо этого он печатает подготовленный оператор, в том числе ?
и. Есть ли способ увидеть «полный» запрос?
Ответы:
Doctrine не отправляет «реальный запрос SQL» на сервер базы данных: оно фактически использует подготовленные операторы, что означает:
$query->getSql()
)$query->getParameters()
)Это означает, что на стороне PHP никогда не бывает «реального» SQL-запроса, поэтому Doctrine не может его отобразить.
источник
$query->getParameters();
НЕ будет возвращать параметры в правильном порядке, так как они должны отображаться в подготовленном операторе запросаРабочий пример:
источник
Вы можете проверить запрос, выполненный вашим приложением, если вы регистрируете все запросы в mysql:
http://dev.mysql.com/doc/refman/5.1/en/query-log.html
будет больше запросов, не только тот, который вы ищете, но вы можете grep для него.
но обычно
->getSql();
работаетРедактировать:
для просмотра всех запросов MySQL, которые я использую
и добавьте эти 2 строки:
и перезапустите MySQL
источник
Я создал Doctrine2 Logger, который делает именно это. Он «гидратирует» параметризованный SQL-запрос со значениями, используя собственные типы данных Doctrine 2.
Пример использования :; Следующий фрагмент кода будет отображаться при стандартном выводе любых предложений SQL INSERT, UPDATE, DELETE, сгенерированных с помощью $ em Entity Manager,
источник
getSqlQuery()
технически показывает всю команду SQL, но это гораздо полезнее, когда вы также можете видеть параметры.Чтобы сделать этот шаблон более пригодным для повторного использования, в комментариях к Raw SQL из Doctrine Query Object описан хороший подход .
источник
$q
. Кажется, это не запрос и не конструктор запросов.$q
в данном случае это запрос Doctrine 1. Возможно, вы используете Doctrine 2, и в этом случае вам понадобится что-то вроде$qb = $this->createQueryBuilder('a'); $q = $qb->getQuery(); $sql = $q->getSQL(); $params = $q->getParameters();
Надеюсь, что это поможет!Другого реального запроса не существует, так работают подготовленные операторы. Значения связаны на сервере базы данных, а не на уровне приложения.
Смотрите мой ответ на этот вопрос: как проверить окончательный параметризованный запрос SQL в PHP с PDO?
(Повторяется здесь для удобства :)
источник
Мое решение:
Пример использования:
источник
Вы можете легко получить доступ к параметрам SQL, используя следующий подход.
Таким образом, если вы распечатали
$param_values
и$col_names
, вы можете получить значения параметров, проходящие через sql и соответствующие имена столбцов.Примечание: если
$param
возвращает массив, вам нужно повторить, так как параметры внутриIN (:?)
обычно поступают как вложенный массив.А пока, если вы нашли другой подход, пожалуйста, будьте любезны поделиться с нами :)
Спасибо!
источник
Более четкое решение:
источник
источник
Ты можешь использовать :
Если вы используете MySQL, вы можете использовать Workbench для просмотра запущенных операторов SQL. Вы также можете использовать просмотр текущего запроса из mysql, используя следующее:
источник
Может быть, это может быть полезно для кого-то:
источник
TL; DR
в файлах веток используйте фильтры помощников Doctrine:
Объяснение:
Другие ответы, в которых говорится, что подготовленный оператор на самом деле являются «реальными запросами», верны, но они не отвечают очевидным ожиданиям запрашивающего ... Каждый разработчик хочет отобразить «выполняемый запрос» для отладки (или отобразить его пользователю) ,
Итак, я заглянул в источник профайлера Symfony, чтобы узнать, как они это делают. Часть Доктрины является обязанностью Доктрины, поэтому они создали пакет учений для интеграции с Symfony. Посмотрев на
doctrine-bundle/Resources/views/Collector/db.html.twig
файл, вы узнаете, как они это делают (это может измениться в разных версиях). Интересно, что они создали фильтры веточек, которые мы можем использовать повторно (см. Выше).Чтобы все работало, нам нужно включить ведение журнала для нашего запроса. Есть несколько способов сделать это, и здесь я использую DebugStack, который позволяет регистрировать запросы без фактической их печати. Это также гарантирует, что это будет работать в производственном режиме, если это то, что вам нужно ...
Если вам понадобится дальнейшее форматирование, вы увидите, что они включают в себя некоторый CSS в теге стиля, поэтому просто «украдите» его ^^:
Надеюсь, это поможет ;-)
источник
Я написал простой регистратор, который может регистрировать запросы со вставленными параметрами. Монтаж:
Использование:
источник
источник
Модифицированная функция @dsamblas для работы, когда параметры представляют собой строки даты, например, «2019-01-01», и когда массив передается с использованием IN, например
, Так что делайте все, что написал dsamblas, но замените startQuery на этот или посмотрите различия и добавьте мой код. (если он что-то изменил в своей функции и моя версия не имеет изменений).
Много не тестировал.
источник
Я сделал некоторые исследования по этой теме, потому что я хотел отладить сгенерированный запрос SQL и выполнить его в редакторе SQL. Как видно из всех ответов, это очень техническая тема.
Когда я предполагаю, что исходный вопрос основан на dev-env, в данный момент один очень простой ответ отсутствует. Вы можете просто использовать сборку в Symfony profiler. Просто нажмите на вкладку Doctrine, выделите запрос, который вы хотите проверить. Затем нажмите «просмотреть исполняемый запрос», и вы можете вставить свой запрос непосредственно в редактор SQL.
Более базовый пользовательский интерфейс, но очень быстрый и без отладки кода.
источник
источник
Чтобы распечатать запрос SQL в Doctrine, используйте:
источник