Beste medetweakers,
Ik heb een script gemaakt welke highscores ophaalt uit een database. Vervolgens plaats ik de opgehaalde gegevens in een array. Op dit array doe ik vervolgens wat bewerkingen.
Nu is er iets raars aan de hand. Het script maakt gebruik van een recursieve methode.
Wanneer deze "klaar" is returnt deze de highscores (welke opgeslagen zijn in een multidimensionaal array).
Het returnen van het array gaat echter niet goed. Het lijkt wel alsof er helemaal niet gereturned wordt. En dan maakt het niet uit of ik het array probeer te returnen of een getal of een string.
Er wordt gewoon niets gereturned.
Het vreemde is, als ik een andere query gebruik om de highscores op te halen (aanpassen van 1 sql key statement namelijk 'NOT' erbij) dan werkt het wel.
Ik kom er echt niet uit. Het lijkt me zelfs gewoon een php bug.
Weten jullie toevallig waar het niet correct returnen van een variabele aan kan liggen?
Ik weet 100% zeker dat ik bij de return statement kom, en ik weet ook 100% zeker dat de variabele gevuld is. Toch werkt het echter niet.
Ik hoop dat jullie me kunnen helpen.
Groeten,
M
Het gaat om onderstaande code. Wanneer ik in de statement 1 woordje aanpas, namelijk 'NOT', dan werkt het opeens wel. Terwijl de query dan nog steeds dezelfde velden terug geeft en nog steeds genoeg resultaten teruggeeft. Erg vreemd.
Ik doe dus het voglende: Een gebruiker geeft op hoeveel highscores hij of zij terug wil krijgen van de functie. De functie voert vervolgens een query uit (haalt het dubbele aantal highscores op voor het gemak) en zet de verkregen highscores om in een multidimensionaal array.
Van dit array wordt vervolgens gecheckt of er dubbele highscores in voorkomen. Het is namelijk de bedoeling om van elke gebruiker alleen de hoogste highscore weer te geven.
Als er blijkt dat na alle dubelle records eruit te halen er niet genoeg overblijven (minder dan de opgegeven amount), dan wordt de functie nog een keer uitgevoerd. Hierbij worden dan de volgende highscores opgehaald. Dit gaat zo door tot er
1. Genoeg highscores zijn opgehaald
2. Er simpelweg niet genoeg highscores zijn (resultset is empty)
Op het eind return ik vervolgens het verkregen scoreArray, deze wordt echter niet goed teruggegeven. Het score array zit wel vol. Maar ik krijg simpelweg niks terug, dit terwijl ik toch echt wel bij de return statement kom. Als ik daar return 10 doe om het te testen dan werkt het nog steeds niet. Ik vind het in ieder geval erg vreemd. Weten jullie (met al je ervaring) misschien waar het aan ligt?
Ik heb een script gemaakt welke highscores ophaalt uit een database. Vervolgens plaats ik de opgehaalde gegevens in een array. Op dit array doe ik vervolgens wat bewerkingen.
Nu is er iets raars aan de hand. Het script maakt gebruik van een recursieve methode.
Wanneer deze "klaar" is returnt deze de highscores (welke opgeslagen zijn in een multidimensionaal array).
Het returnen van het array gaat echter niet goed. Het lijkt wel alsof er helemaal niet gereturned wordt. En dan maakt het niet uit of ik het array probeer te returnen of een getal of een string.
Er wordt gewoon niets gereturned.
Het vreemde is, als ik een andere query gebruik om de highscores op te halen (aanpassen van 1 sql key statement namelijk 'NOT' erbij) dan werkt het wel.
Ik kom er echt niet uit. Het lijkt me zelfs gewoon een php bug.
Weten jullie toevallig waar het niet correct returnen van een variabele aan kan liggen?
Ik weet 100% zeker dat ik bij de return statement kom, en ik weet ook 100% zeker dat de variabele gevuld is. Toch werkt het echter niet.
Ik hoop dat jullie me kunnen helpen.
Groeten,
M
Het gaat om onderstaande code. Wanneer ik in de statement 1 woordje aanpas, namelijk 'NOT', dan werkt het opeens wel. Terwijl de query dan nog steeds dezelfde velden terug geeft en nog steeds genoeg resultaten teruggeeft. Erg vreemd.
Ik doe dus het voglende: Een gebruiker geeft op hoeveel highscores hij of zij terug wil krijgen van de functie. De functie voert vervolgens een query uit (haalt het dubbele aantal highscores op voor het gemak) en zet de verkregen highscores om in een multidimensionaal array.
Van dit array wordt vervolgens gecheckt of er dubbele highscores in voorkomen. Het is namelijk de bedoeling om van elke gebruiker alleen de hoogste highscore weer te geven.
Als er blijkt dat na alle dubelle records eruit te halen er niet genoeg overblijven (minder dan de opgegeven amount), dan wordt de functie nog een keer uitgevoerd. Hierbij worden dan de volgende highscores opgehaald. Dit gaat zo door tot er
1. Genoeg highscores zijn opgehaald
2. Er simpelweg niet genoeg highscores zijn (resultset is empty)
Op het eind return ik vervolgens het verkregen scoreArray, deze wordt echter niet goed teruggegeven. Het score array zit wel vol. Maar ik krijg simpelweg niks terug, dit terwijl ik toch echt wel bij de return statement kom. Als ik daar return 10 doe om het te testen dan werkt het nog steeds niet. Ik vind het in ieder geval erg vreemd. Weten jullie (met al je ervaring) misschien waar het aan ligt?
PHP: scorefunction
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
| $blaat = filterScores($previousArray, $amount); echo 'blaat: '.$blaat; function filterScores($previousArray, $amount){ $boolDone = false; $sql = "STATEMENT": //Because double entries will be removed by php, get the double amount of needed highscores //If this isnt the first time the funciton is called, then the previous time a lot of doubles were removed //Which lead to the amount of highscores remaining lower then the needed amount. //Get the next bunch of highscores //If this is the first time then get the top amount if(!empty($previousArray)){ $doubleAmount = $amount * 2; $sql .= " LIMIT ".$doubleAmount.",".($doubleAmount*2); }else{ $doubleAmount = $amount * 2; $sql .= " LIMIT ".$doubleAmount; } $result = mysql_query($sql) or die(mysql_error()); //Make sure it doesnt stick in an endless loop (recursive function, recalls itself if amount of results left over isnt enough //But if there just arent any more results in the database then it will never have enough results. With this if statement this will not happen if(mysql_num_rows($result) > 0){ $scoreArray; $counter = 0; while ($row = mysql_fetch_array($result , MYSQL_ASSOC)) { //Create multi dimensional results array //playername trace_score begintime postcode $scoreArray[$counter] = array('playername' => $row['playername'],'trace_score' => $row['trace_score'], 'begintime' => $row['begintime'], 'postcode' => $row['postcode']); $counter++; } //Splice out double records for ($i = 0; $i < count($scoreArray); $i++){ //Row of scoreArray $scoreSubArray = $scoreArray[$i]; //For the row check the whole array for a double for($n = 0; $n < count($scoreArray); $n++){ //If double found (prevent the row itself is counted as a double). $scoreSubArray2 = $scoreArray[$n]; if($scoreSubArray2['playername'] == $scoreSubArray['playername'] && $i != $n){ //Splice it out. array_splice ($scoreArray, $n, 1); $i--; //array_splice ($input, 1, -1); } } } echo 'count PreviousArray: '.count($previousArray); echo 'count scoreArray: '.count($scoreArray); //If there were records in the previous array (which means this isnt the first time the function is called, which means the function has called itself because //there werent enough results. Which means the previousArray is filled with valuable highscores //Paste the just gotten ScoreArray to the previousArray //If previous Array is empty then this is the first time the function is called. if (!empty($previousArray)){ $startLength = count($previousArray); for ($p = 0; $p < count($scoreArray); $p++){ $previousArray[startLength+$p] = $scoreArray[$p]; } }else{ $previousArray = $scoreArray; } //If the previousArray has lesser highscores then required then recall this function, else return the array if (count($previousArray) < $amount){ filterScores($previousArray, $amount); }else{ //echo ' RETURN '.count($previousArray).' <br>'; $boolDone = true; } }else{ //There just arent any more results, so just return it $boolDone = true; } if($boolDone){ return $scoreArray; //return 10, return 'blaat', return wat dan ook werkt simpelweg niet. Terwijl $boolDone wel true wordt... } } |
[ Voor 75% gewijzigd door IkBenAlles op 11-06-2007 14:13 ]
Samen staan we sterk!