0

我有两个表,“inventory”和“inventory_type”。“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 扩展,并将在将来的某个时候将其删除。那是因为它很古老,充满了不良做法,缺乏一些现代特征。不要用它来编写新代码。请改用PDOmysqli_*

更新

这是你在 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(),或指定MYSQL_ASSOC为第二个参数。

此外,考虑移植到mysqliPDO完全移植(参见其他人的回复)。

返回的关联数组的键是纯字段名称,没有表名部​​分。

最后,对于您的附带问题,是的,inventory将是左表,其所有记录都参与结果,无论表中是否有相应的记录inventory_type

于 2013-09-30T10:18:17.863 回答