2010-04-14 9 views
6

Od pewnego czasu walczę z tym problemem; Spróbuję wyjaśnić to tutaj tak prosto, jak to tylko możliwe.Pojedyncza tablica HTML z wielu tabel MySQL

Rozważmy tę tabelę MySQL:

+----------+-----------+---------+--------+ 
|status_id |session_id |pilot_id |present | 
+----------+-----------+---------+--------+ 
|1   |61   |901  |1  | 
|2   |63   |901  |1  | 
|3   |62   |901  |0  | 
|4   |62   |902  |1  | 
|5   |63   |903  |1  | 
+----------+-----------+---------+--------+ 

Zarówno session_id i pilot_id są obce klucze odniesień do klucza podstawowego w innej tabeli. Ten sam kod pilot_id może być powiązany z innym session_id, ale każda kombinacja jest unikatowa.

muszę zrobić tabelę HTML (w PHP), które wyświetla dane w ten sposób:

+----------+---------+---------+---------+ 
|   |61  |62  |63  | 
+----------+---------+---------+---------+ 
|901  |X  |   |X  | 
|902  |   |X  |   | 
|903  |   |   |X  | 
+----------+---------+---------+---------+ 

Stąd wiersze i kolumny są pilot_idsession_id. Gdy kombinacja - session_id ma wartość 1, należy sprawdzić odpowiednią komórkę. (tzn. gdy kombinacja wierszy wynosi zero lub kombinacja nie istnieje w tabeli MySQL, nic nie powinno pojawić się w tabeli HTML)

Uff.

Wszelkie pomysły?

Dzięki!


Próbowałem odpowiedzi zaproponowanej przez firmę erisco, ale jestem bardzo zdezorientowany. (pole komentarza jest o wiele za małe dla mojego wyjaśnienia, stąd ta aktualizacja mojego pytania).

Jest to rzeczywiste dane pracuję z:

+----------+-----------+---------+--------+ 
|status_id |session_id |pilot_id |present | 
+----------+-----------+---------+--------+ 
|7   |65   |33  |1  | 
|8   |66   |33  |1  | 
|9   |65   |17  |0  | 
|10  |66   |16  |1  | 
+----------+-----------+---------+--------+ 

używam $rows = mysqli_fetch_array($result);. Potwierdziłem, że zapytanie zwraca właściwe dane.

Jednakże, kiedy używam odpowiedzi zaproponowanej przez ericso, otrzymuję pozornie arbitralne dane. Poniżej znajduje się tabela generowane HTML:

+----------+---------+---------+---------+---------+ 
|   |1  |3  |6  |7  | 
+----------+---------+---------+---------+---------+ 
|1   |X  |   |   |   | 
|3   |   |   |   |   | 
|6   |   |   |   |   | 
|7   |   |   |   |   | 
+----------+---------+---------+---------+---------+ 

Ponadto stanowisko „X” pozostaje taka sama bez związku z present wartości.

Jakieś pomysły, dlaczego tak się dzieje?

Dzięki!

+0

Jeśli zmienna_dump będzie miała twoje $ wiersze w porównaniu z wierszami, które posiadam, prawdopodobnie zobaczysz różnice. Spróbowałbym użyć '$ rows = mysqli_fetch_all ($ result, MYSQLI_ASSOC);' – erisco

+0

Ah, yes. Widzę, że coś jest nie tak.Kiedy użyciu mysqli_fetch_assoc uzyskać: matryca (4) { [ "status_id"] => łańcuchowe (1) "7" [ "pilot_id"] => sznurek (2) "33" [ "session_id"] => ciąg (2) "65" ["obecny"] => ciąg (1) "1"} Co to jest tylko pierwszy wiersz ... Dlaczego? W każdym razie $ rows = mysqli_fetch_all ($ result, MYSQLI_ASSOC) nie zadziałało, chociaż ... (z tego, co zrobiłem, nie mam Mysqlnd - którego nie mogę zainstalować na moim udostępnionym serwerze). Oto błąd: Błąd krytyczny: wywołanie niezdefiniowanej funkcji mysqli_fetch_all(). Dzięki! –

+0

Właśnie skończyłem robiąc to: $ rows = array(); podczas gdy ($ rawRow = mysqli_fetch_assoc ($ result)) { $ rows [] = $ rawRow; } –

Odpowiedz

3

szczęście wystarczy tylko jedno zapytanie. Przyjmowanie $ rows jest formatem danych pobranych z bazy danych:

<?php 

$rows = array(
    array(
    'status_id' => 1, 
    'session_id' => 61, 
    'pilot_id' => 901, 
    'present' => 1, 
), 
    array(
    'status_id' => 2, 
    'session_id' => 63, 
    'pilot_id' => 901, 
    'present' => 1, 
), 
    array(
    'status_id' => 3, 
    'session_id' => 62, 
    'pilot_id' => 901, 
    'present' => 0, 
), 
    array(
    'status_id' => 4, 
    'session_id' => 62, 
    'pilot_id' => 902, 
    'present' => 1, 
), 
    array(
    'status_id' => 5, 
    'session_id' => 63, 
    'pilot_id' => 903, 
    'present' => 1, 
) 
); 

$session_ids = array(); 
$pilot_ids = array(); 
$crosses = array(); 

foreach ($rows as $row) { 
    $session_ids[$row['session_id']] = $row['session_id']; 
    $pilot_ids[$row['pilot_id']] = $row['pilot_id']; 
    if ($row['present'] == 1) { 
    $cross_index = $row['session_id'].'.'.$row['pilot_id']; 
    $crosses[$cross_index] = $cross_index; 
    } 
} 

sort($session_ids); 
sort($pilot_ids); 

?> 

<table> 
    <tr> 
    <th></th> 
    <?php foreach ($session_ids as $sess_id): ?> 
    <th><?php echo $sess_id; ?></th> 
    <?php endforeach; ?> 
    </tr> 
    <?php foreach ($pilot_ids as $pilot_id): ?> 
    <tr> 
    <th><?php echo $pilot_id; ?></th> 
    <?php foreach ($session_ids as $sess_id): ?> 
    <?php if (isset($crosses[$sess_id.'.'.$pilot_id])): ?> 
    <td>X</td> 
    <?php else: ?> 
    <td></td> 
    <?php endif; ?> 
    <?php endforeach; ?> 
    </tr> 
    <?php endforeach; ?> 
</table> 
+0

+1 ... i ładnie oddzielona prezentacja od logiki. –

+0

Dzięki za pomoc! Jednak jestem bardzo zdezorientowany. Zamieszczam odpowiedź poniżej (pole komentarza jest zbyt małe dla moich wyjaśnień), jakieś pomysły? –

0

można użyć algorytmu tak:

$sql = "SELECT DISTINCT session_id AS sid FROM pilot_session ORDER BY 1 ASC"; 
$rs = mysql_query($sql, $conn); 
$sessions = array(); 
while(false !== ($r = mysql_fetch_array($rs))){ 
    $sessions[] = $r['sid']; 
} 

$sql = "SELECT DISTINCT pilot_id AS pid FROM pilot_session ORDER BY 1 ASC"; 
$rs = mysql_query($sql, $conn); 
$pilots = array(); 
while(false !== ($r = mysql_fetch_array($rs))){ 
    $pilots[] = $r['pid']; 
} 

$pilot_presence = array(); 
$sql = "SELECT session_id, pilot_id, present FROM pilot_session"; 
$rs = mysql_query($sql, $conn); 
while(false !== ($r = mysql_fetch_array($rs))){ 
    $s_presence[$r['pilot_id']][$r['session_id']] = $r['present']; 
} 

echo "<table><tr><td>&nbsp</td>"; 
foreach($sessions as $s){ 
    echo "<td>$s</td>"; 
} 
echo "</tr>"; 
foreach($pilots as $p){ 
    echo "<tr><td>$p</td>"; 
    foreach($sessions as $s){ 
     $tp = ''; 
     if(isset($s_presence[$p][$s])){ 
      if($s_presence[$p][$s] == '1'){ 
       $tp = 'X'; 
      } 
     } 
     echo "<td>".$tp."</td>"; 
    }; 
    echo "</tr>"; 
} 
echo "</table>";