【发布时间】:2019-02-11 21:08:48
【问题描述】:
我有两张桌子;一个是位置名称列表,另一个是公司列表,其中一个字段可能存储公司运营的多个位置:
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 公司运行此程序,我希望从上面得到四个位置的列表,但我只得到第一个位置(阿伯丁)。我已经尝试了我能想到的所有组合,但无济于事。我需要以这种方式保持数据结构,因为我打算选择多个用于插入和编辑数据,当我可以让它工作时。 有什么想法我哪里出错了吗?
【问题讨论】:
-
您需要一个
Locations表,其中每个公司位置都有一行,然后加入它。 -
警告:当使用
mysqli时,您应该使用parameterized queries 和bind_param将任何数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug。 切勿将$_POST、$_GET或任何类型的数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。 -
注意:
mysqli的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query接口混淆。在您对程序风格投入过多之前,值得转换一下。示例:$db = new mysqli(…)和$db->prepare("…")过程接口是 PHP 4 时代的产物,当时引入了mysqliAPI,理想情况下不应在新代码中使用。 -
嗨塔德曼;我在此处发布的代码已从原始代码中删除,以触及问题的核心。这是一个使用查询字符串的简单页面,然后在传递给查询之前对其进行清理。通过阅读参数化查询的链接,据我所知,以这种方式编写的单个选择的服务器开销比使用准备好的语句要少?