Php 嵌套的While循环仅显示第一行数据
我是一名PHP新手,在理解“嵌套”的概念时遇到了问题。当我运行以下代码时,它将显示表中$query3(FirstName、LastName等)中列出的所有人,但是当它显示第二个和第三个while循环(分别使用$query1和$query2)时,它只对第一条记录(列出的第一个员工)执行此操作,而不对其他记录执行此操作。我是否需要/如何为循环的每个实例重置$employeeID变量,或者我到底需要在哪里进行更改Php 嵌套的While循环仅显示第一行数据,php,mysql,Php,Mysql,我是一名PHP新手,在理解“嵌套”的概念时遇到了问题。当我运行以下代码时,它将显示表中$query3(FirstName、LastName等)中列出的所有人,但是当它显示第二个和第三个while循环(分别使用$query1和$query2)时,它只对第一条记录(列出的第一个员工)执行此操作,而不对其他记录执行此操作。我是否需要/如何为循环的每个实例重置$employeeID变量,或者我到底需要在哪里进行更改 //pen some querying $query1 = mysql_query("S
//pen some querying
$query1 = mysql_query("SELECT * FROM employees WHERE position='Supervisor' OR position='Area Manager' ORDER BY area, LastName, EmployeeNumber ");
$query2 = mysql_query("SELECT * FROM meetings WHERE meetingGroup='Management'");
//now write some wicked sick code that will change the world!
while($rows3 = mysql_fetch_array($query1)):
$firstname = $rows3['FirstName'];
$lasttname = $rows3['LastName'];
$area = $rows3['area'];
$employeeID = $rows3['EmployeeNumber'];
echo "<table border='1' align='center' width='75%'><tr><td width='25%'>$firstname $lasttname</td>";
while($rows1 = mysql_fetch_array($query2)):
$meetingID = $rows1['meetingID'];
$meetingName = $rows1['meetingName'];
echo "<td width='19%'>$meetingName</td>";
$query3 = mysql_query("SELECT * FROM meetingattendance WHERE employeeid='$employeeID' AND meetingid='$meetingID'");
while($rows2 = mysql_fetch_array($query3)):
$attendanceMark = $rows2['employeeattendance'];
if($attendanceMark = 1)
echo "<td><center><strong>X</strong></center></td>";
else
echo "No Record";
endwhile;
endwhile;
endwhile;
?>
//打开一些查询
$query1=mysql_query(“按区域、姓氏、员工编号从position='Supervisor'或position='Area Manager'排序的员工中选择*);
$query2=mysql\u query(“从meetingGroup='Management'所在的会议中选择*);
//现在写一些邪恶的病态代码,将改变世界!
而($rows3=mysql\u fetch\u数组($query1)):
$firstname=$rows3['firstname'];
$lasttname=$rows3['LastName'];
$area=$rows3['area'];
$employeeID=$rows3['EmployeeNumber'];
回显“$firstname$lasttname”;
而($rows1=mysql\u fetch\u数组($query2)):
$meetingID=$rows1['meetingID'];
$meetingName=$rows1['meetingName'];
回显“$meetingName”;
$query3=mysql_query(“从MeetingAttention中选择*,其中employeeid='$employeeid'和meetingid='$meetingid'”);
而($rows2=mysql\u fetch\u数组($query3)):
$attendanceMark=$rows2['EmployeeAttention'];
如果($attendanceMark=1)
回声“X”;
其他的
回声“无记录”;
结束时;
结束时;
结束时;
?>
让我们从嵌套循环开始。我将在这里给出一个例子,它将跳过查询,使之更容易理解
<?php
$nested1 = array(10,11,12,13,14,15,16,17);
$nested2 = array(20,21,22,23,24,25,26,27);
$nested3 = array(30,31,32,33,34,35,36,37);
while ($rows3 = next($nested1)) {
echo "First Level: $rows3\n";
while ($rows1 = next($nested2)) {
echo " -- Second Level: $rows1\n";
while ($rows2 = next($nested3)) {
echo " -- -- Third Level: $rows2\n";
}
}
}
原因是我们在本例中使用next,它将内部指针移动到数组中的下一个元素。由于指针在下一次通过外部循环时不会重置,因此我们将点击回显“第一级:$rows\n”;行,然后是下一个while循环。由于指针仍在数组的末尾,next()将失败并继续执行迭代的其余部分。这与最内部的循环($rows2)相同
我接下来在本例中使用的原因是,它的作用与查询中使用的mysql_fetch_数组函数类似,它将到达结果集的末尾,指针永远不会重置回开头
尽管如此,您确实应该考虑在查询中使用连接。特别是从一个左连接开始,如下所示
SELECT * FROM employees as e
LEFT JOIN meetingattendance as m ON e.EmployeeNumber = m.employeeid
WHERE e.position='Supervisor' OR e.position='Area Manager'
ORDER BY e.area, e.LastName, e.EmployeeNumber
从这里开始,看看这是否能让你更接近你想要的东西。为什么不在一个sql查询中,而不是在这些while循环中,对三个表
employees
、meetings
和meetingAttentication
进行排序?请发布三个表的结构,并解释您试图实现的目标。您可以将至少两个(如果不是全部)三个查询与一个连接和一个循环结合起来?它将远不那么复杂,占用更少的内存。是否出现了此选项?谢谢!新手的堕落,你只是不知道所有的好东西!我将尝试使用连接,我敢说这可能会让我省去一个巨大的头痛。非常感谢。
SELECT * FROM employees as e
LEFT JOIN meetingattendance as m ON e.EmployeeNumber = m.employeeid
WHERE e.position='Supervisor' OR e.position='Area Manager'
ORDER BY e.area, e.LastName, e.EmployeeNumber