2012-06-19 27 views
1

比方說,我有一個數據庫結構如下圖所示:

學生PHP循環

+--------------+--------------------+-------------------+ 
| student_id | student_firstname | student_lastname | 
+--------------+--------------------+-------------------+ 
| 1   | John    | Doe    | 
+--------------+--------------------+-------------------+ 
| 2   | Lisa    | Doe    | 
+--------------+--------------------+-------------------+ 
| 3   | Derp    | Doe    | 
+--------------+--------------------+-------------------+ 

缺席

+--------------+--------------------+-------------------+---------------+ 
| absence_id | absence_student_id | absence_date  | absence_note | 
+--------------+--------------------+-------------------+---------------+ 
| 1   | 2     | 2012-06-10  | A note...  | 
+--------------+--------------------+-------------------+---------------+ 
| 2   | 3     | 2012-06-30  | Another note. | 
+--------------+--------------------+-------------------+---------------+ 

而且students.student_id柱和absence.absence_student_id之間的關係

在PHP中,我想遍歷上面的表並獲得students中的行的完整輸出,並且如果absence中有與該學生匹配的記錄,請對該行執行一些操作,然後繼續循環。

我想要的HTML輸出將是這樣的:

<table> 
<thead> 
    <tr> 
    <td>Name:</td> 
    <td>Absence date:</td> 
    <td>Absence note:</td> 
    </tr> 
</thead> 

<tr> 
    <td>John Doe</td> 
    <td></td> 
    <td></td> 
</tr> 

<tr> 
    <td>Lisa Doe</td> 
    <td>2012-06-10</td> 
    <td>A note...</td> 
</tr> 

<tr> 
    <td>Derp Doe</td> 
    <td>2012-06-30</td> 
    <td>Another note.</td> 
</tr> 
</table> 

我使用的循環是這樣的:

<?php 
    while ($row = mysql_fetch_array($students_sql_query)) { 
    echo "<tr><td>".$row['student_firstname']."</td></tr>"; 
} 
?> 

是否有可能加入某種if語句來呢?我需要兩個不同的MySQL查詢和某種foreach循環嗎?我對網絡編程相對比較陌生......先謝謝了,並對一篇長文章感到遺憾。

+0

你是什麼意思?你想退出循環還是改變它的處理方式? – Ray

回答

3

您需要在查詢中加入表格,然後從查詢中獲取結果。

SELECT Students.student_firstname 
    , Students.student_lastname 
    , Absence.absence_date 
    , Absence.absence_note 
FROM Students 
LEFT JOIN Absence ON Students.id = Absence.absence_student_id 

那麼你應該能夠通過它類似這樣的循環:

<?php 
    while ($row = mysql_fetch_array($students_sql_query)) 
    { 
?> 
     <tr> 
      <td>$row['student_firstname']</td> 
      <td>$row['student_lastname']</td> 
      <td>$row['absence_date']</td> 
      <td>$row['absence_note']</td> 
     </tr> 
<? 
    } 
?> 

的左連接會告訴數據庫中的所有學生拉,如果他們有缺席,將填充這些過。如果學生沒有缺席,那將從數據庫中返回爲空。當它顯示在循環中的表格行中時,如果該學生缺席表中沒有任何內容,它應顯示爲空列。

唯一的缺點是,如果學生有多個缺席,它會重複顯示錶中的行。在這種情況下,您必須在代碼或顯示中進行一些預處理來處理該情況。

+0

很酷,非常感謝!我會將此標記爲答案,但我必須等待幾分鐘才能執行此操作。 – David

0

使用PDO將是如下:

$sql = $dbh->prepare(' 
     SELECT student_firstname, student_lastname, absense_date, absense_note 
     FROM students s inner join absense a 
     ON s.student_id=a.absense_student_id 
     '); 
     $sql->execute(); 
     $result = $sql->fetchAll(); <----- fetch All the data 
     return $result; 

    foreach($result as $row) 
      { 
      echo '<tr>'; 
      echo '<td>'.$row['student_firstname'].' '.$row['student_lastname'].'</td>'; 
      echo '<td>'.$row['absense_date'].'</td>'; 
      echo '<td>'.$row['absense_note'].'</td>'; 
      echo '</tr>'; 
      }