【问题标题】:Echo contents of JOIN SQL tables with MySQLi使用 MySQLi 回显 JOIN SQL 表的内容
【发布时间】:2019-04-01 08:51:57
【问题描述】:

我正在开发一个系统,这个模块应该回显数据库的内容。

在我添加一些 JOIN 语句之前,它运行良好。

我检查并测试了 SQL 代码,它运行良好。不起作用的是我回显 JOINed 表的内容的那部分。

我的代码如下所示:

$query = "SELECT reg_students.*, courses.*
          FROM reg_students
          JOIN courses ON reg_students.course_id = courses.course_id
          WHERE reg_students.user_id = '".$user_id."'";

$result = mysqli_query($conn, $query);
if (mysqli_fetch_array($result) > 0) {
    while ($row = mysqli_fetch_array($result)) {
       echo $row["course_name"]; 
       echo $row["course_id"];

course_name 和 course_id 既不回显也不给出任何错误消息。


更新:我实际上需要通过 JOINing 更多表和更改所选列来增加查询复杂性。我需要加入这些表:

tutors 具有列:tutor_idt_fnamet_othernamesemailphone number
faculty 具有列:faculty_idfaculty_name、@987654@33
courses 包含以下列:course_idcourse_codecourse_nametutor_idfaculty_id

我想在我的原始查询中将这些表加入到reg_students 表中,以便我可以按$user_id 进行过滤,并且我想显示:course_namet_fnamet_othernamesemailfaculty_name

【问题讨论】:

  • 为了向您提供最好的支持,请创建一个 sqlfiddle 演示或至少导出您的表和足够的示例行供我们测试。换句话说,我们希望看到 3 个 CREATE 表查询和 3 组 INSERT 查询,以便我们可以使用您的实际架构/数据。
  • 此外,我可以看到一些不太正确的东西...mysqli_fetch_array($result) 不用于计算行数——事实上,您将忽略第一行数据,因为您使用它在if 条件下。如果您只对course_namecourse_id 列感兴趣,请在SELECT 中查询。如果您知道它们来自哪个表,请务必指定该表,然后是 .,然后是列名。使用mysqli_fetch_assoc() 生成关联结果集; fetch_array() 包括索引元素和关联元素。
  • 您确定要加入user_info吗?您没有从中选择任何内容,但它可能是对您的查询逻辑的关键检查——我不能确定。

标签: php mysqli inner-join mysqli-fetch-array


【解决方案1】:

我无法想象 user_info 表对 JOIN 有任何好处,因此我将其删除为一个合理的猜测。我还假设您想要的列都来自 courses 表,所以我用 SELECT 中的列名来指定表名。

为了读者清楚,我喜欢使用INNER JOIN 而不是JOIN。 (they are the same beast)

$user_id 转换为整数只是我提出的最佳实践,以防该变量由用户提供/不受信任的输入提供。

你用mysqli_num_rows()计算结果集中的行数。

如果您只想使用关联键访问结果集数据,请使用mysqli_fetch_assoc() 生成结果集。

在使用 JOIN 编写查询时,为每个表声明 别名 通常很有帮助。这在很大程度上减少了代码膨胀和阅读器压力。

未经测试的代码:

$query = "SELECT c.course_name, t.t_fname, t.t_othernames, t.email, f.faculty_name
          FROM reg_students r
          INNER JOIN courses c ON r.course_id = c.course_id
          INNER JOIN faculty f ON c.faculty_id = f.faculty_id
          INNER JOIN tutors t ON c.tutor_id = t.tutor_id
          WHERE r.user_id = " . (int)$user_id;
if (!$result = mysqli_query($conn, $query)) {
    echo "Syntax Error";
} elseif (!mysqli_num_rows($result)) {
    echo "No Qualifying Rows";
} else {
    while ($row = mysqli_fetch_assoc($result)) {
        echo "{$row["course_name"]}<br>";
        echo "{$row["t_fname"]}<br>";
        echo "{$row["t_othernames"]}<br>";
        echo "{$row["email"]}<br>";
        echo "{$row["faculty_name"]}<br><br>";
    }
}

【讨论】:

  • 这实际上是一个假设。假设 user_info 是相关的,我将如何回显两个表的内容?
  • 该表有以下表tutorscoursesfaculty,以及它们上面的一些唯一字段(tutor_id)。我想在一个表单上回显所有这些表中的字段。
  • 好的,这些是表格。 Tutors 表有 [tutor_id,t_fname,t_othernames,email,电话号码] Faculty 表有 [faculty_id,faculty_name,faculty_code] Courses 表有 [course_id,course_code,course_name,tutor_id,faculty_id] 我想加入这些表并回显(course_name, t_fname、t_othernames、email、faculty_name)
  • 它说:mysqli_num_roes() 期望参数 1 是 mysqli_result,给定的布尔值。错误指向elseif(!mysqli_num_rows($result))
  • 那你没用我的sn-p。我的代码捕获错误,它应该告诉你“语法错误”。请将我的echo "Syntax Error"; 行替换为echo mysqli_error($conn);
猜你喜欢
  • 2014-06-07
  • 2020-06-26
  • 1970-01-01
  • 2011-12-10
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多