0

私は初心者の PHP プログラマーで、「ネスト」のアイデアを理解するのに問題があります。次のコードを実行すると、テーブルの $query3 (FirstName、LastName など) からリストされた全員が表示されますが、2 番目と 3 番目の while ループ (それぞれ $query1 と $query2 を使用) を表示すると、それだけが実行されます。最初のレコード (リストされている最初の従業員) で、他のレコードではありません。ループのインスタンスごとに $employeeID 変数をリセットする必要がありますか、またはその方法は?

//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;
?>
4

1 に答える 1

1

ネストされたループから始めましょう。ここでは、クエリをスキップして理解しやすくする例を示します。

<?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";
    }
  }
}

この結果は、あなたが見ていると私が期待するものと少し似ています

First Level: 10
 -- Second Level: 20
 -- -- Third Level: 30
 -- -- Third Level: 31
 -- -- Third Level: 32
 -- -- Third Level: 33
 -- -- Third Level: 34
 -- -- Third Level: 35
 -- -- Third Level: 36
 -- -- Third Level: 37
 -- Second Level: 21
 -- Second Level: 22
 -- Second Level: 23
 -- Second Level: 24
 -- Second Level: 25
 -- Second Level: 26
 -- Second Level: 27
First Level: 11
First Level: 12
First Level: 13
First Level: 14
First Level: 15
First Level: 16
First Level: 17

この理由は、この例で next を使用しているためです。これにより、内部ポインターが配列内の次の要素に移動します。次に外側のループを通過するときにポインターがリセットされることはないため、エコー "First Level: $rows\n" にヒットします。行、次の while ループ。ポインターはまだ配列の最後にあるため、next() は失敗し、残りの反復を続行します。これは、最も内側のループ ($rows2) と同じです。

この例で次に使用した理由は、クエリで使用される mysql_fetch_array 関数と同じように動作し、結果セットの最後に到達し、ポインターが最初にリセットされることはないためです。

以上のことから、クエリで JOIN を使用することを検討する必要があります。具体的には、次のような左 JOIN から始めます。

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

そこから始めて、それがあなたが探しているものに近づくかどうかを確認してください.

于 2012-11-10T03:57:05.443 に答える