2012-06-08 48 views
0

我正在爲MySQL數據庫做一個PHP前端。我有一個名爲「Regions」的表,其中包含RegionID(int),Name(字符串)和Country(字符串)。我試圖將一個<選擇>列表到包含所有區域作爲選項的表單上,使用<optgroup>的按國家分組地區。我已經通過嵌套的普通查詢成功地完成了它,現在我正在努力讓自己的頭腦準備好準備好的語句。'無效的對象或資源'與bind_param

到目前爲止,我已經得到了什麼是:

// $DB is database object, already connected 
// Error checking will be worked into this once I've worked out the basics... 

$stmt_country = $DB->stmt_init(); 
$stmt_country->prepare("SELECT DISTINCT Country FROM Regions ORDER BY Country ASC"); 
$stmt_country->execute(); 
$stmt_country->bind_result($CountryName); 

$stmt_region = $DB->stmt_init(); 
$stmt_region->prepare("SELECT RegionID,Name FROM REGIONS WHERE Country=? ORDER BY Name ASC"); 
$stmt_region->bind_param("s",$CountryName); 

echo "<select name=\"RegionID\">\n"; 

while ($stmt_country->fetch()) { 
    // Start 'country' option group 

    echo "<optgroup label=\"$CountryName\">\n"; 

    // Execute the 'regions' query using the 'country' parameter 

    $stmt_region->execute(); 
    $stmt_region->bind_result($RegionID,$RegionName); 

    while ($stmt_region->fetch()) { 
     // Output the regions matching that country 

     echo "<option value=\"$RegionID\">$RegionName</option>\n"; 
     } 

    echo "</optgroup>\n"; 
    } 

echo "</select>\n"; 

然而,當我運行此我得到:

Warning: mysqli_stmt::bind_param(): invalid object or resource 
$stmt_region->bind_param("s",$CountryName)

隨着一些註釋掉的代碼,我的工作(即產出只是optgroups每個國家),然後在$CountryName值bodging得到的只是它的一半$stmt_country$stmt_region一半它的工作原理本身,但我無法讓兩個人一起工作。有人可以告訴我哪裏出錯了嗎?

+0

出於興趣,如果跳過'stmt_init()'調用並執行'$ stmt_region = $ DB-> prepare(「SELECT ...」);'? – DaveRandom

+0

您可以添加一些調試'print'語句來顯示'$ CountryName'的值在第二個查詢中依賴於它之前是否已正確設置? – sarnold

+0

@DaveRandom - 我也想過。我通過複製我發現的示例和教程來學習,一些使用stmt_init(),一些則不使用。如果我調用stmt_init或不是有什麼區別? – Iain

回答

0

我很確定你不能在同一個連接資源上綁定2個staments,直到你完成了整個結果集。因爲你的第二個stmt_init()實際上沒有返回一個聲明。

它看起來像所有的數據是在同一張桌子上,所以不需要2個查詢。

如果數據是在兩個表則仍然會有不需要2個查詢,奧尤可以使用連接:

你能做什麼,以及甚至應該做的,如果不是這種情況下使用參加一次得到的一切:

SELECT DISTINCT r.RegionID, r.Country 
FROM Regions r, Country c 
WHERE c.NAME = r.Country 
ORDER BY r.Country ASC 

在這兩種情況下,你可以得到一個reult集看起來像:

RegionID Country Name 
---------------------------------- 
1   US   Ohio 
2   US   California 
3   US   New York 
4   CN   Guan Dong 
5   CN   Hunan 
6   CN   Szechuan 

由於訂貨,你可以使用一個循環比較的預向當前確定Country以確定何時關閉/打開您的選擇組標記。

+0

謝謝,我沒有意識到,直到第一個結果被提取後才能夠進行第二個查詢。在第一個查詢中設置第二個查詢之前,我已經使用了$ Countries = get_result(),並從中獲取結果,而不是從$ stmt_country中獲取結果。 – Iain

+0

你能舉一個比較以前的國家來確定optgroup標籤的最後一點嗎?對不起,隨着這件事的發展,我正在撿拾點東西! – Iain

+0

其實,忽略最後一條評論,昨晚已經晚了,今天早上我已經把頭轉過去了。謝謝你的幫助! – Iain