我正在处理产品和类别之间多对多关系的联结表。通过这个特定的函数,我尝试接受一个product_ID变量并获取数组中所有关联的类别名称。然而,在当前的设置下,当我知道有几个产品 ID 有 2 个类别时,我只能获得一个类别。有什么想法吗?还有人知道一个好的简单解决方案可以更直观地跟踪 mysql 中的 M2M 关系吗?
//INPUT PRODUCT ID, GET ASSOCIATED CATEGORIES function productcat($pid) { global $sql; $query = "SELECT * FROM Product_Category WHERE Product_ID = '$pid'"; $result = mysqli_query($sql, $query); $catidarray = array(); while($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 = array(); while($row = mysqli_fetch_array($result)) { array_push($namearray, $row['Name']); } } return $namearray; }
最佳答案
你的函数有问题。
在第二个 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']);
}
}
而且,我只是想对你的功能提出一些建议。由于您拥有联结表
,因此您实际上不需要对product
和category
进行单独的查询来获取所需的值从这些表中。
只需执行 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_ 函数已经被弃用。如果您要使用 PDO 会更好或MySQLi 。 另请检查:PDO vs. MySQLi
关于php - 从 mysql 返回多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21793811/