2010-03-08 6 views
1

그래서 3 개의 DB 테이블은 테이블의 이름을 제외하고 모든면에서 동일합니다 (데이터가 다릅니다). 그래서 내가 지금 같은 스위치를 사용하여 하나의 코드를 사용할 수 있습니다 이런 짓을 :mysql_fetch_array() problem

function disp_bestof($atts) { 
extract(shortcode_atts(array(
    'topic' => '' 
), $atts)); 
$connect = mysql_connect("localhost","foo","bar"); 
    if (!$connect) { die('Could not connect: ' . mysql_error()); } 
switch ($topic) { 
    case "attorneys": 
    $bestof_query = "SELECT * FROM attorneys p JOIN (awards a, categories c, awardLevels l) ON (a.id = p.id AND c.id = a.category AND l.id = a.level) ORDER BY a.category, a.level ASC"; 
    $category_query = "SELECT * FROM categories"; 
    $db = mysql_select_db('roanoke_BestOf_TopAttorneys'); 
    $query = mysql_query($bestof_query); 
    $categoryQuery = mysql_query($category_query); 
    break; 
    case "physicians": 
    $bestof_query = "SELECT * FROM physicians p JOIN (awards a, categories c, awardLevels l) ON (a.id = p.id AND c.id = a.category AND l.id = a.level) ORDER BY a.category, a.level ASC"; 
    $category_query = "SELECT * FROM categories"; 
    $db = mysql_select_db('roanoke_BestOf_TopDocs'); 
    $query = mysql_query($bestof_query); 
    $categoryQuery = mysql_query($category_query); 
    break; 
    case "dining": 
    $bestof_query = "SELECT * FROM restaurants p JOIN (awards a, categories c, awardLevels l) ON (a.id = p.id AND c.id = a.category AND l.id = a.level) ORDER BY a.category, a.level ASC"; 
    $category_query = "SELECT * FROM categories"; 
    $db = mysql_select_db('roanoke_BestOf_DiningAwards'); 
    $query = mysql_query($bestof_query); 
    $categoryQuery = mysql_query($category_query); 
    break; 
    default: 
    $bestof_query = "switch on $best did not match required case(s)"; 
    break; 
} 

$category = ''; 
while($result = mysql_fetch_array($query)) { 
    if($result['category'] != $category) { 
    $category = $result['category']; 
    //echo "<div class\"category\">"; 
    $bestof_content .= "<h2>".$category."</h2>\n"; 
    //echo "<ul>"; 

자,이 모든 일이 처음 두 경우에 대한 완벽한 작동하지만,이 오류와 세 번째 "식사"휴식 :

경고 : mysql_fetch_assoc() : 인수 공급은 78

라인 (78)은 맨 아래에있는 while()입니다 라인에 ... 유효한 MySQL의 결과 리소스 아니다. 나는 체크하고 두 번 체크하고 문제가 무엇인지 알 수 없다. 여기에 '레스토랑'을위한 DB 구조가 있습니다 :

CREATE TABLE `restaurants` (
    `id` int(10) NOT NULL auto_increment, 
    `restaurant` varchar(255) default NULL, 
    `address1` varchar(255) default NULL, 
    `address2` varchar(255) default NULL, 
    `city` varchar(255) default NULL, 
    `state` varchar(255) default NULL, 
    `zip` double default NULL, 
    `phone` double default NULL, 
    `URI` varchar(255) default NULL, 
    `neighborhood` varchar(255) default NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=249 DEFAULT CHARSET=utf8 

내가 여기서 잘못하고있는 것을 누구가 볼 ​​수 있습니까? 함수에 "식사하기"를 전달하고 이전에 말했듯이 스위치의 처음 두 경우가 제대로 작동합니다. 당신은 관계없이 유효한 SQL로 설정되어 있는지의 $bestof_query을 실행 -

나는 쿼리 코드에서

+1

팁 : 당신이 다른 두 스위치의 경우 작동하는지 알고 있기 때문에, 문제가있는 코드를 추출하고 가능한 최소한의 오류 요인으로 시도해보십시오. 코드를 수정 한 후에는 코드의 문제가있는 부분에 집중할 수 있도록 답변을 수정하십시오 (여전히 필요하다면 일반적으로 직접 볼 수있는 방법입니다 :)). 건배. – chelmertz

+2

다른 질문이 있으시면 3 개의 동일한 테이블을 사용하는 것이 어리석은 것처럼 보일 것입니다. 차별화를 위해'type' 또는'type_id '와 같은 다른 열을 사용하면됩니다. 또한,'SELECT * ...'는 악마이다. http://www.parseerror.com/sql/select%2Aisevil.html –

답변

1

항상 사용하는 변수를 (null) 값으로 초기화 한 다음 사용하기 전에 확인해야합니다. 제 생각에 세 번째 경우 (dining)는 일부 맞춤법이 틀린 식별자 때문에 실행되지 않습니다. 이로 인해 default:이 실행되고 그 후에 while()이 실행됩니다. 그러나 $query은 유용한 것으로 설정되지 않습니다.

따라서 예외를 던지거나 그렇지 않으면 default: 처리기에서 실행을 중단해야합니다. 또는 앞에 $query = null;을 초기화하고 $query !== null 일 때만 while() 루프를 수행 할 수 있습니다. 관련 메모에


: 대신 다음 (주의 예외 핸들러)를 사용할 때보다 효율적으로 코드 수 있습니다

$db_name = null; 
$table = null; 
switch ($topic) { 
    case "attorneys": 
    $db_name = 'roanoke_BestOf_TopAttorneys'; 
    $table = 'attorneys' 
    break; 
    case "physicians": 
    $db_name = 'roanoke_BestOf_TopDocs'; 
    $table = 'physicians' 
    break; 
    case "dining": 
    $db_name = 'roanoke_BestOf_DiningAwards'; 
    $table = 'restaurants' 
    break; 
    default: 
    throw new Exception("Unknown topic."); 
    break; 
} 

$bestof_query = "SELECT * FROM $table p JOIN (awards a, categories c, awardLevels l) ON (a.id = p.id AND c.id = a.category AND l.id = a.level) ORDER BY a.category, a.level ASC"; 
$category_query = "SELECT * FROM categories"; 
$db = mysql_select_db($db_name); 
$query = mysql_query($bestof_query); 
$categoryQuery = mysql_query($category_query); 
+0

감사합니다. 코드를 정리하여 간단하게 만들었습니다.그래도 while() 예외가있는 경우에도 mysql_fetch_array 오류가 발생합니다 ... ergh – Marty

+0

나쁜 att를 사용하여 예외를 트리거 할 수 있었기 때문에 함수에 전달했습니다. – Marty

+0

알아 냈습니다. 내 $ category_query를 "SELECT * FROM $ db_name"(으)로 변경했습니다. ".categories"그리고 내 사용자 이름이이 DB에 대한 권한이 없다는 오류가 다시 발생했습니다. 죄송합니다 :) 물론 도움과 위의 코드 덕분에 더 좋고/깨끗하게 만들어졌습니다. 건배! – Marty

1

봐가 ... 그것은 바보 같은 확신합니다. 내 첫 번째 추측은 어딘가에서 'dining'의 철자를 잘못 쓰고 기본 사례를 얻는 것입니다.

또한 데이터베이스 이름이 정확하고 (매우 복잡하며) 모든 데이터베이스가 동일한 권한을 가지고 있는지 다시 확인하십시오. $db이 맞는지 확인 하시겠습니까?

1

해당 쿼리에서 SQL 오류가 발생했습니다. mysql 오류를 에코하여 쿼리를 수정하기 위해 검토해야합니다. 결과 집합을 기다리고있는 mysql_fetch_assoc()에 boolean false를 전달 했으므로 경고가 표시됩니다. mysql_query()는 에러가 있으면 false를 반환한다.