Probleem met opdracht voor cursus PHP en MySQL

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Michel Bak

Michel Bak

19/05/2017 09:41:18
Quote Anchor link
Hallo,

Ik ben net begonnen met een cursus PHP en MySQL professional, echter zit ik met een script probleem:
De opdracht:
Bezoekers van de site zien de actuele stand in de poule, de uitslagen van alle gespeelde wedstrijden en de nog te spelen wedstrijden. De poule moet worden gesorteerd met het team met de meeste punten bovenaan. Als dat gelijk is, moet het team met het beste doelsaldo bovenaan worden gezet. De wedstrijden moeten op basis van gespeelde datums worden gesorteerd met de oudste bovenaan.
Dit betekent dat de stand boven aan moet staan, daaronder de uitslagen en daar weer onder de te spelen wedstrijden.

Probleem, het lukt mij niet om de uitslagen en de nog te spelen wedstrijden te verdelen in 2 groepen:
Mijn script (voor de website, overige pagina's niet inbegrepen):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Inzendopgave 051R5</title>
<link rel="stylesheet" href="css/style.css" type="text/css">
</head>
<body>
<?php
//Includeren van database connectie en functies
include "db_connect.php";
include "functions.php";

//Starten van de sessie
session_start();

$message="";
$matchtabelCaption = "Competitieschema";
$matchtabelCaption2 = "Uitslagen";
$telteams = 0;
$equalstandings = 0;
$pouletabelmsg = "";

$error = false;

//Ophalen van matchdata en teamdata
$matchdataquery = "SELECT * FROM competitieschema ORDER BY datum ASC";
$matchdataresult = mysqli_query($connect, $matchdataquery) or die("De tabellen voor matchdata en teamdata zijn nog niet aangemaakt.<a href=index.php>klik hier</a> om terug te keren");

$matchtabel = "";
$matchnumrows = mysqli_num_rows($matchdataresult);

if($matchnumrows > 0){
    while($matchdata = mysqli_fetch_assoc($matchdataresult)){

        //toewijzen van data aan variable van associatieve array
        $matchID = $matchdata['matchID'];
        $thuisID = $matchdata['thuis'];
        $uitID = $matchdata['uit'];
        $datumdb = $matchdata['datum'];
        $datum = date("d-m-Y", strtotime($datumdb));
        $scorethuis = $matchdata['scorethuis'];
        $scoreuit = $matchdata['scoreuit'];

        if($scorethuis == NULL){
            $scorethuis = NULL;
        }


        if($scoreuit == NULL){
            $scoreuit = NULL;
        }


        //Ophalen van teamnaam en plaats van table voetbalteams
        $teamnameQuery = "SELECT teamID, team, plaats FROM voetbalteams WHERE (teamID = '$thuisID' OR teamID = '$uitID');";
        $teamnameResult = mysqli_query($connect, $teamnameQuery) or die("De tabellen voor de teamnamen en locatie zijn nog niet aangemaakt. <a href=index.php>klik hier</a> om terug te keren");

        if($teamnameResult){
            for($i= 0; $i< mysqli_num_rows($teamnameResult); $i++){
                $teamnameArray [$i] = mysqli_fetch_row($teamnameResult);
            }


            //Toewijzen data aan variabelen
            if($teamnameArray[0][0] == $thuisID){
                $thuisname = $teamnameArray[0][1];
                $plaats = $teamnameArray[0][2];
                $uitname = $teamnameArray[1][1];
            }
else{
                $thuisname = $teamnameArray[1][1];
                $plaats = $teamnameArray[1][2];
                $uitname = $teamnameArray[0][1];
            }

            
            //Toevoegen van plaatjes aan de juiste teams
            $thuisimg = '<img alt="'.$thuisname.'" src="images/'.strtolower($thuisname).'.jpg">';
            $uitimg = '<img alt="'.$uitname.'" src="images/'.strtolower($uitname).'.jpg">';
            
            $datumlink = $datum;
            
            //Data opslaan in variable om te tonen op het scherm
            if(isset($_SESSION['userID'])){            
                if($scorethuis == NULL && $scoreuit == NULL){
                    $datumlink = '<a href="score.php?matchID='.$matchID.'">'.$datum .'</a>';
                }
            }

            $matchtabel .= "<tr>
                                <td>$thuisimg"
." "."$thuisname</td>
                                <td>$uitimg"
." "."$uitname</td>
                                <td>$scorethuis : $scoreuit</td>
                                <td>$plaats</td>
                                <td>$datumlink</td>
                            </tr>"
;
        }
    }
}
else{
    $matchtabelCaption = "Er zijn nog geen wedstrijden toegevoegd. Log in om een wedstrijd toe te voegen of registreer een account.";
    $matchtabel = "";
    
    if(!empty($_SESSION['userID'])){
    $matchtabelCaption = "Er zijn nog geen wedstrijden toegevoegd.";
    }
}



//Ophalen van de data voor de pouletabel
$pouledataquery = "SELECT teamID, team, speelsterkte FROM voetbalteams;";
$pouledataresult = mysqli_query($connect, $pouledataquery) or die("De tabellen voor de poule zijn nog niet aangemaakt. <a href=index.php>klik hier</a> om terug te keren");

//Controleren of er rijen zijn met data
$poulenumrows = mysqli_num_rows($pouledataresult);
$pouletabel = "";

//Door de data heenlopen en deze opslaan in een array om deze op het scherm te tonen
if($poulenumrows > 0){
    while($pouledata = mysqli_fetch_assoc($pouledataresult)){

        //Toewijzen van data aan variable van assoc array
        $teamID = $pouledata['teamID'];
        $team = $pouledata['team'];
        $speelsterkte = $pouledata['speelsterkte'];
        $pouleimg = "<img alt=".$team." src=\"images/".strtolower($team).".jpg\">";

        //reset veriabelen
        $scoreVoor = 0;
        $scoreTegen = 0;
        $wins = 0;
        $even = 0;
        $loss = 0;
        $stand = 0;
        $nettscore = 0;
        $telmatches = 0;

        //Ophalen van data van gespeelde wedstrijden om de wedstrijd data te tonen op het scherm
        $playedmatchesQuery = "SELECT * FROM competitieschema WHERE (thuis = '$teamID' OR uit = '$teamID');";
        $playedmatchesResult = mysqli_query($connect, $playedmatchesQuery) or die("De tabellen voor de gespeelde wedstrijden zijn nog niet aangemaakt. <a href=index.php>klik hier</a> om terug te keren");

        if($playedmatchesResult){
            while($playedmatches = mysqli_fetch_assoc($playedmatchesResult)){
                
                $matchthuisID = $playedmatches['thuis'];
                $matchtuitID = $playedmatches['uit'];
                
                if(!is_null($playedmatches['scorethuis']) && !is_null($playedmatches['scoreuit'])){
                    if($teamID != $matchthuisID){
                        $scoreVoor = $scoreVoor + $playedmatches['scoreuit'];
                        $scoreTegen = $scoreTegen + $playedmatches['scorethuis'];
                        $matchthuisScore = $playedmatches['scoreuit'];
                        $matchuitScore = $playedmatches['scorethuis'];
                    }
else{                  
                        $scoreVoor = $scoreVoor + $playedmatches['scorethuis'];
                        $scoreTegen = $scoreTegen + $playedmatches['scoreuit'];
                        $matchthuisScore = $playedmatches['scorethuis'];
                        $matchuitScore = $playedmatches['scoreuit'];
                    }

                    
                    if($matchthuisScore > $matchuitScore){
                        $wins++;
                        $stand = $stand + 3;
                    }
elseif($matchthuisScore == $matchuitScore){
                        $even++;
                        $stand = $stand + 1;
                    }
else{
                        $loss++;
                    }

                    
                    //Berekenen van doelpuntenbalans
                    $nettscore = $scoreVoor - $scoreTegen;
                    $telmatches++;
                }
            }
        }

        
        $telteams++;

        //Opslaan van data in variable om te sorteren
        $pouletabelArray[$telteams]= array($pouleimg. " " . $team, $speelsterkte, $telmatches, $wins, $even, $loss, $scoreVoor, $scoreTegen, $nettscore, $stand);
    }
}
else{
    $pouletabelmsg = "Geen data beschikbaar";
}



//Sorteren van de array gebasseerd op de stand van de poule
foreach($pouletabelArray as $index => $row){
    $columndoelstand[$index] = $row[8];
    $columnpoulestand[$index] = $row[9];
}


//Sorteren van table gebaseerd op doelsaldo
array_multisort($columnpoulestand, SORT_DESC, $columndoelstand, SORT_DESC, $pouletabelArray);

for($teams = 0; $teams < $poulenumrows; $teams++){
    $pouletabel .= "<tr>";
    for($stats = 0; $stats < count($pouletabelArray[0]); $stats ++){
        $pouletabel .= "<td>".$pouletabelArray[$teams][$stats]."</td>";
    }

    $pouletabel .= "</tr>";
}

?>

<!---Het op het scherm te tonen informatie in HTML met PHP--->

<header>
    <h1>Scorebord</h1>
</header>
<div id="container">
    <div class="nav">
        <?php echo get_navbar($connect);?>
    </div>
    <span class = error><?php echo $message; echo $pouletabelmsg; ?></span>
    <table class="pouletabel">
        <caption>Poule overzicht</caption>
        <tr>
            <th>Team</th>
            <th>Speelsterkte (elo)</th>
            <th>Gespeeld</th>
            <th>Winst</th>
            <th>Gelijkspel</th>
            <th>Verloren</th>
            <th>Goals voor</th>
            <th>Goals tegen</th>
            <th>Doelsaldo</th>
            <th>Poulestand</th>
        </tr>
        <?php echo $pouletabel;?>
    </table>
    <table class="matchtabel">
        <caption><?php echo $matchtabelCaption; ?></caption>
        <tr>
            <?php if(!empty($matchtabel)){echo "<th>Thuis</th>
                                                <th>Uit</th>
                                                <th>Stand</th>
                                                <th>Locatie</th>
                                                <th>Speeldatum</th>"
;}
            ?>

        </tr>
        <?php echo $matchtabel;?>
    </table>
        <table class="matchtabel2">
        <caption><?php echo $matchtabelCaption2; ?></caption>
        <tr>
            <?php if(!empty($matchtabel)){echo "<th>Thuis</th>
                                                <th>Uit</th>
                                                <th>Stand</th>
                                                <th>Locatie</th>
                                                <th>Speeldatum</th>"
;}
            ?>

        </tr>
        <?php echo $matchtabel;?>
    </table>
</div>
</body>
</html>


Ik hoop dat iemand mij kan helpen om dit wel voor elkaar te krijgen, alvast bedankt.

Michel
- Ariën -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 19/05/2017 13:23:11 door - Ariën -
 
PHP hulp

PHP hulp

29/04/2024 21:56:59
 
Thomas van den Heuvel

Thomas van den Heuvel

19/05/2017 16:19:47
Quote Anchor link
Wat ik anders zou aanpakken:
* Het opdelen van verschillende overzichten in verschillende pagina's zodat elke pagina één overzicht toont, dit lijkt mij voor de programmering en iemand die de pagina('s) bekijkt een stuk overzichtelijker.
* Een query in een while-loop is meestal niet optimaal. Wat je zou kunnen doen is de club-id's opsparen (stop ze in een array) en daarna alle club-data in één query ophalen. Zo heb je per overzicht meestal maar 2 queries nodig.
* Ook bij het berekenen van de poulestanden zou je handig gebruik kunnen maken van een soort van datastructuur ((geneste) arrays) waarin je data verzamelt. Aan het einde zou je deze kunnen sorteren met een sorteerfunctie op een soortgelijke wijze als dat je hier doet.

Hier geldt in het algemeen: houd het simpel (1 pagina, 1 doel), en verdeel en heers (splits problemen op in makkelijker behapbare deelproblemen).

Ik begrijp trouwens niet helemaal waar je precies vastloopt? Als je problemen hebt met het maken van onderscheid tussen reeds gespeelde en nog te spelen wedstrijden zorg er dan voor dat je dit op een of andere manier expliciet kan maken, bijvoorbeeld een wedstrijddatum. Ligt deze in de toekomt dan is deze nog niet gespeeld, ligt deze in het verleden dan zou er een score moeten zijn. Of introduceer simpelweg een vlaggetje "gespeeld" ja/nee zodat je hier zelf controle over hebt. Hier kun je dan vervolgens op controleren (WHERE datum < NOW() of WHERE gespeeld = 1 ofzo).
 
Michel Bak

Michel Bak

20/05/2017 18:27:01
Quote Anchor link
Bedankt voor de snelle reactie en alle tips, uiteindelijk heb ik het geheel werkend gekregen! Laatste stukje van je was het meest behulpzaam!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.