2

我正在处理产品和类别之间多对多关系的连接表。通过这个特定的函数,我试图接受一个 product_ID 变量并在一个数组中获取所有相关的类别名称。但是,在当前设置下,当我知道有几个产品 ID 有 2 个时,我只能获得每个产品 ID 的一个类别。有什么想法吗?还有人知道一个很好的简单解决方案,可以更直观地跟踪 mysql 中的 M2M 关系吗?

    //输入产品ID,获取相关类别
    功能产品猫($pid){
        全局 $sql;
        $query = "SELECT * FROM Product_Category WHERE Product_ID = '$pid'";
        $result = mysqli_query($sql, $query);
        $catidarray = 数组();
        而($row = mysqli_fetch_array($result)) {
                array_push($catidarray, $row['Category_ID']);
        }

        foreach($catidarray as $i) {
            $query = "SELECT * FROM Categories WHERE Category_ID = '$i'";
            $result = mysqli_query($sql, $query);
            $namearray = 数组();
            而($row = mysqli_fetch_array($result)) {
                array_push($namearray, $row['Name']);
            }

        }

        返回 $namearray;
    }

4

1 回答 1

2

你的功能有问题。

在您的第二次 foreach 中,您将变量$namearray放入循环中,每次运行时都会将其值重置为空数组$namearray = array(); . 只需将其放在 foreach 之外:

//--> put it here
$namearray = array();
foreach($catidarray as $i) {
    $query = "SELECT * FROM Categories WHERE Category_ID = '$i'";
    $result = mysqli_query($sql, $query);

    while($row = mysqli_fetch_array($result)) {
        array_push($namearray, $row['Name']);
    }
}

而且,我只想对您的功能提出一些建议。由于您拥有junction table,因此您实际上不需要单独查询productandcategory即可从这些表中获取所需的值。

只需执行INNER JOIN即可最大限度地利用表关系。

使用您的连接表Product_Category,因为这是创建它的真正目的。

SELECT *
FROM Product_Category AS a
INNER JOIN Category AS b
ON a.Category_ID = b.Category_ID
WHERE Product_ID = $pid

在你的函数中,你可以试试这个:还没有测试过,但希望这会给你一些想法。

//INPUT PRODUCT ID, GET ASSOCIATED CATEGORIES
function productcat($pid) {
    global $sql;
    $query = "SELECT *
              FROM Product_Category as a
              INNER JOIN Category as b
              ON a.Category_ID = b.Category_ID
              WHERE Product_ID = {$pid}";
    $result = mysqli_query($sql, $query);
    $namearray = array();
    while($row = mysqli_fetch_array($result)) {
            array_push($catidarray, $row['Name']);
    }
    return $namearray;
}

然后就是这样:)

顺便说一句,在最新版本的 php 中,mysql_函数已被弃用。如果您要使用PDOMySQLi会更好。还要检查这个:PDO vs. MySQLi

于 2014-02-15T06:03:49.613 回答