【问题标题】:Correct Way to Nest MySQLi in PHP在 PHP 中嵌套 MySQLi 的正确方法
【发布时间】:2018-05-08 18:20:09
【问题描述】:

我有一个关于在另一个查询中嵌套 MySQLi 查询可能是相当基本的问题。我不确定这是否是最佳做法,如果有人可以通过让我知道下面的示例是否运行良好或是否有更好的方法来提供帮助,我将不胜感激。

表 1:学生

id | linked_teacher | student_name | student_age
1  | 1              | Bob Eaves    | 15 
2  | 1              | Ellen Robs   | 11
3  | 2              | Will Tops    | 7
4  | 3              | Scott Long   | 13

表 2:教师

id | teacher_name
1  | Mrs Green
2  | Mr Wood
3  | Dr Grey
4  | Professor Long

我的 PHP 现在如下所示:

$sql = "SELECT linked_teacher, student_name, student_age FROM students";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
  while($row = $result->fetch_assoc()) {
    $linked_teacher = $row["linked_teacher"];

    $sql2 = "SELECT teacher_name FROM teachers WHERE teacher_name = $linked_teacher";
    $result2 = $conn->query($sql2);
    if ($result2->num_row > 0) {
      while($row2 = $result2->fetch_assoc()) {
        $teacher_name = $row2["teacher_name"];
      }
    }

    echo "$row["teacher_name"]. " - ". $row["student_name"]. " - " . $row["student_age"]";
  }
}

这将输出以下内容:

Mrs Green - Bob Eaves - 15
Mrs Green - Ellen Robs - 11
Mr Wood - Will Tops - 7
Dr Grey - Scott Long - 13

虽然我很欣赏我的示例实际上并不需要两张表,但如果我能理解回答此示例的正确方法,我确信我在我的解决方案中没有这样做,那么我可以将该理论应用于更复杂的解决方案。

提前致谢。

【问题讨论】:

  • 您需要学习如何使用JOIN。这应该包含在任何 SQL 入门书籍或教程中。
  • 警告:当使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug切勿$_POST$_GET任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
  • 这是一个 N+1 查询情况,正如比尔所说,您可以通过使用LEFT JOIN 预取来避免这种情况。我认为你在这里有一个潜在的问题,因为你使用老师的名字作为外键。这些不够独特并且可能会发生变化,从而导致错误链接的数据。最好使用固定标识符,例如教师员工 ID 或一些自行生成的号码。

标签: php mysql database mysqli


【解决方案1】:

使用一个循环并加入表格。您的代码更快(注释 3)且更简单。正如上面第二条评论指出的那样,一定要跟进并了解如何处理受污染的数据。祝你好运!

 $sql = "SELECT teacher_name, student_name, student_age FROM students JOIN teachers ON linked_teacher = teachers.id";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    echo "$row["teacher_name"]. " - ". $row["student_name"]. " - " . $row["student_age"]";
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 2022-07-26
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    相关资源
    最近更新 更多