我有两个表;一个是位置名称列表,另一个是公司列表,其中一个字段存储公司运营的多个位置:
id LocationName
1 Aberdeen
2 Dundee
3 Edinburgh
4 Glasgow
idCompany CompanyName Locations
1 CompanyA 1, 2, 3, 4
2 CompanyB 2, 4
3 CompanyC 1
对于每个公司的详细信息页面,我想列出他们经营的地点,并显示每个公司的名称。例如。对于B公司:
Dundee
Glasgow
等。
来自 VB 背景,我只是遍历每个数据集并比较每个数据集以找到匹配项,但这是在 PHP 中,我无法让它工作:
// Query for specific firm
$sqlCompany= "SELECT * FROM company_details WHERE CompanyID='".$CompanyID."';";
$rstCompany= mysqli_query($conn, $sqlCompany);
$row = mysqli_fetch_assoc($rstCompany);
// Query list of Locations
$sqlLocationNames= "SELECT * FROM Locations ORDER BY LocationName ASC;";
$rstLocationNames= mysqli_query($conn, $sqlLocationNames);
// Explode the field of locations into an array:
$LocationArray = $row["Locations"];
$LocationArray = explode (",", $LocationArray);
for ($i = 0; $i < count($LocationArray); $i++) {
while ($rowLocationNames = mysqli_fetch_assoc($rstLocationNames)) {
if ($LocationArray[$i]==$rowLocationNames["idLocation"]) {
echo $rowLocationNames["LocationName"]."<br />";
}
}
}
为公司 A 运行此服务,我希望从上面获得四个位置的列表,但我只获得第一个位置(阿伯丁(。我已经尝试了我能想到的所有组合,但无济于事。我需要以这种方式保持数据结构,因为我打算在可以正常工作时选择一个多个来插入和编辑数据。有什么想法我哪里出错了吗?
数组的迭代中循环数据库提取,这会导致一旦您进入数组中的第二个条目(因此最多一个输出,如您所见(,只需循环数据库提取并使用in_array
来确定是否输出位置名称:
while ($rowLocationNames = mysqli_fetch_assoc($rstLocationNames)) {
if (in_array($rowLocationNames["idLocation"], $LocationArray)) {
echo $rowLocationNames["LocationName"]."<br />";
}
}
问题是从数据库读取位置名称的while
循环嵌套在for
循环中。在 for
循环的第一次迭代之后,数据库指针位于记录集的末尾,因此当您进行下一次迭代时,没有要读取的记录。
在进入for
循环之前,请尝试将记录读入数组,然后使用 while
循环循环访问新创建的数组。