2015-11-07 36 views
0

我正在使用Drupal 7開發動態網頁。我遇到了一個非常奇怪的問題。我已經將我的問題簡化爲一個非常小的測試用例,如下所示:在Drupal開發環境中調試數據庫查詢

數據庫端:我正在使用MySQL。我有兩個表,如下的幾個樣本數據條目定義:

CREATE TABLE people (
    pid INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(30) NOT NULL 
); 
INSERT INTO people VALUES (NULL, 'Joe'); 
INSERT INTO people VALUES (NULL, 'Ant'); 
INSERT INTO people VALUES (NULL, 'Tom'); 

CREATE TABLE event (
    eid INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    pid INT(6) UNSIGNED NOT NULL, 
    event_desc VARCHAR(20) NOT NULL, 
    event_date DATE NOT NULL 
); 
INSERT INTO event VALUES (NULL, 1, '1p', '2015-10-01'); 
INSERT INTO event VALUES (NULL, 2, '1p', '2015-10-12'); 
INSERT INTO event VALUES (NULL, 2, '2p', '2015-10-00'); 
INSERT INTO event VALUES (NULL, 2, '3p', '2015-00-00'); 
INSERT INTO event VALUES (NULL, 3, '1p', '2010-07-18'); 
INSERT INTO event VALUES (NULL, 3, '2p', '2010-09-00'); 

注意這裏唯一有趣的特點是,事件表可能包含不完整的事件日期的「2015-10-00」時的日期格式是未知的,'日期和月份'未知的'2015-00-00'。我明白這在MySQL中是合法的。

Drupal的7方:我創建一個自定義模塊如下:

<?php 
/** 
* Implements hook_menu(). 
*/ 
function test_menu() { 
    $items['test'] = array(
    'type' => MENU_NORMAL_ITEM, 
    'title' => 'Test', 
    'description' => 'Test', 
    'page callback' => '_test_page', 
    'access callback' => TRUE, 
    'menu_name' => 'main-menu', 
); 
    return $items; 
} 

function _test_page() { 
    $output = ""; 
    $sql = "SELECT event.event_desc, event.event_date, people.name FROM event, "; 
    $sql .= "people WHERE event.pid=people.pid ORDER BY people.name"; 
    $result = db_query($sql); 
    foreach ($result as $data) { 
    $output .= $data->name. " ". $data->event_desc. " ". $data->event_date. "<br>\n"; 
    } 
    return $output; 
} 

注意,我創建了一個網頁與菜單項「測試」。該頁面執行查詢並顯示結果。現在很奇怪的部分:當事件的日期是不完整的,查詢得到了錯誤的數據「0000-00-00」作爲顯示在下面的屏幕截圖: enter image description here

一些分析:

  • 這似乎沒有問題與我的SQL,因爲當我嘗試從mysql命令行的相同查詢 我可以得到正確的結果。
  • 這隻發生在我加入這兩張桌子時。如果我簡單地查詢「事件」表,我可以在該Drupal頁面中獲得正確的結果顯示。
  • 將SQL從獨立PHP腳本通過PDO傳遞到數據庫時,沒有任何問題。
  • 我從Drupal的論壇瞭解到Drupal核心中沒有使用Date類型。所以它可能會或可能不會得到很好的支持。

因爲調試不是直截了當的,所以我決定不再去追求它。解決這個bug最簡單的方法是使用VARCHAR(10)來存儲日期信息。通過簡單的改變,我的網頁就能正常工作。當然,我將失去使用任何與日期相關的功能的能力。

+0

Drupal使用'db_query'代理一切直接到PDO,所以不,它不是數據庫層。但是,爲什麼要串聯字符串來生成SQL,而不是實際使用抽象層? – Clive

+0

我只是儘量保持我在這裏發佈的代碼儘可能短。將SQL編碼爲字符串問題? – macelee

+0

所以這不是導致問題的實際代碼?或者你也運行了這個代碼片段,它會產生相同的問題,並且你在整個項目中使用了「正確的」代碼,但是它們會產生相同的結果?還有別的嗎? – Clive

回答

0

'2015-00-00'在mysql中是合法的。我不知道在PHP中是否合法。什麼是$ data-> event_date的數據類型?只要確保以字符串形式打印,而不是格式化的日期。

+0

我嘗試了不同的方法來處理結果集。它看起來不正確的結果已經在結果集中。所以無論我如何處理它,我都會得到相同的錯誤輸出。正如我在我原來的帖子中提到的,如果我查詢「事件」表,我只能得到正確的輸出。所以我用PHP來遍歷結果集的方式不是怪罪。 – macelee