2017-04-14 2 views
0

Ich baue eine dynamische HTML-Tabelle für eine Gaming-Liga. Das Problem, das ich habe, ist, dass die Tabellenspalten nur gezeichnet werden, wenn es für dieses bestimmte Spiel eine Punktzahl gibt. Wenn es keine Punkte gibt, sagen wir zu Beginn eines Turniers, gibt es überhaupt keinen Tisch.Versuchen, eine MYSQL-Abfrage in zwei Teile zu teilen

Ich muss meine Abfrage aufteilen, so dass das Erstellen der Header meiner Tabelle aus meiner Spieleliste passiert unabhängig davon, ob es irgendwelche Punkte gibt oder nicht.

// Write query to retrieve tournament games 
$strSQL = "SELECT nfojm_djc2_items.name AS game, nfojm_djc2_items.rom AS rom, nfojm_users.username AS name, submit_score.gamescore AS score, nfojm_comprofiler.avatar AS avatar 
FROM nfojm_djc2_items, nfojm_users, submit_score, select_game, nfojm_comprofiler 
WHERE submit_score.gameID = select_game.id 
AND select_game.gamecatalogID = nfojm_djc2_items.id 
AND submit_score.userID = nfojm_users.id 
AND submit_score.userID = nfojm_comprofiler.user_id 
AND submit_score.tournID = $tournID 
ORDER BY submit_score.gamescore DESC"; 

// Execute the query. 
$query = mysqli_query($con, $strSQL); 

while ($row = mysqli_fetch_array($query)) { 

    if (!in_array($row["game"], $games)) { 
     $i=0; 
     $indexes[$row["game"]] = 0; 
     $games[] = $row["game"];  
    } else {  
     $indexes[$row["game"]]++; 
     $i = $indexes[$row["game"]]; 
    } 

    if (!in_array($row["rom"], $roms)) { 
     $i=0; 
     $indexes[$row["rom"]] = 0; 
     $roms[] = $row["rom"];  
    } else {  
     $indexes[$row["rom"]]++; 
     $i = $indexes[$row["rom"]]; 
    } 

    $scores[$i][$row["game"]] ="<div style='float:left; margin-right:7px;'><img src='http://www.arcadeicons.com/images/comprofiler/" . $row["avatar"] . "' height='35' width='35' style='border-radius:50%'></div>" . $row["name"] . "<br><h3>" . $row["score"] . "</h3>"; 

} 
// Close the connection 
mysqli_close($con); 

print ('<table><tr><td><IMG SRC="http://www.arcadeicons.com/images/jem/venues/small/'.$loc_image.'" style="height:86px; margin-right:8px; border-radius:5%"></td>'); 
print ('<td><p style="text-align: left; margin-bottom:15px;"><h1 style="color:#222222;">'.$tourn_name.'</h1></p>'); 
print ('<p style="text-align: left;"><h3>'.$venue_name.' , '.$city_name.' , '.$state_name.' , '.$country_name.'</h2></p>'); 
print ('<p style="text-align: left;"><h3>'.$tourn_date.'</h2></p></td></tr></table>'); 


// PUT SCORES TO SCREEN 
// GAMES 
print('<table class="rounded" style="border:2px solid #999999;"><thead><tr>'); 

foreach ($roms as $rom) { 
    print("<th class='block'><div style=\"width:130px;height:35px;background-image: url(http://www.arcadeicons.com/media/marquees/{$rom}1.png);background-size:cover;background-position:center center;\"></div></th>"); 
} 
print("</tr></thead><tbody><tr>"); 
foreach ($games as $game) { 
    print("<td class='block' style='text-align:center; background-color:#444444; color:white;'><h4>{$game}</h4></td>"); 
} 

print("</tr>"); 

foreach ($scores as $score) { 

    print("<tr>");   

     foreach ($games as $game) { 

     if (isset($score[$game])){ 
      $ps = $score[$game]; 
     } else { 
      $ps = ""; 
     } 

     print("<td style=\"padding-left:8px;\" class=\"block\"><h4>{$ps}</h4></td>"); 
    } 
} 

print("</tr></tbody></table>"); 

Die Ergebnisse sehen so aus, wenn Noten angezeigt werden.

picture of table when rendered

+0

Ihr Code ist wahrscheinlich anfällig für [** SQL-Injection-Angriffe **] (https://en.wikipedia.org/wiki/SQL_injection). Sie sollten [** mysqli **] (https://secure.php.net/manual/en/mysqli.prepare.php) oder [** PDO **] (https://secure.php.net/) verwenden. manual/de/pdo.prepared-statements.php) vorbereitete Anweisungen mit gebundenen Parametern wie in [** dieser Beitrag **] beschrieben (https://stackoverflow.com/questions/60174/how-cani-i-prevent-sql -injektion-in-php). –

+0

Schreiben Sie Ihre Abfrage mit JOINS anstelle des von Ihnen verwendeten Formulars neu. Verwenden Sie für die Tabellen, in denen Datensätze möglicherweise fehlen (dh noch kein Ergebnis) LEFT JOINs und für die Spalten aus diesen Tabellen die IFNULL-Funktion, um einen Standardwert (dh 0 oder "keine Bewertung") zurückzugeben. –

Antwort

0

Ich habe neu geschrieben Ihre Frage so, dass es alle Datensätze auswählen, einschließlich derjenigen ohne Partitur, mit der Ausnahme, dass Ihre where-Klausel und um sowohl durch Klausel eine Spalte aus der Score-Tabelle verweisen.

Sie müssen entscheiden, was Sie zum Einschließen von Datensätzen verwenden und die where-Klausel entsprechend ändern und zur order by-Klausel hinzufügen möchten.

Vielleicht haben Sie ein Feld, das das Turnier in einer der anderen Tabellen identifiziert?

SELECT i.`name` AS `game`, 
    i.`rom` AS `rom`, 
    u.`username` AS `name`, 
    IFNULL(s.`gamescore`,'No Score Yet') AS `score`, 
    p.`avatar` AS `avatar` 
FROM `nfojm_djc2_items` i 
JOIN `select_game` g 
    ON g.`gamecatalogID` = i.`id` 
JOIN `nfojm_users` u 
    ON s.`userID` = u.`id` 
JOIN `nfojm_comprofiler` p 
    ON u.`id` = p.`user_id` 
LEFT JOIN `submit_score` s 
    ON s.`gameID` = g.`id` 
     AND s.`userID` = u.`id` 
WHERE s.`tournID` = '$tournID' 
ORDER BY s.gamescore DESC; 
+0

Vielen Dank für diese Hilfe. Ich benutze MySQL, ich habe versucht, diese Abfrage in phpMYAdmin zu testen, aber es wirft Syntaxfehler, ist dies in einem anderen Format? –

+0

Was ist der Syntaxfehler? Es sollte dir sagen, wo es ist. –

+0

Wenn Sie phpAdmin verwenden, müssen Sie den Wert $ tournID durch einen Wert ersetzen. –

Verwandte Themen