1

MySQL データベースの PHP フロントエンドを作成しています。RegionID (int)、Name (文字列)、および Country (文字列) を含む "Regions" というテーブルがあります。<optgroup> を使用して国ごとに地域をグループ化して、すべての地域をオプションとして含むフォームに <select> リストを配置しようとしています。私はネストされた単純なクエリによってすでに成功しており、今は準備されたステートメントについて頭を悩ませようとしています。

私がこれまでに持っているものは次のとおりです。

// $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)

コードからコメントアウトすると、$stmt_country半分だけが機能し (つまり、各国の optgroup のみを出力します)、 の値を差し込むと$CountryName$stmt_region半分は単独で機能しますが、取得できません。両方の半分が一緒に働いています。誰かが私がどこで間違っているのか教えてもらえますか?

4

1 に答える 1

0

結果セット全体を処理するまで、同じ接続リソースに 2 つのステートメントをバインドすることはできないと確信しています。そのため、2 番目stmt_init()は実際にはステートメントを返しません。

すべてのデータが同じテーブルにあるように見えるので、2 つのクエリは必要ありません。

データが 2 つのテーブルにある場合でも、oyu は結合を使用できるため、2 つのクエリは必要ありません。

できること、そうでない場合でもすべきことは、結合を使用してすべてを一度に取得することです。

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

どちらの場合でも、次のような結果セットを取得できます。

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

順序付けにより、以前と現在を比較する単一のループを使用してCountry、opt グループ タグを閉じる/開くタイミングを決定できます。

于 2012-06-08T23:36:59.437 に答える