Intereting Posts
Как создать правильный класс расширения mysqli с подготовленными операторами? Настройка маршрутизации поисковой формы Symfony 2 Вставить CDATA в XML Использование действия формы HTML с php-скриптом, находящимся в другом каталоге (относительные пути) Перенаправить на более старую страницу в php? нужна помощь при размещении на стене пользователя PHP: путь для панировки? WordPress preview_post_link последний выбранный вариант после обновления страницы PHP Предупреждение: запуск PHP: невозможно загрузить динамическую библиотеку Никогда не запускайте «композиторское обновление» в производстве, почему? PHP session var достаточно для пользователя auth? PHP Word, отправка сгенерированного файла в браузер в качестве вывода без сохранения его на диске получение ошибки в отображаемых значениях в Xcode из mysql? CodeIgniter не работает с многоуровневыми подпапками для обоих контроллеров и представлений

Как отлаживать запросы MySQL / Doctrine2?

Я использую MySQL с Zend Framework & Doctrine 2. Я думаю, что даже если вы не используете Doctrine 2, вы будете знакомы с ошибками, например

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ASC' at line 1

Проблема в том, что я не вижу полный запрос. Без рамки ORM я, вероятно, мог бы легко откликнуться на sql, но с помощью фреймворка, как я могу узнать, какой SQL он пытается выполнить? Я сузил ошибку до

 $progress = $task->getProgress(); 

$progress объявлен

 // Application\Models\Task /** * @OneToMany(targetEntity="TaskProgress", mappedBy="task") * @OrderBy({"seq" = "ASC"}) */ protected $progress; 

В MySQL класс задач выглядит так:

 CREATE TABLE `tasks` ( `id` int(11) NOT NULL AUTO_INCREMENT, `owner_id` int(11) DEFAULT NULL, `assigned_id` int(11) DEFAULT NULL, `list_id` int(11) DEFAULT NULL, `name` varchar(60) NOT NULL, `seq` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `tasks_owner_id_idx` (`owner_id`), KEY `tasks_assigned_id_idx` (`assigned_id`), KEY `tasks_list_id_idx` (`list_id`), CONSTRAINT `tasks_ibfk_1` FOREIGN KEY (`owner_id`) REFERENCES `users` (`id`), CONSTRAINT `tasks_ibfk_2` FOREIGN KEY (`assigned_id`) REFERENCES `users` (`id`), CONSTRAINT `tasks_ibfk_3` FOREIGN KEY (`list_id`) REFERENCES `lists` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1$$ 

как об использовании общего журнала запросов mysql ?

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

Самое простое решение для отладки запросов в Doctrine 2:

 $em->getConnection() ->getConfiguration() ->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger()) ; 

Вы должны использовать DBAL SQLLogger. Вы можете использовать базовый собственный SQL Logger \ Doctrine \ DBAL \ Logging \ EchoSQLLogger , или вы можете реализовать свой с интерфейсом Doctrine \ DBAL \ Logging \ SQLLogger .

Для основного регистратора вы должны подключить SQL Logger к EntityManager. Итак, в вашем загрузочном файле Doctrine используйте:

 $config = new Doctrine\ORM\Configuration (); // ... config stuff $config->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger()); $connectionParams = array( 'dbname' => 'example', 'user' => 'example', 'password' => 'example', 'host' => 'localhost', 'driver' => 'pdo_mysql'); //make the connection through an Array of params ($connectionParams) $em = EntityManager::create($connectionParams, $config); 

Обратите внимание, что мы создаем наш EntityManager из массива $ connectionParams .

Важно:. Если вы используете соединение DBAL для создания EntityManager, вам необходимо подключить его как к DBAL Connection, так и к ORM EntityManager. Например, в Zend Framework,

Ты делаешь это:

 $config = new Doctrine\ORM\Configuration (); // ...config stuff // LOGGER $config->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger()); // make the connection through DBAL (DriverManager::getConnection) // note that we attach $config in $connApp(DBAL) and $emApp(ORM) $connApp = DriverManager::getConnection($connectionParams, $config); $emApp = EntityManager::create($connApp, $config); Zend_Registry::set('emApp', $emApp); Zend_Registry::set('connApp', $connApp); 

Использовать профайлер Doctrine2 + Firebug

https://github.com/mridgway/ZendX_Doctrine2/

Я написал статью в блоге по этой теме с некоторыми инструкциями по настройке профилирования Doctrine 2 в Zend Framework

ZFDebug уже очень приятный, и для него есть плагин Doctrine 2

http://labs.ultravioletdesign.co.uk/profiling-doctrine-2-with-zend-framework/

Попробуйте использовать прокси Mysql между вами и сервером MySQL ( http://forge.mysql.com/wiki/MySQL_Proxy ). Затем вы можете настроить этот прокси для регистрации всех запросов.

http://mysql.stu.edu.tw/tech-resources/articles/proxy-gettingstarted.html

Если вы развиваетесь в ZF2, вы можете либо использовать решение выше, размещенное beberlei , хотя это и выводит его на экран, что не совсем точно, но полезно.

 $em->getConnection() ->getConfiguration() ->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger()) ; 

или вы можете использовать ZendDeveloperTools, который отображает запрос выполнения на панели инструментов.

введите описание изображения здесь

Возможно, вы должны использовать Zend_Db_Profile в своей [разработке] среде.

Это будет регистрировать ваши запросы с помощью времени выполнения и другой информации.

Если у вас есть журнал ошибок, который регистрирует ваши исключения, все это можно найти в файлах журналов.

См. Эту ссылку: Zend Включить ведение журнала SQL запросов

Также см. Этот помощник Zend Framework: https://github.com/jokkedk/ZFDebug