【问题标题】:PHP loop array until index changesPHP循环数组,直到索引更改
【发布时间】:2019-01-29 10:44:19
【问题描述】:

如何创建一个循环到索引更改的 php 循环? 例如,如果索引是学生,数据列是学生注册的所有班级,如何在当前学生旁边显示每个班级,然后移动到下一个学生并显示该学生的所有班级等等? 我完全被卡住了,我只需要一个想法来帮助开始。 我相信我需要一个 foreach 或 while 循环,即当 student_id 没有改变时,显示类。或者类似的东西,我已经被困在这里好几天了。我还有一个元素以一对多的方式显示每个学生的数据,但是,由于这是一个多对多表,我为每个学生的班级创建了一个完整的单独表。

$get_student = "select * from students";

    $run_student = mysqli_query($Conn, $get_student);

    while($row_product=mysqli_fetch_array($run_student)){

        $student_id = $row_product['ID'];
        $student_name = $row_product['Name'];
        $student_code = $row_product['Code'];
        $student_image = $row_product['Image'];


        echo "
    <div class='' id='' >$student_id $student_name $student_code</div>
<br><br><br><br>
";}

基本上,我想从第二个表中调用,即包含课程的表,并将它们与其他信息一起列在 div 中。 该表如下所示

ClassTable
ID-------Class
1--------101
1--------131
2--------555
3--------225
3--------146
3--------269

我真的需要关于如何从这里开始的帮助,任何关于从哪里开始的帮助都会非常有帮助。

编辑: 好的,所以对于第一个表(一对多),结构是

ID(PK)
Name(index)
Code
Image 

第二个(多对多)结构是:

TABLEID(PK)
Student_ID(index)
Student_Name(index)
Course

我在 phpmyadmin 设计器中建立了 ID 和 Student_ID 以及 Name 和 Student_Name 之间的关系。

我希望这可以澄清结构。

编辑 2

按照建议,我对上面的 php 代码进行了编辑:

    /*$get_student = "select * from inventory";*/
        $get_student = "SELECT s.ID, S.Code, s.Name,
(
SELECT
  GROUP_CONCAT(c.Course SEPARATOR ', ')
from
  mydatabase.coursetable c
where
  c.Student_ID = s.ID
) as courses
FROM mydatabase.studenttable s" ;

但是,我收到以下错误

 mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in C:\wamp64\www\...

【问题讨论】:

  • 提示:JOIN 和 ORDER BY。
  • 提供表结构以便我可以帮助你。您必须加入两个表才能找到课程
  • 我在表结构中进行了编辑。谢谢您的帮助。另外,我不确定从哪里加入 php 中的表格。

标签: php html mysql loops


【解决方案1】:

我建议你改进你的查询,像这样。

$query_string = 
"SELECT s.ID, S.Code, s.Name,
(
SELECT
  GROUP_CONCAT(c.Course SEPARATOR ', ')
from
  yourdatabase.coursetable c
where
  c.Student_ID = s.ID
) as courses
FROM yourdatabase.studenttable s
ORDER BY s.ID ASC 
";
//Added ORDER BY to order the students from first id to last.

$actual_query = mysqli_query($conn,$query_string);

while($result = mysqli_fetch_assoc($actual_query)){
//do stuff with the result array
}

你最终应该有这样的数组:

$结果
[ID] => (1)

[代码] => (XY35XS)

[姓名] => (John Doe)

[课程] => (101, 102, 103)

所以现在你可以像你已经做的那样通过 foreach 或 while 循环它。

稍微修改了我的建议以包含 mysqli 部分。

【讨论】:

  • 谢谢你,但是,也许我没有正确遵循,因为我仍然感到困惑。我对上面的代码进行了以下更改,如第二次编辑所示,但是,我收到了这个错误。
  • 现在您的查询中似乎有一个错误,我不知道您是如何按照这个示例进行的(您是否对其进行了修改以适合您的数据库和表/列)。要打印 mysqli 错误,请尝试 w3schools.com/php/func_mysqli_error.asp 您给出的错误并没有真正显示查询中的真正问题。
  • 另外,如果更清楚,您可以从查询中省略数据库名称(yourdatabase.studenttable -> studenttable)
【解决方案2】:

我不完全明白你的问题,但如果这可行,请先从表中获取学生列表

 $sql = "select id,Name from students";  
 $students = mysqli_query($Conn, $sql);

现在对于每个学生,您都需要该课程,对吧?所以

 foreach($students as $student){
    echo $student[Name];
    $sql = "select course from courses where Student_id = ".$student[id];
    $studentCourse = mysqli_query($Conn, $sql);

    foreach($studentCourse as $std)
        {
         echo $std[course]; 
    }
 } 

希望这行得通。

【讨论】:

  • 谢谢,这似乎可行,根据您的建议调整我的代码后,我收到一个错误,“注意:使用未定义的常量 ID -assumed 'ID”' 在第二行的第三行你写的一段代码。如果你能帮我解决这个问题,这似乎可以解决问题
  • id,Name 和 course 应该用单引号括起来..... 抱歉像这样 $student['ID'],$student['Name'] 和 $std['course'] 哪里'ID' 、 'Name' 和 'course' 是您的数据库列名,请相应地替换它们。请告诉我进展如何
猜你喜欢
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 2012-09-20
  • 2016-07-06
  • 2015-07-17
  • 1970-01-01
相关资源
最近更新 更多