我正在使用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