我正在使用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」作爲顯示在下面的屏幕截圖:
一些分析:
- 這似乎沒有問題與我的SQL,因爲當我嘗試從mysql命令行的相同查詢 我可以得到正確的結果。
- 這隻發生在我加入這兩張桌子時。如果我簡單地查詢「事件」表,我可以在該Drupal頁面中獲得正確的結果顯示。
- 將SQL從獨立PHP腳本通過PDO傳遞到數據庫時,沒有任何問題。
- 我從Drupal的論壇瞭解到Drupal核心中沒有使用Date類型。所以它可能會或可能不會得到很好的支持。
因爲調試不是直截了當的,所以我決定不再去追求它。解決這個bug最簡單的方法是使用VARCHAR(10)來存儲日期信息。通過簡單的改變,我的網頁就能正常工作。當然,我將失去使用任何與日期相關的功能的能力。
Drupal使用'db_query'代理一切直接到PDO,所以不,它不是數據庫層。但是,爲什麼要串聯字符串來生成SQL,而不是實際使用抽象層? – Clive
我只是儘量保持我在這裏發佈的代碼儘可能短。將SQL編碼爲字符串問題? – macelee
所以這不是導致問題的實際代碼?或者你也運行了這個代碼片段,它會產生相同的問題,並且你在整個項目中使用了「正確的」代碼,但是它們會產生相同的結果?還有別的嗎? – Clive