For loop i html tabell

PHPportalen Forum Index » PHP
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
Gandolf



Medlem i: 5593 dagar

Status: Offline



#742244
Inlägg Skrivet: 2018-08-01 11:37      Ämne: For loop i html tabell Citera

Jag försöker skriva ut en html tabell från en databas. Problemet är att vid utskriften tar den varje tippares första tips och loopar det sen igenom hela kolumnen istället för att ta varje tippares tips på respektive match. Vet inte riktigt vad jag ska ändra på för att få det att funka.

Resultatet av koden nedan kan ses på http://www.fotbolltipset.se/2020/matcher.php


KOD:
1:
$matcher = mysqli_query($conn,"SELECT * ,DATE_FORMAT( gamedate,  '%d %M'  )  AS gamedate FROM matcher LIMIT 0 , 48");
2:
 
3:
$sql = "SELECT A.namn, enamn, SUM( B.points ) + ( C.points ) AS points
4:
FROM userdata A
5:
LEFT OUTER JOIN matchtips B ON ( A.user_id = B.user_id )
6:
LEFT OUTER JOIN extratips C ON ( A.user_id = C.user_id )
7:
WHERE paid = '1'
8:
GROUP BY A.user_id
9:
ORDER BY enamn, namn";
10:
 
11:
$games = $conn->query($sql);
12:
$numofrows = mysqli_num_rows($games);
13:
 
14:
 
15:
print "<div align=center>";
16:
print "<table class=\"kantlinje\" bgcolor=\"#F9F9F9\" border=\"0\" cellpadding=\"4\" cellspacing=\"3\">";
17:
print "<tr><td width=275 colspan=6 class=streck3> <span class=mrubrik>&nbsp;Summa poäng</td>";
18:
 
19:
$rows = array();
20:
while($row = mysqli_fetch_array( $games )){
21:
  $rows[] = $row;
22:
    $class = ($class == 'raknaodd') ? 'raknaeven' : 'raknaodd';
23:
 
24:
    print "<td class=$class width=60 align=center colspan=2>";
25:
    print "<span class=mrubrik>";
26:
    print "{$row["points"]}";
27:
    print "</td>";
28:
}
29:
 
30:
 
31:
 
32:
print "</tr>";
33:
 
34:
print "<tr><td width=40 align=center> <span class=mrubrik>&nbsp;Datum</td>";
35:
print "<td width=50 align=center> <span class=mrubrik>Grupp</td>";
36:
print '<td width=130> <span class=mrubrik>Match</td>';
37:
print '<td width=70 colspan=3> <span class=mrubrik>Resultat</td>';
38:
 
39:
foreach($rows as $row){ 
40:
    $class2 = ($class2 == 'raknaodd') ? 'raknaeven' : 'raknaodd';
41:
 
42:
    print "<td class=$class2 width=60 colspan=2 align=center>";
43:
    print "{$row["namn"]}<br>{$row["enamn"]}</td>";
44:
 
45:
 
46:
}
47:
 
48:
print "</tr>";
49:
 
50:
while ($matchline = mysqli_fetch_array($matcher))
51:
{
52:
 
53:
    $sql = "SELECT A.namn, enamn, B.*
54:
            FROM userdata A
55:
            LEFT OUTER JOIN matchtips B ON ( A.user_id = B.user_id )
56:
            WHERE paid = '1'
57:
            GROUP BY   matchid,enamn,namn";
58:
 
59:
    $predictions = $conn->query($sql);         
60:
 
61:
    $homegoal = ($matchline['homegoal'] == '') ? null : (int)$matchline['homegoal'];
62:
    $awaygoal = ($matchline['awaygoal'] == '') ? null : (int)$matchline['awaygoal'];
63:
 
64:
    print "<tr>";
65:
    print "<td width=40>";
66:
    print "<span class=Text4>&nbsp;";
67:
    print ($matchline["gamedate"]);
68:
    print "</td>";
69:
    print "<td width=50 align=center>";
70:
    print "<span class=Text4>";
71:
    print ($matchline["group"]);
72:
    print "</td>";
73:
    print "<td width=130>";
74:
    print "<span class=Text4>{$matchline["hometeam"]}-{$matchline["awayteam"]}</td>";
75:
    print "<td width=30 align=center>";
76:
    print "<span class=Text4>{$matchline["homegoal"]}-{$matchline["awaygoal"]}</td>";
77:
    print "<td width=20 align=center>";
78:
    print "<span class=Text4>{$matchline["sign"]}</td>";
79:
    print "<td width=20>&nbsp;</td>";       
80:
 
81:
    for ($i = 0; $i < $numofrows; $i++)
82:
    {
83:
        $predictline = mysqli_fetch_array($predictions);
84:
 
85:
        $home_p = $predictline['homescore'];
86:
        $away_p = $predictline['awayscore'];
87:
        $tip = $predictline['sign'];
88:
 
89:
        if ($i % 2)
90:
        {
91:
            $color12 = 'raknaeven';
92:
        }
93:
        else
94:
        {
95:
            $color12 = 'raknaodd';
96:
        }
97:
 
98:
        $colors1 = array(0 => $color12, // feltippad matchpoäng
99:
            1 => 'rakna3' // rättippad matchpoäng
100:
            );
101:
        $colors2 = array(0 => $color12, // feltippat tecken
102:
            1 => 'rakna1' // rättippat tecken
103:
            );
104:
 
105:
        $color1 = $color12;
106:
        $color2 = $color12;
107:
 
108:
 
109:
        if (!empty($tip) && $homegoal !== null)
110:
        {
111:
            $color1 = $colors1[(int)($home_p == $homegoal && $away_p == $awaygoal)];
112:
            $color2 = $colors2[(int)(($homegoal == $awaygoal && $tip == 'X') || ($homegoal >
113:
                $awaygoal && $tip == '1') || ($homegoal < $awaygoal && $tip == '2'))];
114:
        }
115:
 
116:
        print "<td width=45 class=$color1 align=center>";
117:
        print "{$home_p}-{$away_p}";
118:
        print "</td>";
119:
        print "<td width=15 class=$color2 align=center>";
120:
        print "{$tip}";
121:
        print "</td>";
122:
}   
123:
    print "</tr>";
124:
}
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 4598 dagar
Från: Tavesta
Status: Offline



#742245
Inlägg Skrivet: 2018-08-01 13:48      Ämne: Citera

Det du behöver göra är att skilja logik lite mer från presentation.
Först hämtar du data från databasen och ordnar in det i en array som till sin struktur stämmer överens med hur html-tabellen skall se ut.
När du sedan har ALLT data du behöver i arrayen loopar du igenom arrayen och skriver ut allt data i html-tabellen.
Du skall alltså inte använda en enda print eller echo innan du har allt data du behöver.

Jag antar att varje match har någon form av id. Det kan du använda som nyckel i arrayen:


PHP:
1:
 //Fyll arrayen med data från ett databasresultat:
2:
$rows[$row['matchid']] = $row;
3:
 
4:
//Komplettera med data från ett annat databasresultat:
5:
$rows[$matchline['matchid']]['matchline'] = $matchline;
6:
 
7:
//Om ett senare databasresultat innehåller flera poster till varje match kan du ha en array i arrayen:
8:
$rows[$matchline['matchid']]['matchlines'][] = $matchline;
9:
 
10:
När du sedan loopar ut det datat i html-tabellen behöver du i så fall nästlade loopar:
11:
foreach($rows as $matchid=>$row) {
12:
  //printa ut det som skall printas ut
13:
  foreach($row['matchlines'] as $matchline) {
14:
    //printa vad som skall printas här.
15:
  }
16:
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Gandolf



Medlem i: 5593 dagar

Status: Offline



#742246
Inlägg Skrivet: 2018-08-01 18:21      Ämne: Citera

Tack för utförligt svar. Jag får dock inte ihop det. Jag dribblar bort mig nånstans och får inte till det. Precis som du misstänker har varje match ett eget id.

Databasen består av tre tabeller som ser ut som följer.

Tabellen userdata där användarna lagras
user_id, namn, enamn, paid

Tabellen matchtips där användarnas tips och poäng lagras
lid, matchid, user_id, homescore, awayscore, sign, points

Tabellen matcher där matcherna lagras
lid, game_id, group, gamedate, homegoal, awaygoal, sign

Har jag fattat dig rätt att jag ska göra så här?

Med följande får jag fram datan om matcherna som ska ligga i den första for loopen.
KOD:
1:
SELECT * ,DATE_FORMAT( gamedate,  '%d %M'  )  AS gamedate FROM matcher LIMIT 0 , 48


Och med denna fråga tar jag fram tipparna och deras tips som ska ligga i den andra for loopen.
KOD:
1:
SELECT A.namn, enamn, B. *
2:
FROM userdata A
3:
LEFT OUTER JOIN matchtips B ON ( A.user_id = B.user_id )
4:
WHERE paid = '1'
5:
GROUP BY enamn, namn, matchid
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 4598 dagar
Från: Tavesta
Status: Offline



#742247
Inlägg Skrivet: 2018-08-02 00:07      Ämne: Citera

Det är väldigt många detaljer i din kod som jag inte är insatt i, och inte heller har tid att sätta mig in i nu. Jag skall strax resa bort och kommer inte ha tid att sitta något framför datorn de närmsta dagarna.

Men du kan få ett par tips om hur du kan gripa dig an problemet:

For-loopar är ganska avancerade att använda i sådana här sammanhang. Men du kanske menar while-loopar?

Testkör dina databasfrågor och kontrollera att de ger precis det datat du behöver. Du kan använda verktyg som phpmyadmin till det, eller loopa igenom resultatet och printa ut alla resultatrader med var_dump().

Bestäm en struktur för arrayen där du mellanlagrar datat
Jag hade nog valt en lösning med nästlade arrayer, där matchtipsen ligger i en underordnad array.

Om dina databasfrågor inte behöver något indata är det bara att köra dem i tur och ordning och fylla resultatet i arrayen.
Men eftersom din första databasfråga innehåller "LIMIT 0, 48" misstänker jag att det inte är fullt så enkelt. Dina övriga databasfrågor borde ju också vara begränsade till just de matcher som din första databasfråga returnerar.
När du använder LIMIT kan det vara lämpligt att kombinera det med ORDER BY så att det urval som returneras är väldefinierat, och inte kan variera av till synes slumpartade omständigheter.
Jag misstänker att du kan behöva förfina databasfrågorna en del.
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Gandolf



Medlem i: 5593 dagar

Status: Offline



#742248
Inlägg Skrivet: 2018-08-04 10:35      Ämne: Citera

Jag har ändrat lite i koden nu och får ut all data från databasen. Dock blir HTML-tabellen fortfarande lite konstig. Första raden ser helt okej ut. Matchen och tipparnas tips ligger på samma rad. Men sen spårar det ur. Alla tippares tips kommer och efter det kommer resten av matcherna. Alla rader ska ju se ut som rad 1.
Detta kan ses på http://www.fotbolltipset.se/2020/matcher2.php

Det känns som att jag är riktig nära det jag vill uppnå nu men nåt fel gör jag i while-looparna.

Koden som genererar denna sida ser ut som nedan.
KOD:
1:
 
2:
$matcher = mysqli_query($conn, "SELECT * ,DATE_FORMAT( gamedate,  '%d %M'  )  AS gamedate FROM matcher LIMIT 0 , 48");
3:
 
4:
$sql = "SELECT A.namn, enamn, SUM( B.points ) + ( C.points ) AS points
5:
FROM userdata A
6:
LEFT OUTER JOIN matchtips B ON ( A.user_id = B.user_id )
7:
LEFT OUTER JOIN extratips C ON ( A.user_id = C.user_id )
8:
WHERE paid = '1'
9:
GROUP BY A.user_id
10:
ORDER BY enamn, namn";
11:
$games = $conn->query($sql);
12:
 
13:
$numofrows = mysqli_num_rows($games);
14:
 
15:
$sql = "SELECT A.namn, enamn, B.*
16:
            FROM userdata A
17:
            LEFT OUTER JOIN matchtips B ON ( A.user_id = B.user_id )
18:
            WHERE paid = '1'
19:
            GROUP BY   matchid,enamn,namn";
20:
$predictions = $conn->query($sql);
21:
 
22:
print "<div align=center>";
23:
print "<table class=\"kantlinje\" bgcolor=\"#F9F9F9\" border=\"0\" cellpadding=\"4\" cellspacing=\"3\">";
24:
print "<tr><td width=275 colspan=6 class=streck3> <span class=mrubrik>&nbsp;Summa poäng</td>";
25:
 
26:
$rows = array();
27:
while ($row = mysqli_fetch_array($games))
28:
   {
29:
   $rows[] = $row;
30:
   $class = ($class == 'raknaodd') ? 'raknaeven' : 'raknaodd';
31:
   print "<td class=$class width=60 align=center colspan=2>";
32:
   print "<span class=mrubrik>";
33:
   print "{$row["points"]}";
34:
   print "</td>";
35:
   }
36:
 
37:
print "</tr>";
38:
print "<tr><td width=40 align=center> <span class=mrubrik>&nbsp;Datum</td>";
39:
print "<td width=50 align=center> <span class=mrubrik>Grupp</td>";
40:
print '<td width=130> <span class=mrubrik>Match</td>';
41:
print '<td width=70 colspan=3> <span class=mrubrik>Resultat</td>';
42:
 
43:
foreach($rows as $row)
44:
   {
45:
   $class2 = ($class2 == 'raknaodd') ? 'raknaeven' : 'raknaodd';
46:
   print "<td class=$class2 width=60 colspan=2 align=center>";
47:
   print "{$row["namn"]}<br />{$row["enamn"]}</td>";
48:
   }
49:
 
50:
print "</tr>";
51:
 
52:
while ($matchline = mysqli_fetch_assoc($matcher))
53:
   {
54:
   $homegoal = ($matchline['homegoal'] == '') ? null : (int)$matchline['homegoal'];
55:
   $awaygoal = ($matchline['awaygoal'] == '') ? null : (int)$matchline['awaygoal'];
56:
   print "<tr>";
57:
   print "<td width=40>";
58:
   print "<span class=Text4>&nbsp;";
59:
   print ($matchline["gamedate"]);
60:
   print "</td>";
61:
   print "<td width=50 align=center>";
62:
   print "<span class=Text4>";
63:
   print ($matchline["group"]);
64:
   print "</td>";
65:
   print "<td width=130>";
66:
   print "<span class=Text4>{$matchline["hometeam"]}-{$matchline["awayteam"]}</td>";
67:
   print "<td width=30 align=center>";
68:
   print "<span class=Text4>{$matchline["homegoal"]}-{$matchline["awaygoal"]}</td>";
69:
   print "<td width=20 align=center>";
70:
   print "<span class=Text4>{$matchline["sign"]}</td>";
71:
   print "<td width=20>&nbsp;</td>";
72:
   $n = $numofrows;
73:
   $i = 0;
74:
   while ($predictline = mysqli_fetch_assoc($predictions))
75:
      {
76:
      $home_p = $predictline['homescore'];
77:
      $away_p = $predictline['awayscore'];
78:
      $tip = $predictline['sign'];
79:
      if ($i % 2)
80:
         {
81:
         $color12 = 'raknaeven';
82:
         }
83:
        else
84:
         {
85:
         $color12 = 'raknaodd';
86:
         }
87:
 
88:
      $colors1 = array(
89:
         0 => $color12,
90:
         1 => 'rakna3'
91:
      );
92:
      $colors2 = array(
93:
         0 => $color12,
94:
         1 => 'rakna1'
95:
      );
96:
      $color1 = $color12;
97:
      $color2 = $color12;
98:
      if (!empty($tip) && $homegoal !== null)
99:
         {
100:
         $color1 = $colors1[(int)($home_p == $homegoal && $away_p == $awaygoal) ];
101:
         $color2 = $colors2[(int)(($homegoal == $awaygoal && $tip == 'X') || ($homegoal > $awaygoal && $tip == '1') || ($homegoal < $awaygoal && $tip == '2')) ];
102:
         }
103:
 
104:
      print "<td width=45 class=$color1 align=center>";
105:
      print "{$home_p}-{$away_p}";
106:
      print "</td>";
107:
      print "<td width=15 class=$color2 align=center>";
108:
      print "{$tip}";
109:
      print "</td>";
110:
      $i++;
111:
      if ($i == $n)
112:
         {
113:
         echo "<tr>";
114:
         $i = 0;
115:
         }
116:
      }
117:
   }
118:
 
119:
print "</td>";
120:
print "</tr>";
121:
print "</table>";
122:
print "</div>";
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 4598 dagar
Från: Tavesta
Status: Offline



#742251
Inlägg Skrivet: 2018-08-07 12:32      Ämne: Citera

Som jag skrev tidigare så måste du nog separera inhämtandet av data mer från skapandet av html-tabellen.

Försök få till så att du har dina while-loopar först, och att dessa inte printar något, utan bara sparar allt data till $rows.
När $rows innehåller allt du behöver så kör du din foreach-loop, och det är bara där du printar ut tabellrader.
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Gandolf



Medlem i: 5593 dagar

Status: Offline



#742252
Inlägg Skrivet: 2018-08-07 17:31      Ämne: Citera

Då har jag fått ned koden till detta. Nu äntligen skriver den ut tabelldatat som jag vill. Återstår ett problem bara. Varifrån kommer nonsenstexten i utskriften? http://www.fotbolltipset.se/2020/test.php

Jag menar alltså texten typ denna som dyker upp på varje rad i utskriften mellan matcherna och användarnas tips.

- - - - - - 0-6 - n-i a-n d a-n d a-r a a-r a - - - - - - n-i

Jag har även lagt till en print_r på $rows så man kan se hur arrayen är uppbyggd.

KOD:
1:
$matcher = mysqli_query($conn, "SELECT * ,DATE_FORMAT( gamedate,  '%d %M'  )  AS gamedate FROM matcher LIMIT 0 , 48");
2:
 
3:
$sql = "SELECT A.namn, enamn, B.*
4:
            FROM userdata A
5:
            LEFT OUTER JOIN matchtips B ON ( A.user_id = B.user_id )
6:
            WHERE paid = '1'
7:
            GROUP BY   matchid,enamn,namn";
8:
$predictions = $conn->query($sql);
9:
 
10:
 
11:
while ($row = mysqli_fetch_array($matcher))
12:
   {
13:
$rows[$row['game_id']] = $row;
14:
}
15:
 
16:
while ($row=mysqli_fetch_array($predictions))
17:
   {
18:
       $rows[$row['matchid']][] = $row;
19:
}
20:
 
21:
echo "<table class='kantlinje' bgcolor='#F9F9F9' border='0' cellpadding='4' cellspacing='3'>\n";
22:
    foreach ($rows as $game_id => $row)
23:
            {
24:
                echo "<tr>";
25:
                echo "<td>$row[game_id] $row[grupp] $row[gamedate] $row[hometeam]-$row[awayteam] $row[homegoal]-$row[awaygoal] $row[sign]</td>";
26:
                foreach($row as $row)
27:
                {
28:
                    echo "<td>$row[5]-$row[6] $row[7]</td>";
29:
                }
30:
                echo "</tr>";
31:
            }
32:
echo "</table>";
33:
 
34:
print_r($rows);
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 4598 dagar
Från: Tavesta
Status: Offline



#742256
Inlägget är accepterad som det rätta svaret Skrivet: 2018-08-08 13:11      Ämne: Citera

På rad 26 har du
PHP:
26:
 foreach($row as $row)  

Där borde du istället ha
PHP:
26:
 foreach($row as $någotannat

I annat fall kan det bli lite svårförutsägbart vad som kommer hända.



Skräpet beror på att du loopar igenom hela $row, och inte bara tipsen, i din underordnade foreachloop.
Du borde se till att tipsen hamnar i en egen underordnad array:
PHP:
18:
        $rows[$row['matchid']]['predictions'][] = $row;  


Rad 26 blir då så här ungefär:
PHP:
26:
 foreach($row['predictions'] as $något
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Gandolf



Medlem i: 5593 dagar

Status: Offline



#742258
Inlägg Skrivet: 2018-08-08 19:52      Ämne: Citera

Stort tack för hjälpen harald_b. Bra förklarat hela tiden. Har lärt mig en hel del om arrayuppbyggnad och loopar under vägen till målet.
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget
PHPportalen Forum Index » PHP
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic