2010-01-19 15 views
0

我正在使用PHP从我的数据库中获取一些记录,它一直返回“没有找到结果”。但是,当我将查询打印到屏幕上并将其复制并粘贴到mysql提示符处时,我得到1行。当然,这是一个怪物查询,但不应该得到相同的结果吗?是什么导致这种情况发生?有什么建议要检查什么?mysql - 在mysql提示符下获取结果,但不通过脚本?

不知道,如果它是有帮助的,但这里的查询:

$q = db_query("SELECT node.nid AS nid, gallery.field_attach_gallery_value AS gallery, 
node.type AS type, node.vid AS vid, ce.field_brochure_link_url AS ce_brochure_url, 
ce.field_brochure_link_title AS ce_brochure_title, 
ce.field_brochure_link_attributes AS ce_brochure_attributes, 
location.field_location_value AS location_field_location_value, 
ce.field_ongoing_value AS ce_field_ongoing_value, 
ce.field_poster_link_url AS ce_poster_url, 
ce.field_poster_link_title AS ce_poster_title, 
ce.field_poster_link_attributes AS ce_poster_attributes, 
ce.field_press_release_link_url AS ce_press_release_url, 
ce.field_press_release_link_title AS ce_press_release_title, 
ce.field_press_release_link_attributes AS ce_press_release_attributes, 
(DATE_FORMAT(STR_TO_DATE(ce.field_start_date_value,'%Y-%m-%dT%T'),'%M %d, %Y %h:%i %p')) AS start, 
(DATE_FORMAT(STR_TO_DATE(ce.field_start_date_value2,'%Y-%m-%dT%T'),'%M %d, %Y %h:%i %p')) AS end, 
ce.field_web_resources_url AS ce_web_resources_url, 
ce.field_web_resources_title AS ce_web_resources_title, 
ce.field_web_resources_attributes AS ce_web_resources_attributes, 
node_revisions.body AS body, 
node_revisions.format AS node_revisions_format, 
node.title AS title 
FROM node node 
LEFT JOIN content_field_attach_gallery gallery ON node.vid = gallery.vid 
LEFT JOIN content_type_exhibitions_and_programs ce ON node.vid = ce.vid 
LEFT JOIN content_field_location location ON node.vid = location.vid 
LEFT JOIN node_revisions node_revisions ON node.vid = node_revisions.vid 
WHERE (node.status <> 0) 
AND (node.type in ('exhibitions_and_programs')) 
AND '2010-01-19' BETWEEN (DATE_FORMAT(STR_TO_DATE(ce.field_start_date_value, '%Y-%m-%dT%T'), '%Y-%m-%d')) 
AND (DATE_FORMAT(STR_TO_DATE(ce.field_start_date_value2, '%Y-%m-%dT%T'), '%Y-%m-%d')) 
ORDER BY (DATE_FORMAT(STR_TO_DATE(ce.field_start_date_value, '%Y-%m-%dT%T'), '%Y-%m-%d')) DESC"); 

$num = FALSE; 

while($r = db_fetch_array($q)) { 
    $num = TRUE; 
    $line = 'ok, found something!'; 
} 

if($num == TRUE) { 
    print $line; 
} else { 
    print 'No records found'; 
} 

回答

0

看来你的db_query()db_fetch_array()是自定义函数。您应该真的var_dump($q)并最终用var_dump(db_fetch_array($q));完全替换您的输出代码以获取有关您的问题的一些调试信息。

+0

var_dump只是给了我:“警告:mysql_fetch_array():提供的参数不是在/usr/local/www/s/drupal-6.14/includes/database.mysql.inc在线160上的有效MySQL结果资源。”, ,我已经知道它没有工作,但是,我不明白为什么它能正常工作,如果我只是在提示符下运行完全相同的查询? – phpN00b 2010-01-19 17:25:54

+0

佩卡的编辑答案是正确的。您需要在查询中手动转义'%d'(而不是%b),因为Drupal可能试图将这些解释为字符串参数。 – loginx 2010-01-19 17:34:09

+0

干杯@loginx,纠正了我的错误。 – 2010-01-19 18:43:10

4

编辑:您发表评论您正在使用Drupal的。

From Drupal's docs on db_query(重点煤矿):

运行在活动数据库中的基本查询。

用户提供的查询参数应该作为单独的参数传递,以便它们可以正确转义以避免SQL注入攻击。

有效%修饰符为:%s,%d,%f,%b(二进制数据,不包含在''中)和%%。 注意:使用此语法会投NULL和FALSE值小数0,真值转换为十进制1

所以我的猜测是,Drupal是在查询免去您%d秒。

老答案:

db_query()没有原生的PHP/MySQL/mysqli的功能,我知道的。你使用数据库包装?如果是这样,你需要告诉我们是哪一个,或者使用标准mysql_*代替。

如果所有设置都正确,则会出现相同的结果。

你应该检查什么:

  • 添加echo mysql_error();查询后,看其是否静静地失败
  • 确保您选择使用mysql_select_db()
  • 正确的数据库确保您正在使用的精确用于phpMyAdmin和脚本请求的相同服务器和用户数据。
+0

我正在使用Drupal,这就是我如何处理所有查询......所以,是的,数据库是正确的,所有的设置都是正确的......我所有的其他查询工作得很好。 ..而且,我没有从mysql_error()获得任何输出 – phpN00b 2010-01-19 17:22:16

+0

请参阅我编辑的答案。 – 2010-01-19 17:26:29