Fehlersuche: While schleife gibt nur ein statt neun Ergebnisse aus

Sehe ich das richtig? Du ziehst im SQL die Tips für ein Spiel in ein Feld zusammen. Anschliessend zerlegst du den wieder um an die Tips zu kommen?

Nachtrag: Ne, machst du nicht. Habs grad erkannt.
Du hast 2 Abfragen ohne Verknüpfung.
Tipps folgen bals.
 
Der Code sieht ziemlich Spagettimäßig aus. Wenn dein Projekt weiter wächst, solltest du über eine andere Strukturierung generell nachdenken. Es würde sich auch anbieten, auf ein Framework umzusteigen - dieses zwingt dich automatisch, eine vernünftige(re) Struktur zu nutzen.
Evt. kannst du dadurch sogar auch die SQL-Abfragen vereinfachen.
 
Also, ich hab das so verstanden. Du gibts alle Spiele aus. Zu allen Spielen gibst du auch alle User aus und bei denen die mitgetippt haben auch der tipp.

Ich würde alles in ein SQL quetschen. Ohne Join. Es werden alle Spiele mit allen Usern kombiniert.
Mittels IF() oder CASE WHEN.. kannst du auswerten, ob ein Tipp in der Kombination user-spiel abgegeben wurde.
Dann auch das Resultat bereits nach Spiel und User ordnen.

SQL:
SELECT
    part.id_partien,
    part.heimteam,
    part.gastteam,
    CONCAT_WS(':',part.tore_heimteam, part.tore_gastteam) AS tore,
    -- final wird nirgends gebraucht, also weg damit
    -- CONCAT_WS('|',tip.datum, tip.zeit) AS final,
    tip.username,
    CASE
        WHEN part.id_partien = tip.id_partien
        THEN tip.punkte
        ELSE NULL
    END  AS punkte
    CASE
        WHEN part.id_partien = tip.id_partien
        THEN CONCAT_WS(':',tip.tipp_tore_heimteam, tip.tipp_tore_gastteam)
        ELSE NULL
    END  AS tip
FROM
    {$SAISON_Partien}  AS part,
    {$SAISON_Tipps} AS tip
    ON part.id_partien = tip.id_partien
WHERE
    part.spieltag = {$ST}
    AND tip.final = '1'
ORDER BY
    part.spieltag
    AND tip.username

Ganz wichtig. FORMATIERE DEIN CODE. Dann erkennst du selber was für ein foreach-Chaos du hast.

Bei der Ausgabe der User hast du ein Chaos
1) von wo bis wo geht die Schleife foreach($users as $user) ?
2) foreach($game['tipps'] as $user => $tipp){ nimmt in deinem Fall nur das letzte Spiel

Hier mal die Version wie ich es lösen würde.Das ganze ungetestet und ohne Gewär
PHP:
<?php

error_reporting(E_ALL);  #Verbindung zur SQL Datenbank herstellen
$db_link = @mysql_connect($dbhost, $dbusername, $dbpasswort); 
mysql_select_db($dbname); 


//Alle Spiele mit den dazuhgehörigen Tipps für Spieltag 1 auswählen
$sql = <<<SQL
    SELECT
        part.id_partien,
        part.heimteam,
        part.gastteam,
        CONCAT_WS(':',part.tore_heimteam, part.tore_gastteam) AS tore,
        CONCAT_WS('&#124;',tip.datum, tip.zeit) AS final,
        tip.username,
        CASE
            WHEN part.id_partien = tip.id_partien
            THEN tip.punkte
            ELSE NULL
        END  AS punkte
        CASE
            WHEN part.id_partien = tip.id_partien
            THEN CONCAT_WS(':',tip.tipp_tore_heimteam, tip.tipp_tore_gastteam)
            ELSE NULL
        END  AS tip
    FROM
        {$SAISON_Partien}  AS part,
        {$SAISON_Tipps} AS tip
        ON part.id_partien = tip.id_partien
    WHERE
        part.spieltag = {$ST}
        AND tip.final = '1'
    ORDE BY
        part.spieltag
        AND tip.username
SQL;

$result = mysql_query($sql);
$games = array();
//Ich verwende objekt, da es sonst ein lese-Chaos mit den Arrays gibt
while($row = mysql_fetch_object($result)){
    //Pro Spiel die Spielinfos nur einmal setzen
    if(!array_key_exists($row->id_partien, $games)){
        $games[$row->id_partien]['heimteam'] = $row->heimteam;
        $games[$row->id_partien]['gastteam'] = $row->gastteam;
        $games[$row->id_partien]['tore'] = $row->tore;
        $games[$row->id_partien]['tipps'] = array();
    }
    //User-Tipps abfüllen
    $games[$row->id_partien]['tipps'][$row->username] =  $row->tip; 
}
//Ausgabe
echo "  <div style='overflow:scroll; overflow-x:auto; overflow-y:hidden;width:1000px;'>
<table style='border: 1px solid #000;border-collapse: collapse;background-color: #fff;width: 1000px;font-size:11px;white-space:nowrap;'>\n";

//HTML-Vorlage für Spielzeile
$gamePattern = <<<HTML
    <tr style='border-bottom: 2px solid #000;'>
        <td>Paarungen</td>
        <td style='width: 30px;'><center><img src='/img/logos/%s.png'/></center></td>
        <td style='text-align:center;'>&nbsp;%s&nbsp;</td>
        <td style='width: 30px;'><center><img src='/img/logos/%s.png'/></center></td>";
    </tr>
HTML;

//HTML-Vorlage für die Tippzeile
$tippPattern = <<<HTML
    <tr style='border-right: 1px solid #000;'>
        <td>%s</td>
        <td colspan='3' style='text-align:center;'>%s</td>
    </tr>\n
HTML;

foreach($games as $game){
    //Spielzeile ausgeben
    echo sprintf($gamePattern, $game['heimteam'], $game['tore'], $game['gastteam']);
    // Pro User eine Zeile ausgeben
    foreach($game['tipps'] as $user => $tipp){
        echo sprintf($tippPattern, $user, $tipp);
    }
}
?>
</table></div>
 
Hallo und herzlichen Dank für die freundliche Hilfe.
Ich habe nun deinen Code versucht in meinen zu intigrieren,
das hat anfangs nicht so wie gewünscht geklappt. Ich habe dann deine SQL Abfrage durch meine
ursprüngliche ersetzt und habe den gewünschten Erfolg erhalten.

Allerdings gibt es noch ein Problem mit der Darstellung, um das besser erklären zu können nachstehenden die entsprechenden Links:

Username: test
Passwort: test
Bitte erst unter das-tippspiel.eu einloggen und dann die entsprechenden Links aufrufen, danke !
Werde den User morgen wieder löschen.

#1 Wie ich es mir wünsche das es aussieht!
Hier stimmen allerdings die ausgegebenen Werte nicht, aber graphisch ist es so wie es sein soll
Link

#2 Dein Code Yaslaw inkl. deiner SQL Abfrage, leider liest er nur manche Tipps der Spieler aus,
ich verstehe nicht warum.
Link

#3 Eine Mischung aus beiden Codes
Hier werden alle Daten richtig ausgelesen, allerdings nocht nicht richtig dargestellt.
Für Jedes Spielpaarung erstellt er eine neue Tabelle. Allerdings ist es mein Ziel ( so wie in #1 Dargestellt)
Die Tabelle nur um jeden Spieler nach unten zu erweiteren.
Link

Hier nun noch der entsprechende Code zu #3

PHP:
<?php
//Zum testen habe ich den Spieltag festgelegt
$ST = 1;

error_reporting(E_ALL);  #Verbindung zur SQL Datenbank herstellen
$db_link = @mysql_connect($dbhost, $dbusername, $dbpasswort); 
mysql_select_db($dbname); 
//Alle Spiele mit den dazuhgehörigen Tipps für Spieltag 1 auswählen
$sql = "SELECT
  part.id_partien,
  part.heimteam,
  part.gastteam,
  tip.punkte,
  CONCAT_WS(':',part.tore_heimteam, part.tore_gastteam) AS tore,
  CONCAT_WS('&#124;',tip.datum, tip.zeit) AS final,
  tip.username,
  CONCAT_WS(':',tip.tipp_tore_heimteam, tip.tipp_tore_gastteam) AS tip
  FROM
  ".$SAISON_Partien."  AS part
  LEFT JOIN ".$SAISON_Tipps." AS tip
  ON part.id_partien = tip.id_partien
  WHERE
  part.spieltag = ".$ST."
  AND
  tip.final = '1'";
$result = mysql_query($sql);
$games = array();
//Ich verwende objekt, da es sonst ein lese-Chaos mit den Arrays gibt
while($row = mysql_fetch_object($result)){
  //Pro Spiel die Spielinfos nur einmal setzen
  if(!array_key_exists($row->id_partien, $games)){
  $games[$row->id_partien]['heimteam'] = $row->heimteam;
  $games[$row->id_partien]['gastteam'] = $row->gastteam;
  $games[$row->id_partien]['tore'] = $row->tore;
  $games[$row->id_partien]['tipps'] = array();
  }
  //User-Tipps abfüllen
  $games[$row->id_partien]['tipps'][$row->username] =  $row->tip; 
}
//Ausgabe
echo "  <div style='overflow:scroll; overflow-x:auto; overflow-y:hidden;width:1000px;'>
<table style='border: 1px solid #000;border-collapse: collapse;background-color: #fff;width: 1000px;font-size:11px;white-space:nowrap;'>\n";
//HTML-Vorlage für Spielzeile
$gamePattern = <<<HTML
  <tr style='border-bottom: 2px solid #000;'>
  <td>Paarungen</td>
  <td style='width: 30px;'><center><img src='/img/logos/%s.png'/></center></td>
  <td style='text-align:center;'>&nbsp;%s&nbsp;</td>
  <td style='width: 30px;'><center><img src='/img/logos/%s.png'/></center></td>
  </tr>
HTML;
$tippPattern = <<<HTML
  <tr style='border-right: 1px solid #000;'>
  <td>%s</td>
  <td colspan='3' style='text-align:center;'>%s</td>
  </tr>\n
HTML;
foreach($games as $game){
  //Spielzeile ausgeben
  echo sprintf($gamePattern, $game['heimteam'], $game['tore'], $game['gastteam']);
  // Pro User eine Zeile ausgeben
  foreach($game['tipps'] as $user => $tipp){
  echo sprintf($tippPattern, $user, $tipp);
  }
}

$result = mysql_query($sql) OR  
die("Query: <pre>".$sql."</pre>\n".  
"Antwoertchen: ".mysql_error());
mysql_close($sql);
?>
</table></div>
 
Sorry, komme nur auf die Startseite. Da ich dem Fussball aus dem Weg gehe, werde ich auch keinen Account erstellen.
 
Habe ich auch festgestellt und euch einen Test Account angelegt, sorry für die Umstände:

Username: test
Passwort: test
Bitte erst unter das-tippspiel.eu einloggen und dann die entsprechenden Links aufrufen, danke !
Werde den User morgen wieder löschen.
 
Dein Code ist einfach nur falsch!

- Spaghetti-Code (wie @alxy bereits erwähnte!)
- Alte MySQL-Erweiterung
- SQL Injection Lücken
- Öffentliche Fehlerausgabe (inkl. deines SQL-Queries)
- Usability-Fehler (Nutzernamen können keine Anführungszeichen enthalten - steht mit den SQL Injection Lücken im Zusammenhang)
- MD5 als Passwordhash-Methode
- "SELECT * FROM" - weniger schlimm, aber trotzdem!

Ich wette, dass du auch noch diverse XSS-Lücken hast. CSRF vielleicht auch.

Lass das Projekt bitte sein, bis du diese Themen nacheinander geklärt hast.
 
Jepp, alles was ComFrak schreibt stimmt.

Aber hier mal meine Umsetzung
SQL:
-- http://sqlfiddle.com/#!2/b6a7e/13

-- Einfach mal alle Partien mit Spieltag 1
SELECT  *
FROM  part
WHERE  spieltag = 1
ORDER BY  id_partien;

-- Alle User mit allen Partien des Spieltages 1 gemixt
-- Gibt pro Kimmbnation user/partie eine Zeile
SELECT
  users.username,
  users.id_partien,
  CASE
  WHEN tip.username IS NULL
  THEN NULL
  ELSE CONCAT(tip.tipp_tore_heimteam, ':', tip.tipp_tore_gastteam)
  END AS tip

FROM
  (
  SELECT DISTINCT
  tip.username,
  part.id_partien
  FROM
  tip,
  part
  WHERE
  part.spieltag = 1
  ) AS users
  LEFT JOIN tip
  ON users.username =tip.username
  AND users.id_partien = tip.id_partien
WHERE
  tip.final = 1
ORDER BY
  users.username,
  users.id_partien;
PHP:
<?php
//Simulation der DB:
//Resultate aus den 2 Queries
//http://sqlfiddle.com/#!2/b6a7e/13
$partien[1] = array('id_partien' => 1, 'heimteam' => 'T1', 'gastteam' => 'T2', 'tore_heimteam' => 1, 'tore_gastteam' => 0);
$partien[2] = array('id_partien' => 2, 'heimteam' => 'T3', 'gastteam' => 'T2', 'tore_heimteam' => 2, 'tore_gastteam' => 3);
//Alle User mit allen Partien
$tipps[] = array('username' => 'U1', 'id_partien' => 1, 'tip' => '2:1');
$tipps[] = array('username' => 'U1', 'id_partien' => 2, 'tip' => '3:2');
$tipps[] = array('username' => 'U2', 'id_partien' => 1, 'tip' => '0:1');
$tipps[] = array('username' => 'U2', 'id_partien' => 2, 'tip' => NULL);

//Die tipps verschachteln array(user, array(tip für Partiy1, tip für partie 2...))
$tipsPerUser = array();
foreach($tipps as $tip){
   $tipsPerUser[$tip['username']][$tip['id_partien']] = $tip['tip'];
}

$partiePattern = <<<HTML
     <td>   
       <table>
         <tr>
           <td><center>%s</center></td>
           <td>%s:%s</td>
           <td><center>%s</center></td>
         </tr>
       </table>
     </td>

HTML;

echo "<table>\n";
echo "  <tr>\n";
echo "  <th>Paarungen</th>\n";
foreach($partien as $partie){
   echo sprintf($partiePattern, $partie['heimteam'], $partie['tore_heimteam'], $partie['tore_gastteam'], $partie['gastteam']);
}
echo "  </tr>\n";

foreach($tipsPerUser as $user => $partieTip){
   echo "  <tr>\n";
   echo "  <th>{$user}</th>\n";
   foreach($partieTip as $tip){
     echo "  <td><center>{$tip}</center></td>\n";
   }
   echo "  </tr>\n";
}
echo "</table>\n";
?>
>

Ausgabe
HTML:
<table>
  <tr>
  <th>Paarungen</th>
     <td>   
       <table>
         <tr>
           <td><center>T1</center></td>
           <td>1:0</td>
           <td><center>T2</center></td>
         </tr>
       </table>
     </td>
     <td>   
       <table>
         <tr>
           <td><center>T3</center></td>
           <td>2:3</td>
           <td><center>T2</center></td>
         </tr>
       </table>
     </td>
  </tr>
  <tr>
  <th>U1</th>
  <td><center>2:1</center></td>
  <td><center>3:2</center></td>
  </tr>
  <tr>
  <th>U2</th>
  <td><center>0:1</center></td>
  <td><center></center></td>
  </tr>
</table>
 
Zurück