2015-11-07 120 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