[php]2x while werkt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • itsme
  • Registratie: Februari 2000
  • Niet online
In vervolg op [rml][ PHP]Array, deel info uit regel toevoegen aan zelfde regel[/rml]

Ik heb besloten het vorige probleem op te lossen door elke datum in de ene tabel een voor een te vergelijken met de andere tabel.

Ik heb daarvoor de volgende code gemaakt.
(ik laat de query's even weg, deze gaan namelijk goed)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        $RESULT_EVENTS = mysql_query($SQL_EVENTS);

        WHILE ($MYROW_EVENTS = mysql_fetch_array($RESULT_EVENTS))
        {
        echo "<hr>";
        $EVENTDATE = $MYROW_EVENTS["DATE"];
        //Jaar dumpen
                $EVENTDATE = (substr("$EVENTDATE", 5,2)).(substr("$EVENTDATE", 8,2));
                        
        WHILE ($MYROW_BIRTHDAYS = mysql_fetch_array($RESULT_BIRTHDAYS))
        {
        $COMPAREBD = $MYROW_BIRTHDAYS["member_birthdate"];
        //Jaar dumpen
                 $COMPAREBD = (substr("$COMPAREBD", 5,2)).(substr("$COMPAREBD", 8,2));

        if($COMPAREBD<=$EVENTDATE)
        {
        echo "$COMPAREBD<br>";
        };
        };
        echo "$EVENTDATE<br>";
        };


Probleem bij bovenstaande code is dat hij 1x goed word doorlopen, er verschijnen 2 verjaardagen en dan een event. Daarna zou de code met de volgende event doorlopen moeten worden en weer een verjaardag moeten opleveren gevolgd door de event. Echter mist deze verjaardag.

Ik denk dat het komt door de geneste while's . Ik heb iets gelezen over een pointer.
Ik heb echt geen idee hoe dit nu weer kan ...

[ Voor 60% gewijzigd door itsme op 21-10-2004 15:17 . Reden: while vervangen door if ]

Nothing to see here


Acties:
  • 0 Henk 'm!

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-09 18:27

pjvandesande

GC.Collect(head);

Ik denk dat er niet meer resultaten zijn, bekijk dat eerst is.

Acties:
  • 0 Henk 'm!

  • itsme
  • Registratie: Februari 2000
  • Niet online
questa schreef op 21 oktober 2004 @ 15:25:
Ik denk dat er niet meer resultaten zijn, bekijk dat eerst is.
Gho ja dat heb ik vast niet gedaan |:(

De gebruiker query leverd t volgende op:
code:
1
2
3
4
5
member_birthdate
1982-02-25
1979-02-28
1979-10-31
2000-12-31


Hier staat op dit moment het resultaat:
http://www.bkonings.net/friends/test.php

Nothing to see here


Acties:
  • 0 Henk 'm!

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-09 18:27

pjvandesande

GC.Collect(head);

its_me schreef op 21 oktober 2004 @ 15:38:
[...]
Gho ja dat heb ik vast niet gedaan |:(
Ik maak het veel mee, maar debug je code is en step er is door en kijk is hoeveel resultaten er gegeven worden.

Wat je ook kan doen is het eerst in een array proppen en hier doorheen wandelen.

Acties:
  • 0 Henk 'm!

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 18-09 23:26

Tjark

DON'T PANIC

misschien omdat je door 2 result sets aan het while-en bent?
Stop de 1e resultset eens eerst in een array en loop daarna door die array en dan pas de while op de andere result set.

*insert signature here


Acties:
  • 0 Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 17:55
Het is een beetje een onoverzichtelijke brij, maar probeer je nu 2x door dezelfde MySQL resultaatset heen te lopen? Dat gaat niet. Je zult de query dan voor het uitvoeren van de while lus even opnieuw moeten uitvoeren.

Acties:
  • 0 Henk 'm!

Verwijderd

TjarkVerhoeven schreef op 21 oktober 2004 @ 15:56:
misschien omdat je door 2 result sets aan het while-en bent?
Stop de 1e resultset eens eerst in een array en loop daarna door die array en dan pas de while op de andere result set.
exact. de binnenste fetch interfereert met de buitenste. minstens 1 van de 2 moet op voorhand volledig in een array.

Acties:
  • 0 Henk 'm!

  • itsme
  • Registratie: Februari 2000
  • Niet online
Volgens mij doe ik dat niet nee, dit keer met querys:

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
<?
include("config.php");
      
//Verjaardagen ophalen van alle members
        $SQL_BIRTHDAYS = "
SELECT
    users.SURNAME,
    users.LASTNAME,
    users.member_birthdate,
    users.USERID
 FROM
    group_members
    INNER JOIN users ON group_members.user_id=users.USERID
 WHERE
    group_id=2
 AND
    member_status>1
 ORDER BY
    MONTH(member_birthdate), DAYOFMONTH(member_birthdate) ASC
 ";
        $RESULT_BIRTHDAYS = mysql_query($SQL_BIRTHDAYS);


//Events quiry
        $SQL_EVENTS = "
 SELECT
    EVENT_CATEGORY.CATSMILE,
    GROUP_EVENTS.EVENTID,
    GROUP_EVENTS.EVENTNAME,
    GROUP_EVENTS.CATEGORY,
    GROUP_EVENTS.DATE
 FROM
    GROUP_EVENTS
    INNER JOIN EVENT_CATEGORY ON EVENT_CATEGORY.CATEGORYID = GROUP_EVENTS.CATEGORY
 WHERE
    GROUP_EVENTS.GROUPID='2'
 AND
    GROUP_EVENTS.EVENTSTATUS BETWEEN '1' AND '8'
 ORDER BY
    MONTH(DATE) , DAYOFMONTH(DATE) ASC
 ";
        $RESULT_EVENTS = mysql_query($SQL_EVENTS);


//Het bepalen van de volgorde
        WHILE ($MYROW_EVENTS = mysql_fetch_array($RESULT_EVENTS))
        {
        echo "<hr>";
        $EVENTDATE = $MYROW_EVENTS["DATE"];
        //Jaar dumpen
                $EVENTDATE = (substr("$EVENTDATE", 5,2)).(substr("$EVENTDATE", 8,2));
                        
        WHILE ($MYROW_BIRTHDAYS = mysql_fetch_array($RESULT_BIRTHDAYS))
        {
        $COMPAREBD = $MYROW_BIRTHDAYS["member_birthdate"];
        //Jaar dumpen
                 $COMPAREBD = (substr("$COMPAREBD", 5,2)).(substr("$COMPAREBD", 8,2));

        if($COMPAREBD<=$EVENTDATE)
        {
        echo "$COMPAREBD<br>";
        };
        };
        echo "$EVENTDATE<br>";
        };
        ?>

Nothing to see here


Acties:
  • 0 Henk 'm!

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-09 18:27

pjvandesande

GC.Collect(head);

Wat ik zeg, stop eerst is alles in een array en loop het dan is door. En kijk met de debugger is hoeveel results er zijn en step de code dan is door.

Acties:
  • 0 Henk 'm!

Verwijderd

code:
1
$RESULT_BIRTHDAYS = mysql_query($SQL_BIRTHDAYS);

wordt slechts 1 keer uitgevoerd (namelijk voor alle while lussen). Dit betekent dat de binnenste while (waarin je $RESULT_BIRTHDAYS gebruikt) alleen tijdens de eerste ronde van de buitenste while resultaten oplevert. In alle volgende rondes is de conditie voor de binnenste while niet meer waar, want je hebt de query reeds compleet doorlopen.

Je zal dus de query voor de binnenste while steeds opnieuw moeten laten uitvoeren, of de cursor steeds terugzetten naar het begin van de result set (weet niet of dat kan met mysql) of deze query tevoren in een array zetten en die vervolgens doorlopen.

Acties:
  • 0 Henk 'm!

  • Blaasvis
  • Registratie: November 2001
  • Laatst online: 12:54

Blaasvis

Cidora \o/

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
WHILE ($MYROW_EVENTS = mysql_fetch_array($RESULT_EVENTS)) 
        { 
        echo "<hr>"; 
        $EVENTDATE = $MYROW_EVENTS["DATE"]; 
        //Jaar dumpen 
                $EVENTDATE = (substr("$EVENTDATE", 5,2)).(substr("$EVENTDATE", 8,2)); 
                         
        WHILE ($MYROW_BIRTHDAYS = mysql_fetch_array($RESULT_BIRTHDAYS)) 
        { 
        $COMPAREBD = $MYROW_BIRTHDAYS["member_birthdate"]; 
        //Jaar dumpen 
                 $COMPAREBD = (substr("$COMPAREBD", 5,2)).(substr("$COMPAREBD", 8,2)); 

        if($COMPAREBD<=$EVENTDATE) 
        { 
        echo "$COMPAREBD<br>"; 
        }; << moet deze ; er wel staan ?
        }; 
        echo "$EVENTDATE<br>"; 
        }; 
        ?>


ik vraag me af of er na een if {} wel een ; hoort te staan waarschijnlijk sluit je hier mee een while loop te vroeg af ?

Freedom is everything you need ; <moto-moi|afk> ik verkloot het gewoon nooit :P


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee, een ; sluit een statement af, en lege statements zijn legaal, dus er is niets aan de hand. Ze zijn idd niet nodig, maar ze doen ook niets verkeerds. Overigens is indenting ook een vak apart zie ik alweer...

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • itsme
  • Registratie: Februari 2000
  • Niet online
Verwijderd schreef op 21 oktober 2004 @ 17:30:
code:
1
$RESULT_BIRTHDAYS = mysql_query($SQL_BIRTHDAYS);

wordt slechts 1 keer uitgevoerd (namelijk voor alle while lussen). Dit betekent dat de binnenste while (waarin je $RESULT_BIRTHDAYS gebruikt) alleen tijdens de eerste ronde van de buitenste while resultaten oplevert. In alle volgende rondes is de conditie voor de binnenste while niet meer waar, want je hebt de query reeds compleet doorlopen.

Je zal dus de query voor de binnenste while steeds opnieuw moeten laten uitvoeren, of de cursor steeds terugzetten naar het begin van de result set (weet niet of dat kan met mysql) of deze query tevoren in een array zetten en die vervolgens doorlopen.
Nee toch?

Buitenste while gebruikt:
PHP:
1
WHILE ($MYROW_EVENTS = mysql_fetch_array($RESULT_EVENTS))

Binnenste gebruikt:
PHP:
1
WHILE ($MYROW_BIRTHDAYS = mysql_fetch_array($RESULT_BIRTHDAYS))
.oisyn schreef op 21 oktober 2004 @ 17:59:
Nee, een ; sluit een statement af, en lege statements zijn legaal, dus er is niets aan de hand. Ze zijn idd niet nodig, maar ze doen ook niets verkeerds. Overigens is indenting ook een vak apart zie ik alweer...
Mja, ik doe ; elke keer omdat ik m niet wil vergeten als t er wel hoort. Dus sluit ik alles af met een ; .

Indenting doe ik niet consequent nee, ik haat scrollen dus indent niet overal even netjes.
Overigens komt dit ook uit mijn testscript en daar delete ik veel code uit om dan weer een andere benadering te kiezen ... ook niet echt bevorderlijk voor de code ;)

Tips om dit beter te doen zijn natuurlijk welkom :)

Overigens ben ik de enige die de code leest en dus wel gewent aan dit soort werk :+

Nothing to see here


Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
http://nl.php.net/manual/en/function.mysql-data-seek.php staat je probleem gewoon letterlijk opgelost in de comments.
Misschien begrijp je beter als een je doorhebt dat een resultaat van MySQL kunt zien van een lijst waarvan je telkens een item afhaalt en die weglegt. Na een keer de buitenste while te hebben doorlopen is je binnenste stapel leeg en zit er nog wat op je buitenste stapel, dus moet je dus weer terug naar de oude situatie dat je stapel nog vol was. Dat kan met mysql_data_seek( $RESULT_BIRTHDAYS, 0);

Acties:
  • 0 Henk 'm!

  • itsme
  • Registratie: Februari 2000
  • Niet online
Glimi schreef op 21 oktober 2004 @ 20:29:
http://nl.php.net/manual/en/function.mysql-data-seek.php staat je probleem gewoon letterlijk opgelost in de comments.
Misschien begrijp je beter als een je doorhebt dat een resultaat van MySQL kunt zien van een lijst waarvan je telkens een item afhaalt en die weglegt. Na een keer de buitenste while te hebben doorlopen is je binnenste stapel leeg en zit er nog wat op je buitenste stapel, dus moet je dus weer terug naar de oude situatie dat je stapel nog vol was. Dat kan met mysql_data_seek( $RESULT_BIRTHDAYS, 0);
Dat was het :D ... maar ook een beetje niet.
Het probleem is opgelost alleen zag ik over het hoofd dat alle verjaardag records die bij de eerste keer eerder waren dan de event dat de tweede keer natuurlijk ook zijn |:(

... back to the drawing board ...

Nothing to see here


Acties:
  • 0 Henk 'm!

Verwijderd

Glimi schreef op 21 oktober 2004 @ 20:29:
http://nl.php.net/manual/en/function.mysql-data-seek.php staat je probleem gewoon letterlijk opgelost in de comments.
Misschien begrijp je beter als een je doorhebt dat een resultaat van MySQL kunt zien van een lijst waarvan je telkens een item afhaalt en die weglegt. Na een keer de buitenste while te hebben doorlopen is je binnenste stapel leeg en zit er nog wat op je buitenste stapel, dus moet je dus weer terug naar de oude situatie dat je stapel nog vol was. Dat kan met mysql_data_seek( $RESULT_BIRTHDAYS, 0);
Nou, duidelijker kan toch niet. En fijn dat je met MySQL terug kunt springen naar het begin van een result set (gebruik zelf meer PostgreSQL).
Pagina: 1