PHP For() script gaat niet verder.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Martijn L

Martijn L

16/06/2014 14:17:08
Quote Anchor link
Hallo,

Voor een spelletje ben in begonnen met een systeem om donaties van de leden in familie bij te houden.
Dit heb ik zo gemaakt, dat als ik de logs kopieer en plak bij mijn site dat hij ze automatisch omzet in de juiste soort.
Elke log heeft een aparte eigenschap waarmee ik ze uit elkaar haal.

Ik heb voor bij nieuwe leden automatisch laten regelen dat ze vrije dagen krijgen als ze worden aangenomen.

Hierin zit de "fout". Het script haalt uit een tabel "dag_donatie" de datum die hier wordt beschreven als zondag. Het verschil met de datum dat hij is aangenomen bepaald dan het aantal vrije dagen.
Deze laat ik ook via for gaan zoals hieronder te zien is. (regel 50 t/m 53)

Ik kan de logs wel één voor één invullen dan gaat alles goed, maar meerdere achter elkaar lukt niet.

Als ik dit stuk script weghaal (regel 50 t/m 53) kan ik meerdere logs invullen, maar als er dus een lid inkomt met vrije dagen niet. Hij stopt dan onder for(){} (regel 53)

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
for($i=0; $i < $count; $i++){
   if(preg_match("!\[X\]!",$a[$count-$i-1]) && preg_match("!\$!",$a[$count-$i-1])){
      //NVT
   }
   elseif(preg_match("!aangenomen!",$a[$count-$i-1])){
$newlog            = str_replace("    ", " ", $a[$count-$i-1]);
$new_log        = str_replace("  ", " ", $newlog);
$log            = explode(" ",$new_log);
$datum1            = explode("-",$log[1]);
$datum            = $datum1[2].'-'.$datum1[1].'-'.$datum1[0].' '.$log[0].':00';
$dag            = $datum1[0].'-'.$datum1[1].'-'.$datum1[2];
$week            = date("W",strtotime($dag));
$dweek            = date("w",strtotime($dag));
$get_weeksql    = "SELECT *,UNIX_TIMESTAMP(zondag) AS zondag FROM dag_donatie WHERE donatie_weeknr = '".mysql_real_escape_string($week)."'";
                        $get_usersql    = "SELECT * FROM leden WHERE gebruiker = '".mysql_real_escape_string($log[4])."'";
                        $get_logssql    = "SELECT * FROM logs WHERE gebruiker = '".mysql_real_escape_string($log[4])."' AND
                                          datum = '".mysql_real_escape_string($datum)."' AND
                                          soort    = '2' AND door = '".mysql_real_escape_string($log[2])."'";
                        $userquery        = mysql_query($get_usersql);
                        $donatiewquery    = mysql_query($get_weeksql);
                        $logsquery        = mysql_query($get_logssql);
                        $donatieweek    = mysql_fetch_assoc($donatiewquery);
                        $zondag            = date("Y-m-d",$donatieweek['zondag']);
                        if(mysql_num_rows($userquery) > 0){
                            $userfetch    = mysql_fetch_assoc($userquery);
                            if(mysql_num_rows($logsquery) > 0){
                                // Log already exist
                            }
                            else{
                                $insert_logsql    = "INSERT INTO logs (gebruiker,datum,soort,door)
                                VALUES('".mysql_real_escape_string($log[4])."','".mysql_real_escape_string($datum)."','2','".mysql_real_escape_string($log[2])."')";
                                mysql_query($insert_logsql);
                            }
                            if($userfetch['rank'] == '0'){
                                $update_user    = "UPDATE leden SET rank = '1' WHERE gebruiker = '".mysql_real_escape_string($log[4])."'";
                                mysql_query($update_user);
                            }
                            else{
                                // Do nothing
                            }
                        }
                        else{
                            if(mysql_num_rows($logsquery) > 0){
                                // Log already exist
                            }
                            else{
                                $insert_logsql    = "INSERT INTO logs (gebruiker,datum,soort,door)
                                VALUES('".mysql_real_escape_string($log[4])."','".mysql_real_escape_string($datum)."','2','".mysql_real_escape_string($log[2])."')";
                                if($dweek > 0){
                                    for($i=1; $i <= $dweek; $i++){
                                        $insert_freedaysql    = "INSERT INTO d_vrije_dagen (gebruiker,datum,door,reden) VALUES('".mysql_real_escape_string($log[4])."','".mysql_real_escape_string(date("Y-m-d",$donatieweek['zondag']+(86400*$i)))."','".mysql_real_escape_string($_SESSION['gebruikersnaam'])."','Nieuw')";
                                        mysql_query($insert_freedaysql);
                                    }
                                }
                                else{
                                    // Geen vrije dagen
                                }
                                mysql_query($insert_logsql);
                            }
                            $insert_user    = "INSERT INTO leden (gebruiker,datum,rank) VALUES('".mysql_real_escape_string($log[4])."','".mysql_real_escape_string($datum)."','1')";
                            mysql_query($insert_user);
                        }
}
Gewijzigd op 16/06/2014 14:18:24 door Martijn L
 
PHP hulp

PHP hulp

29/03/2024 08:59:05
 
Erwin H

Erwin H

16/06/2014 15:54:23
Quote Anchor link
Goed programmeren begint met weten waar je mee bezig bent. Met dat in het achterhoofd, waarom voer je een mysql_real_escape_string uit over een waarde die met de php functie date() hebt gemaakt? Denk je werkelijk dat dat een sql injectie poging kan opleveren?

Zolang je geen foutafhandeling toevoegt aan je queries is het zoeken naar de welbekende speld in de hooiberg. Daar heb ik geen zin in, maar jij waarschijnlijk ook niet. Voeg dus foutafhandeling (en eventueel fout logging) toe, zodat je gewoon direct kunt zien wat er aan de hand is.

Verder is je script compleet onleesbaar door het gebrek aan relevant commentaar ertussen. Begin daar ook eens aan, dan kan jezelf ook nog eens zien waar je mee bezig bent.
Gewijzigd op 16/06/2014 15:54:47 door Erwin H
 
Martijn L

Martijn L

16/06/2014 16:11:00
Quote Anchor link
Erwin H op 16/06/2014 15:54:23:


Ik heb geprobeerd door query's te laten weergeven of hij hem pakt. Als ik regel 50 t/m 53 weghaal werkt het script volledig.

Het werkt zoals het er nu staat tot aan het einde van regel 53.

En over die mysql_real_escape_string heb je een goed punt. Heb mezelf voor geleerd overal dit toe te passen wat in een sql staat.

Betreft de foutafhandeling denk jij aan elke query een aparte foutcode? En als ik dan nog geen fouten krijg?

Commentaar zou ik meer kunnen gebruiken. Vooral voor teruglezen en bugs fixen.
Ga ermee bezig.

Maar dan vind ik het wel vreemd dat het script wel werkt als ik die for() regel 50 t/m 53 er niet in heb zitten.

EDIT:
Daarbij kan er een fout zitten in de query. Deze heb ik namelijk bij het uitlezen van de sql variabelen achter // gezet zodat deze niet werken.
Gewijzigd op 16/06/2014 16:59:39 door Martijn L
 
Erwin H

Erwin H

16/06/2014 16:27:13
Quote Anchor link
Er gaat gewoon duidelijk iets mis met je query, alleen wat kom je nooit achter als niet gewoon foutafhandeling gaat toepassen. Dit wordt zo ongeveer in elk topic hier aangegeven, dus zoek er eens op zou ik zeggen.
Gewijzigd op 16/06/2014 16:50:55 door Erwin H
 



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.