2010-12-31 25 views
23

Tôi đang sử dụng MySQL với Zend Framework & thuyết 2. Tôi nghĩ rằng ngay cả khi bạn không sử dụng Doctrine 2, bạn sẽ được làm quen với các lỗi nhưLàm thế nào để gỡ rối các truy vấn MySQL/Doctrine2?

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

Vấn đề là tôi không thấy truy vấn đầy đủ. Nếu không có một khuôn khổ ORM, tôi có thể có thể lặp lại sql một cách dễ dàng, nhưng với một khung công tác, làm thế nào tôi có thể tìm ra SQL mà nó đang cố thực thi? Tôi thu hẹp lỗi xuống

$progress = $task->getProgress(); 

$progress được khai báo

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

Trong MySQL, lớp nhiệm vụ trông giống như

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$$ 
+0

Nếu bạn có một đối tượng truy vấn Doctrine, đó là không rõ ràng trong các mã bạn đã đăng, bạn có thể chạy '$ query-> getSqlQuery() 'để xem SQL. Tìm đối tượng truy vấn của bạn trong mã của bạn và xuất nó để xem những gì đang diễn ra. Hoặc bạn có thể bật đăng nhập truy vấn trong SQL để xem nó là gì. – thetaiko

Trả lời

6

thế nào về việc sử dụng mysql general query log?

Nhật ký truy vấn chung là bản ghi chung về những gì mysqld đang làm. Máy chủ ghi thông tin vào nhật ký này khi các máy khách kết nối hoặc ngắt kết nối và nó ghi lại mỗi câu lệnh SQL nhận được từ các máy khách. Nhật ký truy vấn chung có thể rất hữu ích khi bạn nghi ngờ lỗi trong ứng dụng khách và muốn biết chính xác những gì khách hàng đã gửi tới mysqld.

+0

Tôi không thể bật nó trong CLI bằng '--general_log = 1 --general_log_file =" ... "' nhưng tôi đã quản lý trong MySQL bằng 'SET global general_log = 'ON'' –

2

Cố gắng sử dụng Mysql proxy giữa bạn và máy chủ MySQL (http://forge.mysql.com/wiki/MySQL_Proxy). Sau đó, bạn có thể cấu hình proxy này để đăng nhập tất cả các yêu cầu.

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

+0

Liên kết bị hỏng, http://mysql.stu.edu.tw/tech-resources/articles/proxy-gettingstarted.html – Tony

+1

Cảm ơn, đã khắc phục. Thay vào đó, bạn có thể thử chỉnh sửa, nó sẽ được xem xét nếu bạn không có đủ danh tiếng để chỉnh sửa trực tiếp. – regilero

77

giải pháp đơn giản nhất cho các truy vấn gỡ rối trong Học thuyết 2:

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

Cách này không hoạt động đối với tôi, Tôi phải gọi nó như thế này: $ em-> getConnection() -> getConfiguration() -> setSQLLogger ( new Doctrine \ DBAL \ Logging \ EchoSQLLogger()); – dimirc

+3

Đây phải là câu trả lời được chấp nhận. – flu

+1

Đây là câu trả lời hay nhất ở đây. – skrilled

12

Bạn phải sử dụng một DBAL SQLLogger. Bạn có thể sử dụng bản ghi cơ bản SQL Logger \ Doctrine \ DBAL \ Logging \ EchoSQLLogger hoặc bạn có thể triển khai thực hiện của mình bằng giao diện Doctrine \ DBAL \ Logging \ SQLLogger.

Đối với trình ghi nhật ký cơ bản, bạn phải đính kèm Trình ghi nhật ký SQL vào EntityManager. Vì vậy, trong học thuyết của mình bootstrap sử dụng file:

$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); 

Lưu ý rằng chúng tôi tạo EntityManager của chúng tôi từ mảng $ connectionParams.

Quan trọng:. Nếu bạn sử dụng một kết nối DBAL để tạo EntityManager, bạn phải đính kèm nó trong cả hai, kết nối DBAL và ORM EntityManager.Ví dụ, trong Zend Framework,

Bạn làm điều này:

$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); 
1

Nếu bạn đang phát triển trong ZF2 bạn có thể eithe r sử dụng các giải pháp trên được đăng bởi beberlei, mặc dù điều này không echo nó ra màn hình của bạn mà không phải là chính xác thực hành tốt nhất nhưng hữu ích.

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

hoặc bạn có thể sử dụng ZendDeveloperTools hiển thị truy vấn thực thi trên thanh công cụ.

enter image description here

1

Có lẽ bạn nên sử dụng một Zend_Db_Profile trong [phát triển] môi trường của bạn.

Thao tác này sẽ ghi lại các truy vấn của bạn bằng thời gian chạy và các thông tin khác.

Nếu bạn có nhật ký lỗi ghi nhật ký ngoại lệ của bạn, thì mọi thứ có thể được tìm thấy trong tệp nhật ký của bạn.

Xem liên kết này: Zend Enable SQL Query logging

Cũng thấy điều này Zend Framework Helper: https://github.com/jokkedk/ZFDebug

Các vấn đề liên quan