2010-08-14 28 views
5

Tôi gặp vấn đề lạ khi sử dụng Zend Framework và Mysql. Tôi tạo ra một truy vấn:Lỗi Zend PDO - làm cách nào tôi có thể gỡ lỗi?

SELECT events.idUser, szForename, szLastname, readers.szName, idZoneFrom, events.dtTime FROM events, users, readers WHERE events.idUser = users.idUser AND events.idReader = readers.idReader AND dtTime >= '2010:02:15 0:00:00' AND dtTime < '2010:02:16 0:00:00' ORDER BY dtTime 

Truy vấn làm việc ok nếu tôi chạy nó trong một số giao diện điều khiển như PMA, Navicat hoặc khách hàng vỏ nhưng khi tôi cố gắng chạy nó sử dụng một mô hình mà kéo dài Zend_Db_Table bằng khen

$arResult = $this->getDefaultAdapter()->query($szQuery)->fetchAll(); 

nó đi với 1064 lỗi:

enter code here 

An error occurred 
Application error 
Exception information: 

Message: 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 '' at line 1 
Stack trace: 

#0 C:\xampp\htdocs\projekty\doors2\library\Zend\Db\Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array) 
#1 C:\xampp\htdocs\projekty\doors2\library\Zend\Db\Adapter\Abstract.php(468): Zend_Db_Statement->execute(Array) 
#2 C:\xampp\htdocs\projekty\doors2\library\Zend\Db\Adapter\Pdo\Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECT zoneName...', Array) 
#3 C:\xampp\htdocs\projekty\doors2\application\models\Zones.php(24): Zend_Db_Adapter_Pdo_Abstract->query('SELECT zoneName...') 
#4 C:\xampp\htdocs\projekty\doors2\application\models\Events.php(87): Application_Model_Zones->getZoneInfo(NULL) 
#5 C:\xampp\htdocs\projekty\doors2\application\controllers\IndexController.php(52): Application_Model_Events->getEventsList(NULL, '02/15/2010') 
#6 C:\xampp\htdocs\projekty\doors2\library\Zend\Controller\Action.php(513): IndexController->eventsAction() 
#7 C:\xampp\htdocs\projekty\doors2\library\Zend\Controller\Dispatcher\Standard.php(295): Zend_Controller_Action->dispatch('eventsAction') 
#8 C:\xampp\htdocs\projekty\doors2\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) 
#9 C:\xampp\htdocs\projekty\doors2\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch() 
#10 C:\xampp\htdocs\projekty\doors2\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run() 
#11 C:\xampp\htdocs\projekty\doors2\public\index.php(26): Zend_Application->run() 
#12 {main} 

Request Parameters: 

array (
    'controller' => 'index', 
    'action' => 'events', 
    'module' => 'default', 
    'idUser' => '0', 
    'dt' => '02/15/2010', 
) 

Làm thế nào tôi có thể gỡ lỗi nó để tìm ra vấn đề ?? Hoặc có thể bạn biết tôi có thể làm gì sai?

ps. Tôi sử dụng cùng một người dùng db cho cả thử nghiệm php và truy vấn ...

+1

Vui lòng đăng truy vấn SQL bắt đầu bằng 'SELECT zoneName ...', có vẻ truy vấn đó là nguyên nhân của lỗi, không phải truy vấn được đăng –

+0

Yup, tôi vừa tìm thấy lỗi trong vòng lặp hoạt động trên tập kết quả. Chỉ một sai lầm ngớ ngẩn trong tên thông số đã cho tôi thay vì id. Dù sao, cảm ơn sự giúp đỡ. :) – Moby04

Trả lời

2

Câu lệnh SQL của bạn có các từ dành riêng, như tôi có thể thấy. Bạn nên cố gắng để xây dựng conection của bạn để nó có thể tự động thoát khỏi định danh hoặc bạn nên làm điều đó tự của bạn, bằng tay. Đối với tùy chọn đầu tiên, hãy thử điều này:

$options = array(Zend_Db::AUTO_QUOTE_IDENTIFIERS => false); 
    $params = array(
     'host'   => 'host', 
     'username'  => 'user', 
     'password'  => 'secret', 
     'dbname'   => 'db', 
     'options'  => $options 
); 
    $db = Zend_Db::factory('Pdo_Mysql', $params); 
0

Nếu bạn chia truy vấn thành nhiều dòng, bạn có thể nhận được số dòng hữu ích hơn cho lỗi cú pháp. Đây là cách tôi định dạng truy vấn của mình. Nó làm cho chúng dễ dàng hơn nhiều để đọc, duy trì và gỡ lỗi.

SELECT 
    events.idUser, 
    szForename, 
    szLastname, 
    readers.szName, 
    idZoneFrom, 
    events.dtTime 
FROM events, 
    users, 
    readers 
WHERE events.idUser = users.idUser 
    AND events.idReader = readers.idReader 
    AND dtTime >= '2010:02:15 0:00:00' 
    AND dtTime < '2010:02:16 0:00:00' 
ORDER BY dtTime 
0

Ngoài ra, đối với quyền, mysql sử dụng hệ thống cấp phép người dùng + máy chủ lưu trữ. Vì vậy, một người dùng nào đó có thể có quyền truy cập vào một tài nguyên cơ sở dữ liệu từ localhost, nhưng không phải từ các hệ thống khác.

Kiểm tra http://dev.mysql.com/doc/refman/5.0/en/grant.html để biết thông tin về cách thay đổi quyền người dùng mysql.

0

Nếu bạn đang sử dụng zend, ít nhất bạn nên chuẩn bị bất kỳ giá trị nào được truyền vào. Nếu câu lệnh hoạt động trong dòng lệnh thì không có vấn đề gì với các từ dành riêng (trừ một số lý do các phiên bản của mysql) khác biệt, tất nhiên).

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