2010-01-19 2 views
0

php를 사용하여 db에서 일부 레코드를 가져오고 "No results found"를 반환합니다. 하지만, 화면에 쿼리를 인쇄하고 복사하여 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

+0

Pekka님께 서 편집 한 답변이 정확합니다.드루팔 (Drupal은 문자열 인수로 해석하려고 시도하기 때문에 수동으로'% d' (% b 제외)를 수동으로 이스케이프 처리해야합니다. – loginx

+0

건배 @loginx, 오타 수정. –

4

편집 : 당신은 당신이 드루팔을 사용하고 있다고 언급.

From Drupal's docs on db_query (강조 광산) :

활성 데이터베이스의 기본 쿼리를 실행합니다.

쿼리에 사용자가 제공 한 인수는 SQL 주입 공격을 피하기 위해 적절히 이스케이프 할 수 있도록 별도의 매개 변수로 전달되어야합니다.

유효 유효 수정 자 : % s, % d, % f, % b (이진 데이터, ''로 묶지 않음) 및 %%. 참고 : NULL 및 FALSE 값을 캐스팅 할 구문을 사용하면 0 진수하고, TRUE 값은 드루팔이 쿼리에 %d들로 대체되는 것을

1. 그래서 내 생각은 진수로.

올드 답 :

db_query() 내가 알고 네이티브 PHP/MySQL은/​​mysqli 기능입니다. 데이터베이스 래퍼를 사용하고 있습니까? 그렇다면, 우리는 그 중 하나를 말해 주거나 표준 mysql_*을 대신 사용해야합니다.

모든 설정이 올바른 경우 동일한 결과가 나타납니다.

당신은 확인해야하는 것 :

  • 그것이 자동으로
  • 당신이 확인 mysql_select_db()
  • 를 사용하여 올바른 데이터베이스를 선택하고 있는지 확인 실패 여부를 확인하기 위해 쿼리 후 echo mysql_error(); 추가 당신이 정확한를 사용하는 phpMyAdmin과 스크립트 요청 모두에 대해 동일한 서버 및 사용자 데이터.
+0

나는 Drupal을 사용하고 있는데 이것은 내 모든 쿼리를 수행하는 방법입니다 ... 그래, 네, db가 정확하고 모든 설정이 올바른 것입니다 ... 다른 모든 쿼리는 잘 작동합니다. .. 그리고, mysql_error()에서 어떤 결과도 얻지 못했습니다. – phpN00b

+0

내 편집 된 답변보기. –

관련 문제