2010-04-14 19 views
6

मैं इस के साथ थोड़ी देर के लिए संघर्ष कर रहा हूं; मैं इसे यथासंभव सरल समझाने की कोशिश करूंगा।एकाधिक MySQL तालिकाओं से एकल HTML तालिका

+----------+-----------+---------+--------+ 
|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  | 
+----------+-----------+---------+--------+ 

दोनों session_id और pilot_id विदेशी एक और तालिका में एक प्राथमिक कुंजी के संदर्भ बनाने चाबियाँ हैं:

इस MySQL तालिका पर विचार करें। एक ही pilot_id को विभिन्न session_id से जोड़ा जा सकता है, लेकिन प्रत्येक pilot_id - session_id संयोजन अद्वितीय है।

मैं एक HTML तालिका बनाने के लिए (PHP में) है कि इस तरह के डेटा को प्रदर्शित होगा की जरूरत है:

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

इसलिए, पंक्तियों pilot_id हैं और स्तंभों session_id हैं। जब pilot_id - session_id संयोजन में present 1 का मान है, तो इसी सेल को चेक किया जाना चाहिए। (यानी जब पंक्ति संयोजन शून्य है या संयोजन MySQL तालिका में मौजूद नहीं है, तो HTML तालिका में कुछ भी नहीं दिखना चाहिए)

पुhew।

कोई विचार?

धन्यवाद!


मैंने एरिस्को द्वारा प्रस्तावित उत्तर की कोशिश की है, लेकिन मैं काफी उलझन में हूं। (टिप्पणी क्षेत्र मेरे स्पष्टीकरण के लिए बहुत छोटा है, इसलिए मेरे प्रश्न के लिए यह अद्यतन)।

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

मैं $rows = mysqli_fetch_array($result); का उपयोग करें:

यह वास्तविक डेटा के साथ मैं काम कर रहा हूँ है। मैंने पुष्टि की है कि क्वेरी सही डेटा लौट रही है।

हालांकि, जब मैं एरिक्सो द्वारा प्रस्तावित उत्तर का उपयोग करता हूं, तो मुझे लगता है कि मनमाने ढंग से डेटा मिल रहा है। यहाँ उत्पन्न HTML तालिका है:

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

इसके अलावा 'एक्स' स्थिति रहता present मूल्यों के अप्रासंगिक ही।

कोई विचार यह क्यों हो रहा है?

धन्यवाद!

+0

यदि आप बनाम $ पंक्तियाँ मैं अपने $ पंक्तियों var_dump'd, तो आप शायद मतभेद देखना चाहते हैं: $ पंक्तियों यह मानकर अपने डेटा डेटाबेस से वापस ले लिया का स्वरूप है। मैं '$ पंक्तियों = mysqli_fetch_all ($ परिणाम, MYSQLI_ASSOC) का उपयोग करने का प्रयास करूंगा;' – erisco

+0

आह, हाँ। मैं देखता हूं कि कुछ गलत है।जब मैं mysqli_fetch_assoc का उपयोग मैं: सरणी (4) { [ "status_id"] => स्ट्रिंग (1) "7" [ "pilot_id"] => स्ट्रिंग (2) "33" [ "session_id"] => स्ट्रिंग (2) "65" ["वर्तमान"] => स्ट्रिंग (1) "1"} जो केवल पहली पंक्ति है ... वह क्यों है? वैसे भी, $ पंक्तियां = mysqli_fetch_all ($ परिणाम, MYSQLI_ASSOC) काम नहीं करता है, हालांकि ... (जो मैंने गुगल किया है, मेरे पास माइस्क्लंड नहीं है - जिसे मैं अपने साझा सर्वर पर इंस्टॉल नहीं कर सकता)। यहां त्रुटि है: घातक त्रुटि: अपरिभाषित फ़ंक्शन mysqli_fetch_all() पर कॉल करें। धन्यवाद! –

+0

मैंने अभी यह कर लिया है: $ पंक्तियां = सरणी(); जबकि ($ rawRow = mysqli_fetch_assoc ($ परिणाम)) { $ पंक्तियां [] = $ rawRow; } –

उत्तर

3

सौभाग्य से आप केवल एक प्रश्न की जरूरत है।

<?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 ... और तर्क से अच्छी तरह से अलग प्रस्तुति। –

+0

आपकी मदद के लिए धन्यवाद! हालांकि, मैं काफी उलझन में हूँ। मैंने नीचे एक उत्तर पोस्ट किया है (टिप्पणी फ़ील्ड मेरे स्पष्टीकरण के लिए बहुत छोटा है), कोई विचार? –

0

आप इस तरह एल्गोरिथ्म का उपयोग कर सकते हैं:

$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>"; 
संबंधित मुद्दे