[PHP] variabele in for lus wordt niet herkend in while lus

Pagina: 1
Acties:
  • 367 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
In een for lus heb ik een while lus zitten,
in de for lus net boven de while lus maak ik variabele $tijd aan.
Als ik die in de for lus aanroep, is ie leeg.
hoe kan dit?

code:
1
2
3
4
5
6
7
8
9
for (xxxxx)
{
   $tijd = "";
   echo $tijd; //hier zie ik m wel
   while (xxxxx)
         {
         echo $tijd; //hier zie ik niks
         }
}

[ Voor 17% gewijzigd door Verwijderd op 30-01-2006 13:54 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op maandag 30 januari 2006 @ 13:39:
In een for lus heb ik een while lus zitten,
in de for lus net boven de while lus maak ik variabele $tijd aan.
Als ik die in de for lus aanroep, is ie leeg.
hoe kan dit?

code:
1
2
3
4
5
6
7
for (xxxxx)
{
   $tijd = "";
   while (xxxxx)
   {
   }
}
Laat eens zien met welke waarden je werkt?
In theorie moet dit namelijk gewoon goed gaan.

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
:? ja als je $tijd na regel 3 aanroept is ie inderdaad leeg...

Acties:
  • 0 Henk 'm!

  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
Kun je de programmeertaal zeggen, wat je precies wilt en een stuk code? Ik denk dat het dan een stuk duidelijker wordt.

Acties:
  • 0 Henk 'm!

Verwijderd

Dit heeft te maken me de scope waarin je de variabele defineert. Een variabele leeft alleen in de scope waarin deze is aangemaakt, en wordt opgeruimd als dit vervolgens voorbij is. Defineer de $tijd voor de for-loop zodat deze niet wordt verwijderd als de einde van de for loop is bereikt.

Bekijk voorbeeld 7-4 bijvoorbeeld op deze pagina

Acties:
  • 0 Henk 'm!

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

--B--: misschien moet je zelf die pagina nog eens wat beter lezen want in PHP hebben compound statements (een blok code tussen { en } ) geen eigen scope.

hans1978: nee, dat kan niet. Je code zal wel niet kloppen (je overschrijft 'm waarschijnlijk ergens) :)

[ Voor 33% gewijzigd door .oisyn op 30-01-2006 13:56 ]

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!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
.oisyn schreef op maandag 30 januari 2006 @ 13:54:
--B--: misschien moet je zelf die pagina nog eens wat beter lezen want in PHP hebben compound statements (een blok code tussen { en } ) geen eigen scope.

hans1978: nee, dat kan niet. Je code zal wel niet kloppen (je overschrijft 'm waarschijnlijk ergens) :)
volgens mij heeft --B-- wel gelijk, maar ziet hij het probleem niet.
'$tijd' is idd na de for lus 'leeg' (als het goed is) maar omdat de while binnen de for loop staat zou $tijd ook in de while zijn waarde moeten houden

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
(voorbeeldcode net beetje aangepast)

dit is het hele verhaal:
De for lus maakt tijden aan, tussen de 0000 en 2345 met interval van 15 minuten (900)
code:
1
2
3
4
5
6
7
8
9
10
11
for ( $counter = 82800; $counter <= 168300; $counter += 900) 
{
      $tijd = date('H:i', $counter);          
      echo $tijd;
 
      while ($row = mysql_fetch_object($result))
               {
               $P1 = strtotime("$row->startdatum $row->tijd");
               $P2 = strtotime("$row->einddatum $row->eindtijd");
              //hier gebeurt wat met $P1 en $P2 etc....maar onbelangrijk voor vraag     
               }

[ Voor 8% gewijzigd door Verwijderd op 30-01-2006 13:59 ]


Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
Edit, mijn post werd overbodig door andere snelle posters :)

[ Voor 88% gewijzigd door Room42 op 30-01-2006 14:00 ]

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • 0 Henk 'm!

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

BasieP schreef op maandag 30 januari 2006 @ 13:58:
[...]


volgens mij heeft --B-- wel gelijk, maar ziet hij het probleem niet.
Nee, hij heeft helemaal geen gelijk, kijk maar eens naar de door hem aangehaalde pagina in de php docs. Alleen een functie creëert z'n eigen scope, de rest niet.

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!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 12:54
Je gebruikt $tijd helemaal niet in je while ?

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
for($counter=82800;$counter<=168300;$counter += 900) {
      $tijd = date('H:i', $counter);
      echo $tijd.'<br>';
}


...werkt uitstekend hier.

[ Voor 209% gewijzigd door Verwijderd op 30-01-2006 14:05 ]


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
.oisyn schreef op maandag 30 januari 2006 @ 14:00:
[...]

Nee, hij heeft helemaal geen gelijk, kijk maar eens naar de door hem aangehaalde pagina in de php docs. Alleen een functie creëert z'n eigen scope, de rest niet.
mm ben ik dan gek of geld dat alleen voor php?
euh als ik '1' meegeef is dit 1 seconde na 1 januari 1970 hoor, en toch echt geen 10 cijfers

@hans:
de laatst geposte code is incompleet, post eens wat meer

[ Voor 7% gewijzigd door BasieP op 30-01-2006 14:03 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

Verwijderd

BasieP schreef op maandag 30 januari 2006 @ 14:02:
[...]

mm ben ik dan gek of geld dat alleen voor php?

[...]
Ik ben bang dat ik .oisyn inderdaad gelijk moet geven wat php betreft |:( de scopes werken in php inderdaad anders.

Acties:
  • 0 Henk 'm!

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

BasieP schreef op maandag 30 januari 2006 @ 14:02:
[...]

mm ben ik dan gek of geld dat alleen voor php?
Klopt (dat laatste dan, over dat eerste kan ik geen uitspraak doen :P) (en even ervanuitgaande dat je de standaard C-style talen bedoelt, zoals C++, Java, C#, ...)

hans1978: nu ben ik eigenlijk wel benieuwd hoe jij bepaalt dat $tijd idd niet meer bestaat, want dat zou gewoon moeten. Maak eens een klein scriptje met een while-lus in een for-lus, waarin je verder niets doet behalve die $tijd definieren, en echo die $tijd dan eens na de buitenste for-lus. Je zult zien dat hij dan nog gewoon bestaat.

[ Voor 8% gewijzigd door .oisyn op 30-01-2006 14:12 ]

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!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

BasieP schreef op maandag 30 januari 2006 @ 14:02:
[...]

mm ben ik dan gek of geld dat alleen voor php?
Er zijn meer talen waar dat zo is ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
PHP:
1
2
3
4
5
6
7
8
for ( $counter = 82800; $counter <= 168300; $counter += 900) {
      $tijd = date('H:i', $counter);          

      while ($row = mysql_fetch_object($result)) {
            //doe je ding
            echo isset($tijd);
      }
}

voer deze eens uit?
crisp schreef op maandag 30 januari 2006 @ 14:10:
[...]

Er zijn meer talen waar dat zo is ;)
wat impliceert dat ...
damn.. dus iedereen had gelijk ;)

[ Voor 34% gewijzigd door BasieP op 30-01-2006 14:11 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 15-09 18:24

dusty

Celebrate Life!

Hetzelfde als je een for lus doet met ($t=0;$t<300;$t++) , kan je na de lus nog altijd "echo $t" doen en krijg je ook nog steeds 300 te zien.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
uitbreiding: en wat versimpeld, om het idee duidelijk te krijgen
code:
1
2
3
4
5
6
7
8
9
for ( $counter = 0; $counter <= 100000; $counter += 900) 
{
      $tijd = date('H:i', $counter);          
      echo $tijd;    //bv 10:45
 
      while ($row = mysql_fetch_object($result))
               {
               echo $tijd;   //hier zou ik dus ook 10:45 moeten zien, zie ik echter niet  
               }

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
en als ik naar aanleiding van tip
echo isset($tijd);
doe dan zegt ie 1,
klopt dus..hij bestaat

[ Voor 27% gewijzigd door Verwijderd op 30-01-2006 14:43 ]


Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 16:14

pietje63

RTFM

Bedoel je niet
PHP:
1
2
3
4
if(isset($tijd))
  {
  echo ($tijd);
  }
(of ligt het daar niet aan? nu lijkt hij alleen te moeten echo'en of $tijd bestaat)

[ Voor 58% gewijzigd door pietje63 op 30-01-2006 14:39 ]

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nog uitgebreider: (sorry, ik dacht dat met minder script het duidelijk zou zijn)
het idee is dat ik een kalender heb met afspraken en zodra een afspraak bestaat dat ie bezet zegt.
In de FOR maakt ie alle tijden aan van een dag.
In de WHILE vergelijkt ie per opgeslagen afspraak of de gewenste afspraak overlapt.
Daarna in de IF ELSE zegt ie bezet of vrij.
En dan begint ie weer bovenaan met de FOR (en dan weer while en if else voor de volgende tijd)
code:
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
<?
for ( $counter = 82800; $counter <= 168300; $counter += 900) 
{
$tijd = date('H:i', $counter);        
echo $tijd;
$status = "vrij";

        while ($row = mysql_fetch_object($result))
        {
        $P1 = strtotime("$row->startdatum $row->tijd");
        $P2 = strtotime("$row->einddatum $row->eindtijd");
        $timestamp = strtotime("08/24/2006 $tijd");
                if ($timestamp >= $P1 && $timestamp <= $P2)
                {
                $status = "bezet";
                break;
                }
                else
                {
                $status = "vrij";
                }
        }
        
                if ($status == "bezet")
                {
                echo "bezet";   
                }
    elseif ($status == "vrij")
                {
                echo "vrij";
                }
}
?>

[ Voor 16% gewijzigd door Verwijderd op 30-01-2006 14:52 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Komt ie zowieso wel in die while loop terecht?

$rowcount = mysql_num_rows($result);
die($rowcount);

Klinkt te simpel voor woorden maar het zal heus niet de eerste keer zijn dat iemand zoiets overkomt.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja precies, voor als er uberhaupt geen afspraken in database staan, heb ik naar gekeken, maar de database staat vol met afspraken, hij komt zeker in while

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
mag ik opmerken dat je nu eenzelfde query-resultaat ERG vaak langs loopt?
weet je zeker dat dit goed gaat trouwens? (klopt de query)
(je zou het even tijdelijk kunnen vervangen door 'while (true) { ... }' )

verder zie ik je in de while loop '$tijd' in een strtotime functie gooit. ik neem aan dat je $tijd checkt net de regel daarboven?

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Verwijderd schreef op maandag 30 januari 2006 @ 14:56:
ja precies, voor als er uberhaupt geen afspraken in database staan, heb ik naar gekeken, maar de database staat vol met afspraken, hij komt zeker in while
Maar klopt die query dus wel? echo eens gewoon een woord ipv $tijd. dus gewoon echo 'hit<br />'; bijv. Werkt dat wel? Zoniet, dan is er iets mis met je query.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@BasieP : tijd checkt met de regel daarboven, die opmerking snap ik niet,
en ik loop idd de query vaak langs, maar ik zou niet weten hoe ik anders per tijd, dus 0000, 0015, 0030, 0045, 0100, etc...kan checken of er een afspraak bestaat of niet...

opmerking: timestamp wordt een unixtijd en P1 en P2 ook, dus die kan ik vergelijken

[ Voor 15% gewijzigd door Verwijderd op 30-01-2006 15:08 ]


Acties:
  • 0 Henk 'm!

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op maandag 30 januari 2006 @ 14:50:
nog uitgebreider: (sorry, ik dacht dat met minder script het duidelijk zou zijn)
het idee is dat ik een kalender heb met afspraken en zodra een afspraak bestaat dat ie bezet zegt.
In de FOR maakt ie alle tijden aan van een dag.
In de WHILE vergelijkt ie per opgeslagen afspraak of de gewenste afspraak overlapt.
Daarna in de IF ELSE zegt ie bezet of vrij.
En dan begint ie weer bovenaan met de FOR (en dan weer while en if else voor de volgende tijd)
En je conclusie dat ie $tijd niet kan zien is omdat $timestamp verkeerd is?

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!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
Verwijderd schreef op maandag 30 januari 2006 @ 15:07:
@BasieP : tijd checkt met de regel daarboven, die opmerking snap ik niet,
en ik loop idd de query vaak langs, maar ik zou niet weten hoe ik anders per tijd, dus 0000, 0015, 0030, 0045, 0100, etc...kan checken of er een afspraak bestaat of niet...
ik bedoelde dat je je 'echo $tijd' regel boven die regel had staan toen je het teste..

offtopic:
je kan natuurlijk ook je query aanpassen naar bijv zoiets:
[rml][ PHP] tijd overlap met UNIX tijd[/rml]
[rml][ PHP] Planningsschema[/rml]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nee helemaal niet, timestamp is prima....
ik heb geen conclusie...nog...
time moet een waarde hebben alleen laat ie niks zien.
bovendien lijkt het in de output dat ie alleen bij de eerste waarde van tijd, dus 0000 werkt dus rest blijft leeg....dus vrij ipv bezet, waar bezet zou moeten zijn

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@BasieP :
Ja, $tijd is iets van tussen de 00:00 en 23:45
daarnaast heb ik ook $timestamp gechecked, en dat is de correcte unix tijdswaarde

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
je kunt toch wel meerdere keren
code:
1
while ($row = mysql_fetch_object($result))

gebruiken als je daarvoor 1x de query en mysql_query uitvoert?

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
Verwijderd schreef op maandag 30 januari 2006 @ 15:19:
@BasieP :
Ja, $tijd is iets van tussen de 00:00 en 23:45
daarnaast heb ik ook $timestamp gechecked, en dat is de correcte unix tijdswaarde
dan heb je zojuist je eigen vraag opgelost, want als jij (daar) de $tijd goed kan laten zien is de titelvraag dus opgelost...

ow btw: 3x posten achter elkaar hoeft niet hoor
we hebben een edit knopje: Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/tweakers/images/icons/edit.gif

edit:
nog iets wat je absoluut eens door moet lezen:
P&W FAQ - Leer **** debuggen!!

[ Voor 34% gewijzigd door BasieP op 30-01-2006 15:27 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op maandag 30 januari 2006 @ 15:14:
nee helemaal niet, timestamp is prima....
ik heb geen conclusie...nog...
Waar gaat je topic dan überhaupt over :?
in de for lus net boven de while lus maak ik variabele $tijd aan.
Als ik die in de for lus aanroep, is ie leeg.
Hoe kom je aan die conclusie dan?

Ik denk dat je het beste eens met een debugger aan de slag kan gaan, want zo komen we nergens.

[ Voor 20% gewijzigd door .oisyn op 30-01-2006 15:27 ]

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!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Ik neem aan dat je weet dat je je resultset maar 1 keer kunt doorlopen? De binnenste while lus doorloopt de resultset slechts 1x. De volgende keer dat je door je for-lus erlangs komt is de resultset al doorlopen en gaat hij de while niet in. Tenzij je je resultset reset of je query opnieuw doet.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Voor het resetten van je resultset heb je mysql_data_seek

PHP:
1
mysql_data_seek ($resultset, 0);


Maar waarschijnlijk is het efficienter de benodigde data even in een array te gooien die wat makkelijker zoekbaar is, ipv bij iedere iteratie door je complete resultset heen te wandelen.

[ Voor 92% gewijzigd door Bosmonster op 30-01-2006 15:56 . Reden: foutje ]

Pagina: 1