2010-03-08 61 views
1

所以我有3個數據庫表,除了表名以外,在所有方面都完全相同(數據不同)。我這樣做,所以我可以使用一個代碼段,象這樣一個開關:mysql_fetch_array()問題

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():提供的參數不是一個有效的MySQL結果資源...上線78 78

線是while()底部。我已經檢查並進行了雙重檢查,無法確定問題所在。這裏的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 

有誰看到我在做什麼錯在這裏?我正在通過「用餐」功能,正如我之前所說,交換機中的前兩種情況正常工作。

我敢肯定,這是愚蠢的東西...

+1

一個小竅門:因爲你知道,其他兩個開關情況下工作;提取有問題的代碼並嘗試使用最小的可能的錯誤因素。完成之後,編輯您的答案,以便我們可以專注於代碼中有問題的部分(如果您仍然需要它,那通常是您可以自己查看的方式:))。乾杯。 – chelmertz 2010-03-08 20:43:24

+2

這沒有幫助回答你的問題,但有3個相同的表只是不同的名稱似乎很愚蠢。你可以很容易地使用另一列,例如'type'或'type_id'來區分。另外,'SELECT * ...'是邪惡的。 http://www.parseerror.com/sql/select%2Aisevil.html – 2010-03-08 20:43:52

回答

1

您應該始終將您使用的變量初始化爲某個(空)值,然後在使用它之前檢查它。我的猜測是你的第三種情況(dining)從來沒有得到執行,因爲一些拼寫錯誤的標識符或什麼的。這導致default:運行,之後您的while()將執行。但是,$query未設置爲任何有用的內容。

因此,你應該拋出一個異常或以其他方式打破了default:處理程序的執行。或者,您可以在switch()之前初始化$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 2010-03-08 22:08:06

+0

我能夠使用傳遞給函數 – Marty 2010-03-08 22:13:29

+0

的錯誤att觸發異常。我將我的$ category_query更改爲「SELECT * FROM $ db_name」。 「.categories」,並得到一個錯誤,我的用戶名沒有這個數據庫的權限。糟糕:)噢,謝謝你的幫助,上面的代碼確實使它更好更清潔。乾杯! – Marty 2010-03-08 22:16:49

1

看看你的查詢代碼 - 你運行$bestof_query不管它是否已經被設置爲有效的SQL。我的第一個猜測是,你在某個地方拼錯了'dining'並獲得了默認情況。

此外,仔細檢查您的數據庫名稱是否正確(它們相當複雜)並且所有數據庫都具有相同的權限。你在檢查$db是否屬實?

1

您在該查詢中收到sql錯誤。你應該回應你的mysql錯誤,並檢查它來修復你的查詢。你得到的警告是因爲你正在傳遞一個布爾值爲false的函數給mysql_fetch_assoc(),這個函數期望得到一個結果集。如果有錯誤,mysql_query()返回false。