[PHP] De loop is niet lekker....

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb nu dit script:

PHP:
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
$division_begin = 1; 
        
$sql_1 = "SELECT DISTINCT division FROM lan_standings WHERE game = '$game_quake3'"; 
$result_1 = mysql_query($sql_1) or die(mysql_error()); 
while ($row_1 = mysql_fetch_object($result_1)){    
            
$division_db = $row_1->division; 
echo $division_db; 
        
$sql1 = "SELECT id FROM lan_standings WHERE game = '$game_quake3' AND division = '$division_begin'"; 
$result1 = mysql_query($sql1) or die(mysql_error()); 
while ($row1 = mysql_fetch_object($result1)){            

$id = $row1->id; 
        
    
} 
} 
        
$i=0; 
            
for ($j = 1; $j<=$id; $j++) 
{ 
for ($g = $j+1; $g<=$id; $g++) 
{ 
                                            
$sql_2 = "SELECT nick_name, division FROM lan_standings WHERE id = $j AND game = '$game_quake3'"; 
$result_2 = mysql_query($sql_2) or die(mysql_error()); 
$row_2 = mysql_fetch_object($result_2); 
                    
$division_p_o_1 = $row_2->division; 
$nicks_1 = $row_2->nick_name; 
                    
$sql_3 = "SELECT nick_name FROM lan_standings WHERE id = $g AND game = '$game_quake3'"; 
$result_3 = mysql_query($sql_3) or die(mysql_error()); 
$row_3 = mysql_fetch_object($result_3); 
                    
$nicks_2 = $row_3->nick_name; 
        
$starting_date = mktime($starting_hour, $starting_minute + $matchtime * $i + $recess * $i , $starting_second, $starting_month, $starting_day, $starting_year); 
$date = date("d-m-Y H:i:s", $starting_date); 
                    
$sql = "INSERT INTO lan_fixtures (player, opponent, starting_date_time, server, game, division, match_time, recess_time) VALUES ('$nicks_1', '$nicks_2', '$date', '$ipserver1', '$game_quake3', '$division_p_o_1', '$matchtime', '$recess')"; 
mysql_query($sql) or die(mysql_error()); 
                                                                    
echo $j.'-'.$g.'<BR>'; 
echo $nicks_1.'-'.$nicks_2.'<BR>'; 
echo $date."<Br>"; 
                    
$i++;                
} 
}    
            
for ($n = $id; $n>=1; $n--) 
{ 
for ($d = $n-1; $d>=1; $d--) 
{ 
$sql_3 = "SELECT nick_name, division FROM lan_standings WHERE id = $n AND game = '$game_quake3'"; 
$result_3 = mysql_query($sql_3) or die(mysql_error()); 
$row_3 = mysql_fetch_object($result_3); 
                    
$division_p_o_2 = $row_3->division; 
$nicks_1 = $row_3->nick_name; 
                    
$sql_4 = "SELECT nick_name FROM lan_standings WHERE id = $d AND game = '$game_quake3'"; 
$result_4 = mysql_query($sql_4) or die(mysql_error()); 
$row_4 = mysql_fetch_object($result_4); 
                    
$nicks_2 = $row_4->nick_name; 
                
$starting_date = mktime($starting_hour, $starting_minute + $matchtime * $i + $recess * $i , $starting_second, $starting_month, $starting_day, $starting_year); 
$date = date("d-m-Y H:i:s", $starting_date); 
                    
if($ipserver2 == ''){ 
$ipserver2 = $ipserver1; 
} 
                    
$sql = "INSERT INTO lan_fixtures (player, opponent, starting_date_time, server, game, division, match_time, recess_time) VALUES ('$nicks_1', '$nicks_2', '$date', '$ipserver2', '$game_quake3', '$division_p_o_2', '$matchtime', '$recess')"; 
mysql_query($sql) or die(mysql_error()); 
            
echo $n.'-'.$d.'<BR>'; 
echo $nicks_1.'-'.$nicks_2.'<BR>'; 

echo $date."<Br>"; 
    
$i++; 
} 
} 
}


Ok een groot stukkie script. Het gaat om het begingedeelte verder doet ie alles goed. Ik heb 2 divisies waarin ieder 3 spelers zitten. Met $division_begin boots ik even na dat ik een divisie nummer heb waarbij hij de id's zoekt. Dat is de Sql1, als ik daar een "1" invul dan vind hij het prima en laat hij dus ook de eerste divisie zien en de spelers daaruit worden netjes tgen elkaar gezet. Als ik van $division_begin een "2" maak dan lijkt het of hij niet kijkt naar de divisie maar hij begint weer bij de eerste id die in divisie 1 zit. Dus divisie 1 wordt weer neergezet.

Dit is de output als ik een nummer 1 nerzet:

121-2
SquaTT-Sonic
10-01-2002 00:00:00
1-3
SquaTT-DeMaX-NL [DQC]
10-01-2002 00:30:00
2-3
Sonic-DeMaX-NL [DQC]
10-01-2002 01:00:00
3-2
DeMaX-NL [DQC]-Sonic
10-01-2002 01:30:00
3-1
DeMaX-NL [DQC]-SquaTT
10-01-2002 02:00:00
2-1
Sonic-SquaTT
10-01-2002 02:30:00

En dit is de output als ik een 2 neerzet:

121-2
SquaTT-Sonic
10-01-2002 00:00:00
1-3
SquaTT-DeMaX-NL [DQC]
10-01-2002 00:30:00
1-4
SquaTT-JEDI
10-01-2002 01:00:00
1-5
SquaTT-Unknown
10-01-2002 01:30:00
1-6
SquaTT-[PN]TheHandyNL
10-01-2002 02:00:00
2-3
Sonic-DeMaX-NL [DQC]
10-01-2002 02:30:00
2-4
Sonic-JEDI
10-01-2002 03:00:00
2-5
Sonic-Unknown
10-01-2002 03:30:00
2-6
Sonic-[PN]TheHandyNL
10-01-2002 04:00:00
3-4
DeMaX-NL [DQC]-JEDI
10-01-2002 04:30:00
3-5
DeMaX-NL [DQC]-Unknown
10-01-2002 05:00:00
3-6
DeMaX-NL [DQC]-[PN]TheHandyNL
10-01-2002 05:30:00
4-5
JEDI-Unknown
10-01-2002 06:00:00
4-6
JEDI-[PN]TheHandyNL
10-01-2002 06:30:00
5-6
Unknown-[PN]TheHandyNL
10-01-2002 07:00:00
6-5
[PN]TheHandyNL-Unknown
10-01-2002 07:30:00
6-4
[PN]TheHandyNL-JEDI
10-01-2002 08:00:00
6-3
[PN]TheHandyNL-DeMaX-NL [DQC]
10-01-2002 08:30:00
6-2
[PN]TheHandyNL-Sonic
10-01-2002 09:00:00
6-1
[PN]TheHandyNL-SquaTT
10-01-2002 09:30:00
5-4
Unknown-JEDI
10-01-2002 10:00:00
5-3
Unknown-DeMaX-NL [DQC]
10-01-2002 10:30:00
5-2

In totaal 30. Wel handig om te weten is dat de nummers die bij het "-" staan de id's zijn.

Wat doe ik nou fout!?!? Please help me!! :'( :?

[ Voor 7% gewijzigd door Verwijderd op 01-12-2002 17:16 ]


Acties:
  • 0 Henk 'm!

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 23-07 18:19
doe ff [php] en [/php] aub :)

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
pardon ben net geregistreerd hier....:)

Nog even een update erbij...ik haal de nummers van de divisies uit de Database......

ik refresh regelmatig dus als er nog meer info bij moet zeg het maar ;)

[ Voor 68% gewijzigd door Verwijderd op 01-12-2002 17:19 ]


Acties:
  • 0 Henk 'm!

  • creative8500
  • Registratie: September 2001
  • Laatst online: 01-02 14:14

creative8500

freedom.

Ok:
• Hoe moet de output er _wel_ uitzien?
• Zeg ff wat duidelijker wat er fout gaat, please. Ik snap echt geen donder van je code :? (mede door 0,niks-verstand van games)

Acties:
  • 0 Henk 'm!

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 23-06 23:17
Kan je ook nog even indenten?
PHP:
1
2
3
4
5
6
while ( $bla ) {
    miep();
    if ( $foo ) {
        moep();
    }
}

Staat ook in de FAQ trouwens. :)

Lijkt me standaard debuggen: je input checken, je output checken, controleren op logische fouten. De while loop is al kiplekker sinds PHP beta1, dus daar zal het niet aan liggen. :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
121-2
SquaTT-Sonic
10-01-2002 00:00:00
1-3
SquaTT-DeMaX-NL [DQC]
10-01-2002 00:30:00
2-3
Sonic-DeMaX-NL [DQC]
10-01-2002 01:00:00
3-2
DeMaX-NL [DQC]-Sonic
10-01-2002 01:30:00
3-1
DeMaX-NL [DQC]-SquaTT
10-01-2002 02:00:00
2-1
Sonic-SquaTT
10-01-2002 02:30:00

Dit is de output van de eerste divisie. Die moet dus eruit komen dat klopt....maar nu gaat de loop verder en komt divisie 2 en dan pakt hij dus weer de eerste divisie erbij...de id's dus die in de eerste divisie zitten.

De mensen die dus in divisie 1 zitten moeten niet meer in de tweede output zitten. Ik heb al veel geprobeerd maar hij gaa voor de helft fout. Dat debuggen lukt me niet meer. heb er teveel naar gekeken denk ik...

Euhh indenten?

Acties:
  • 0 Henk 'm!

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 16-08 06:44

CyberSnooP

^^^^ schrijft --->

Het spijt me te moeten zeggen, maar je verwacht dat wij 89 regels code op fouten controleren zonder ze zelf ontworpen te hebben en dan lever je ze ook nog eens niet prettig aan.

Het wordt voor ons (en waarschijnlijk ook voor jezelf) een heel stuk duidelijker als je niet relevante regels vervangt door iets eenvoudigs, je code van commentaar voorziet en hem netjes opmaakt zoals ook in de FAQ beschreven staat.

Ik verwacht niet dat een GoTter echt de moeite gaat nemen om in jouw hele lap code te duiken.

|_____vakje______|


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok sorry sorry sorry sorry, dan ga ik eerst wel effe bij de faq kijken....en kom ik terug met een goed stuk code ok!?

als je het zelf in je hoofd hebt zitten dan weet e inderdaad waar het over gaat....ik ge het verbeteren!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok ik heb het aangepast.

PHP:
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
// Division_begin is een test ingevoerd door mijzelf. Normaal moet de divisie uit de Database gehaald worden. Hoeveel divisies er zijn staat niet vast.
        $division_begin = 1;
        
        // Hier worden dus de divisies uit de Db gehaald. In lan_standings staan alle "ingeschreven" mensen die mee doen aan dit toernooi. 
        // In deze tabel staat ook geregistreerd  in welke divisie ze zitten. Dus bijvoorbeeld totaal 6 man ingeschreven, 3 mensen in divisie 1
        // en 3 mensen in divisie 2. Omdat er dan 3 keer het nummer  1 en 3 keer het nummer  2 moet DISTINCT gebruikt worden.
        $sql_1 = "SELECT DISTINCT division FROM lan_standings WHERE game = '$game_quake3'"; 
        $result_1 = mysql_query($sql_1) or die(mysql_error()); 
        while ($row_1 = mysql_fetch_object($result_1)){ 
            
            // De divisie wordt gedefinieerd.
            $division_db = $row_1->division;
            // Testje om te kijken of de divisie wel gedefinieerd wordt.
            echo $division_db;
            
            // Tegen de DB: Kijk nogmaals in die tabel lan_standing om te kijken wie er dan bij die divisie horen.
            $sql1 = "SELECT id FROM lan_standings WHERE game = '$game_quake3' AND division = '$division_begin'"; 
            $result1 = mysql_query($sql1) or die(mysql_error()); 
            while ($row1 = mysql_fetch_object($result1)){           
                
                // Pak dan alle id's van die spelers in de DB. Id is hier een methode om een uniek nummer te geven aan elke speler.
                $id = $row1->id;
        
            
            }
        }
        
        // Hier worden de id's neergezet en gebruikt. Wat nou het gekke is, is dat de eerste divisie goed gaat maar de 2de niet meer.
        // $i is een teller die mee loopt om te kijken hoeveel keer de for loop doorloopt en dat aantal wordt bij de tijd geteld.
        $i=0;
        //  De for-loop zorgt voor het verdelen van de id's. Iedereen in de divisie moet een keer tegen elkaar spelen. Een soort "Uit" en "Thuis" systeem zoals bij voetbal. 
        //  De eerste id wordt hier getoont.
        for ($j = 1; $j<=$id; $j++) 
                { 
                    // De tweede id wordt hier dan weer geshowed. Je krijgt dan: 1-2, 1-3, 2-3, enz voor de eerste divisie.
                    for ($g = $j+1; $g<=$id; $g++) 
                    {
                        // Hier wordt de 1ste nick_name van de speler verkregen van de DB.              
                        $sql_2 = "SELECT nick_name FROM lan_standings WHERE id = $j AND game = '$game_quake3'"; 
                        $result_2 = mysql_query($sql_2) or die(mysql_error()); 
                        $row_2 = mysql_fetch_object($result_2);
                    
                        $nicks_1 = $row_2->nick_name;
                        
                        // Hier wordt de 2de nick_name van de speler verkregen van de DB.
                        $sql_3 = "SELECT nick_name FROM lan_standings WHERE id = $g AND game = '$game_quake3'"; 
                        $result_3 = mysql_query($sql_3) or die(mysql_error()); 
                        $row_3 = mysql_fetch_object($result_3);
                    
                        $nicks_2 = $row_3->nick_name;
                        
                        // Hier wordt de datum die ingevoerd is in een form neergezet met een optelling erbij. Het moet natuurlijk niet zo zijn dat er wedstrijden in dezelfde divisie op dezelfde tijd wordt gespeeld. 
                        $starting_date = mktime($starting_hour, $starting_minute + $matchtime * $i + $recess * $i , $starting_second, $starting_month, $starting_day, $starting_year); 
                        $date = date("d-m-Y H:i:s", $starting_date);
                        
                        // Alles wordt ingevored in de Db.
                        $sql = "INSERT INTO lan_fixtures (player, opponent, starting_date_time, server, game, division, match_time, recess_time) VALUES ('$nicks_1', '$nicks_2', '$date', '$ipserver1', '$game_quake3', '$division_p_o_1', '$matchtime', '$recess')";
                        mysql_query($sql) or die(mysql_error());
                        
                        // verificatie voor mijzelf.                                            
                        echo $j.'-'.$g.'<BR>';
                        echo $nicks_1.'-'.$nicks_2.'<BR>';

                        echo $date."<Br>"; 
                    
                        $i++;               
                    }
                }   
            // Dit is allemaal hetzelfde als hierboven alleen andersom.....De bovenste geeft niet alle id's terug die tegen elkaar spelen. Daarbij worden de namen weer genomen en dan wordt alles weer ingevoerd in de Db.
            for ($n = $id; $n>=1; $n--) 
                { 
                    for ($d = $n-1; $d>=1; $d--) 
                    { 
                        $sql_3 = "SELECT nick_name, division FROM lan_standings WHERE id = $n AND game = '$game_quake3'"; 
                        $result_3 = mysql_query($sql_3) or die(mysql_error()); 
                        $row_3 = mysql_fetch_object($result_3);
                    
                        $division_p_o_2 = $row_3->division;
                        $nicks_1 = $row_3->nick_name;
                    
                        $sql_4 = "SELECT nick_name FROM lan_standings WHERE id = $d AND game = '$game_quake3'"; 
                        $result_4 = mysql_query($sql_4) or die(mysql_error()); 
                        $row_4 = mysql_fetch_object($result_4);
                    
                        $nicks_2 = $row_4->nick_name;
                    
                        $starting_date = mktime($starting_hour, $starting_minute + $matchtime * $i + $recess * $i , $starting_second, $starting_month, $starting_day, $starting_year); 
                        $date = date("d-m-Y H:i:s", $starting_date);
                    
                        if($ipserver2 == ''){
                            $ipserver2 = $ipserver1;
                        }
                    
                        $sql = "INSERT INTO lan_fixtures (player, opponent, starting_date_time, server, game, division, match_time, recess_time) VALUES ('$nicks_1', '$nicks_2', '$date', '$ipserver2', '$game_quake3', '$division_p_o_2', '$matchtime', '$recess')";
                        mysql_query($sql) or die(mysql_error());
                
                        echo $n.'-'.$d.'<BR>';
                        echo $nicks_1.'-'.$nicks_2.'<BR>';

                        echo $date."<Br>"; 
                    
                        $i++;
                    }
                }
            }


De output van dit script is nu :

De eerste twee nummers is de echo van de divisies. Daarna komt de eerste id tegen de tweede. De namen die bij de id's horen en daaronder dan weer de tijd.

Deze mensen zitten dus in de eerste divisie.

121-2
SquaTT-Sonic
10-01-2002 00:00:00
1-3
SquaTT-DeMaX-NL [DQC]
10-01-2002 00:30:00
2-3
Sonic-DeMaX-NL [DQC]
10-01-2002 01:00:00
3-2
DeMaX-NL [DQC]-Sonic
10-01-2002 01:30:00
3-1
DeMaX-NL [DQC]-SquaTT
10-01-2002 02:00:00
2-1
Sonic-SquaTT
10-01-2002 02:30:00

Alleen als ik nu de tweede divisie doe dan komt de eerste divisie daar ook doorheen. Maar hij moet alleen mensen die in de tweede divisie zitten pakken. Maar dat doet hij niet. Kan iemand dan nog een keer kijken?!

Tnx! :)

Acties:
  • 0 Henk 'm!

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 16-08 06:44

CyberSnooP

^^^^ schrijft --->

Je code zit helaas niet logisch in elkaar en ik vrees dat je wat gedachtes door elkaar haalt:
Je neemt aan dat ids opeenvolgend zijn en dat mensen binnen dezelfde divisie gewoon een id hebben wat lager is dan diegene met het hoogste id in de divisie. Erg vreemd.
Bovendien is je loop niet lekker omdat je onwijs veel queries doet voor een relatief eenvoudig probleem dacht ik zo.

Jouw probleem (in mijn ogen):
Je hebt een lijst van spelers in divisies en je wilt voor elke divisie een speelschema opstellen waarbij elke speler in die divisie twee keer tegen elke andere speler speelt.

Wat ik dus zou doen is:
• Maak een array met alle spelers in een divisie
• Voor elke speler in die array, laat hem spelen tegen elke andere speler in die array (door ze toe te voegen aan een andere array bijvoorbeeld)
• Dupliceer die array waarbij je de spelers omwisseld (om zo uit en thuis te krijgen).

Er zijn 10-talen manieren om het te doen, maar het lijkt bij jou bij het eerste stapje al mis te gaan ($id is geen array maar een variabele, je overschrijft de waarde daarvan in een while loop zonder er tussentijds iets mee te doen).

|_____vakje______|


Acties:
  • 0 Henk 'm!

  • Sonic
  • Registratie: Februari 2000
  • Laatst online: 10:20
Mischien nog iemand anders een goed idee of een tip?

Alle hulp is welkom.
Pagina: 1