【问题标题】:In PHP, compare an array against a field in a MySQL table在 PHP 中,将数组与 MySQL 表中的字段进行比较
【发布时间】: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 queriesbind_param 将任何数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug切勿$_POST$_GET任何类型的数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
  • 注意:mysqli 的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query 接口混淆。在您对程序风格投入过多之前,值得转换一下。示例:$db = new mysqli(…)$db-&gt;prepare("…") 过程接口是 PHP 4 时代的产物,当时引入了 mysqli API,理想情况下不应在新代码中使用。
  • 嗨塔德曼;我在此处发布的代码已从原始代码中删除,以触及问题的核心。这是一个使用查询字符串的简单页面,然后在传递给查询之前对其进行清理。通过阅读参数化查询的链接,据我所知,以这种方式编写的单个选择的服务器开销比使用准备好的语句要少?

标签: php mysql arrays compare


【解决方案1】:

而不是在数组的迭代中循环数据库获取,这会导致一旦您到达数组中的第二个条目(因此最多只有一个输出,如您所见),就没有数据可供读取,只需循环数据库获取并使用in_array 来确定是否输出位置名称:

   while ($rowLocationNames = mysqli_fetch_assoc($rstLocationNames)) {
       if (in_array($rowLocationNames["idLocation"], $LocationArray)) {
           echo $rowLocationNames["LocationName"]."<br />";
       }
   }

【讨论】:

  • 就是这样;现在工作。你的第二行缺少一个右括号,但我发现了,一切都很好。非常感谢。
  • @CalumMorrison 对此感到抱歉。我将编辑答案,以便其他人看到它是正确的。
  • 不用担心;你把我带到了我需要去的地方,一点点额外的思考永远不会伤害我!
【解决方案2】:

问题是您的while 循环从数据库中读取位置名称嵌套在for 循环中。在for 循环的第一次迭代之后,数据库指针位于记录集的末尾,因此当您进行下一次迭代时,没有记录可供读取。

在进入for 循环之前尝试将记录读入一个数组,然后使用while 循环遍历新创建的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    相关资源
    最近更新 更多