0

「inventory」と「inventory_type」という 2 つのテーブルがあります。「inventory」テーブルにはその名前とタイプが格納され、「inventory_type」テーブルには RAM、CPU などのタイプ名とソート順が格納されます。以前に JOINS を使用したことがなく、どのタイプを使用すればよいかわかりませんが、次のコードではどれも機能しないようです。

副次的な質問として、以下のコードでは、「inventory」が左側のテーブルになりますか、それとも「inventory_type」が左側に結合されますか?

function getInventoryOptions($db, $default_value, $datacenter)
{
    $query = "SELECT inventory.id, inventory.name, inventory_type.short_name
                FROM inventory LEFT JOIN inventory_type
                ON inventory.type = inventory_type.id WHERE inventory.datacenter = " . $datacenter . " ORDER BY inventory_type.sort_order ASC";

    $result = mysql_query($query, $db);

    echo '<option value="">None</option>';

    if ($result)
    {
        while($row = mysql_fetch_array($result))
        {
            $id = $row["inventory.id"];
            $name = $row["inventory.name"];
            $type = $row["inventory_type.short_name"];

            if ($default_value == $id)
            {
                echo '<option selected value="' . $id . '">' . $type . ": " . $name . '</option>';
            }
            else
            {
                echo '<option value="' . $id . '">' . $type . ": " . $name . '</option>';
            }
        }
    }
}
4

2 に答える 2

2

問題はここにあると思います:

$id = $row["inventory.id"];
$name = $row["inventory.name"];
$type = $row["inventory_type.short_name"];

試す:

$id = $row['id'];
$name = $row['name'];
$type = $row['short_name'];

* mysql 拡張機能は現在非推奨であり、将来的に削除されることに注意してください。それは、古いものであり、悪い慣行に満ちており、最新の機能がいくつか欠けているためです。新しいコードを書くために使用しないでください。代わりにPDOまたはmysqli_*を使用してください。

アップデート

mysqli の関数に相当するものは次のとおりです。

function getInventoryOptions($db, $default_value, $datacenter)
{
     $query = "SELECT inventory.id, inventory.name, inventory_type.short_name
               FROM inventory LEFT JOIN inventory_type
               ON inventory.type = inventory_type.id WHERE inventory.datacenter = " . $datacenter . " ORDER BY inventory_type.sort_order ASC";

$link = mysqli_connect("[your_host]","[your_user]","[password]","[database]") or die("Error " . mysqli_error($link));



//execute the query.

$result = $link->query($query);

//display information:

while($row = mysqli_fecth_array($result)) {

        $id = $row['id'];
        $name = $row['name'];
        $type = $row['short_name'];

        if ($default_value == $id)
        {
            echo '<option selected value="' . $id . '">' . $type . ": " . $name . '</option>';
        }
        else
        {
            echo '<option value="' . $id . '">' . $type . ": " . $name . '</option>';
        }
} 
于 2013-09-30T09:42:27.970 に答える
0

inventory.type列がnot null(確認してください)であると仮定すると、 LEFT JOIN. AINNER JOINがそのトリックを行います。

連想配列のみが必要なため、 のmysql_fetch_assoc()代わりに使用を検討するmysql_fetch_array()か、2 番目のパラメーターとして指定MYSQL_ASSOCします。

さらに、移植するmysqliか、PDO完全に移植することを検討してください (他の人の回答を参照してください)。

返される連想配列のキーは、テーブル名部分のない単純なフィールド名です。

最後に、副次的な質問ですが、はい、inventory左のテーブルになり、テーブルに対応するレコードがあるかどうかに関係なく、そのすべてのレコードが結果に参加しinventory_typeます。

于 2013-09-30T10:18:17.863 に答える