[PHP] Teller opeens leeg in 'for' loop

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
In PHP heb ik een stukje code dat perfect werkt, tenminste, tot op zekere hoogte. Meestal werkt het wel, maar soms om onbekende reden niet.

Relevant stukje gestripte code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if (!empty($_REQUEST['cars'][0]) && !empty($_REQUEST['cartypes'][0]) && !empty($_REQUEST['carversions'][0]))
  {
    for ($ctr = 0; $ctr <= 3; $ctr ++)
    {
      $sub_ctr = $ctr + 1;
      $product_id[$ctr] = get_product_id($_REQUEST['cars'], $_REQUEST['cartypes'], $_REQUEST['carversions'], $sub_ctr);
    }
  }

  for ($ctr = 3; $ctr >= 0; $ctr --)
  {
    if ($product_id[$ctr] != false)
    {
echo "1: $ctr";
      $product[$ctr] = new product();
echo "2: $ctr";
      $product[$ctr]->get_product($product_id[$ctr]);
echo "3: $ctr";
    }
  }
De functie "get_product_id()" haalt een id uit de database aan de hand van een auto merk, type en uitvoering als deze bestaat. Merk, type en uitvoering worden met drie selectboxjes gekozen waarbij op de laatste een submit zit.
Het object "product()" haalt alle eigenschappen van het product op.

Dit werkt perfect, tot ik de pagina twee keer achter elkaar laat laden.
Ik kies dus de drie selectieboxen, de pagina laadt opnieuw met de goede gegevens, en ik kies nog een keer in de nieuw geladen pagina met de drie selectieboxen een andere auto.

Op dat moment krijg ik een fout dat ik een oproep doe naar een member functie in een non-object: "Fatal error: Call to a member function get_product() on a non-object in ..."
Als ik dan naar de tellertjes kijk dan blijkt de echo van 1 en 2 wel te werken, maar bij 3 is de teller leeg! En eigenlijk net VOOR het aanroepen van de functie in het object, daarom krijg ik de fout. Dit is het enige stukje script waar ik $ctr gebruik, zelfs in het object gebruik ik deze variabele niet, dus ik heb absoluut geen idee hoe het komt dat hij ineens leeg is.

Uiteraard heb ik gezocht op php.net, google en hier, maar ik heb eerlijk gezegd niet zo'n goed idee waar ik op moet zoeken :? Is iemand bekend met deze fout of weet waar ik het moet zoeken? Het is vrij moeilijk om een testcase te maken om te laten zien en het staat op het lokale intranet dus even laten zien is er ook niet bij. Mocht het niet anders gaan, dan zal ik m'n best doen om toch iets te kunnen laten zien.

Acties:
  • 0 Henk 'm!

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

In je laatste loop vergelijk je $ctr met >= 0, terwijl je voor 0 geen functie hebt; dat is dus in ieder geval 1 fout.

Vervang je "controle"-if anders met if (method_exists($product_id[$ctr]), 'get_product')) {.

[ Voor 31% gewijzigd door GX op 21-02-2006 15:54 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

print_r($product) geeft...? ;)

offtopic:
Die if op regel 12 staat nogal raar zo. != false is hetzelfde als == true. En == true kun je weglaten, dus dan zou die regel het volgende worden:

PHP:
1
if ($product_id[$ctr])

Als je wil dat 0 en null ook gewoon mogen in dat veld, dan kun je wel dit gebruiken:
PHP:
1
if ($product_id[$ctr] !== false)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

terwijl je voor 0 geen functie hebt
Waar haal jij dan vandaan dat ie voor 0 geen functie heeft?

Graveheart: Ik geloof niet dat ie net leeg raakt voor het aanroepen van de functie, want dan had je 'm bij 2 ook wel verkeerd ge-echo'd. En hij raakt heus niet op magische wijze leeg. Ik vind het dus nogal vreemd.

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!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
GX schreef op dinsdag 21 februari 2006 @ 15:52:
In je laatste loop vergelijk je $ctr met >= 0, terwijl je voor 0 geen functie hebt; dat is dus in ieder geval 1 fout.

Vervang je "controle"-if anders met if (method_exists($product_id[$ctr]), 'get_product')) {.
Voor 0 heb ik wel een functie... Eerst van 0 tot en met 3 dan van 3 tot en met 0.

Vervanging van die controle zou normaal inderdaad goed werken, maar $ctr is nu gewoon leeg en hij zal het object dus niet vinden en niet uitvoeren wat wel zou moeten. Gevolg blijft dat m'n script niet goed werkt.

@NMe: Nou, het zit zo, in de functie maak ik hem gelijk aan een getal. Hij is dan niet true, maar ook niet false, dus != false. Toch? Edit: "Oh en dan moet ik inderdaad !== false hebben..." Nog een edit: "Maar als hij geen waarde heeft mag hij hem ook niet pakken. Dus bij NULL mag hij niet door de voorwaarde"
.oisyn schreef op dinsdag 21 februari 2006 @ 16:00:
[...]
Graveheart: Ik geloof niet dat ie net leeg raakt voor het aanroepen van de functie, want dan had je 'm bij 2 ook wel verkeerd ge-echo'd. En hij raakt heus niet op magische wijze leeg. Ik vind het dus nogal vreemd.
Nee hij zal niet net tussen die twee regeltjes leeg raken :) Maar bij 2 echo't hij hem nog wel goed, en bij de functie aanroep gaat hij verkeerd.

[ Voor 57% gewijzigd door Fles op 21-02-2006 16:17 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Graveheart schreef op dinsdag 21 februari 2006 @ 16:05:
@NMe: Nou, het zit zo, in de functie maak ik hem gelijk aan een getal. Hij is dan niet true, maar ook niet false, dus != false. Toch?
Daar gebruik je dus !== voor. 0 == false evalueert naar true. 0 != false evalueert naar false. 0 !== false evalueert naar true. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Graveheart schreef op dinsdag 21 februari 2006 @ 16:05:
Nee hij zal niet net tussen die twee regeltjes leeg raken :) Maar bij 2 echo't hij hem nog wel goed, en bij de functie aanroep gaat hij verkeerd.
Dan zal new product() wel geen geen goed product opleveren. Doe eens een print_r($product[$ctr]); voor je die functieaanroep doet, zoals -NMe- al aangaf?

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!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
-NMe- schreef op dinsdag 21 februari 2006 @ 16:11:
[...]

Daar gebruik je dus !== voor. 0 == false evalueert naar true. 0 != false evalueert naar false. 0 !== false evalueert naar true. ;)
NULL != false -> false
NULL !== false -> true

Maar: 3 == true -> false (toch?)

Dus moet ik de bovenste hebben. Bij NULL mag hij niet door de voorwaarde komen.

Volgende is het geval: Ik open het script en verander != false naar !== false, duw F5 in het venster dat ik nogsteeds open had sinds ik dit topic starte en nu werkt hij wel... (met foutmeldingen omdat ik != false moet hebben) :+ Verander ik het terug naar != false, werkt hij nog! Voor ik dit topic begon op CTRL-F5 gedrukt en cache leeg gehaald, niets. Nu in dezelfde sessie, hoppa, werken.

Heb geen idee hoe het komt, maar ik sta wel ff voor schut natuurlijk nu...

[ Voor 5% gewijzigd door Fles op 21-02-2006 16:29 ]


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 21:31

Gonadan

Admin Beeld & Geluid, Harde Waren
Graveheart schreef op dinsdag 21 februari 2006 @ 16:27:
[...]

NULL != false -> false
NULL !== false -> true

Maar: 3 == true -> false (toch?)

Dus moet ik de bovenste hebben. Bij NULL mag hij niet door de voorwaarde komen.

Volgende is het geval: Ik open het script en verander != false naar !== false, duw F5 in het venster dat ik nogsteeds open had sinds ik dit topic starte en nu werkt hij wel... :+ Verander ik het terug naar != false, werkt hij nog! Voor ik dit topic begon op CTRL-F5 gedrukt en cache leeg gehaald niets. Nu in dezelfde sessie, hoppa, werken.

Heb geen idee hoe het komt, maar ik sta wel ff voor schut natuurlijk nu...
als het alleen om null gaat is het toch simpel? != null ;)

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Gonadan schreef op dinsdag 21 februari 2006 @ 16:28:
[...]


als het alleen om null gaat is het toch simpel? != null ;)
Nou nee, hij kan false zijn hij kan null zijn en hij kan groter dan 0 zijn. Bij false en null mag hij niet door bij groter dan 0 wel.

Edit: Laat ik het zo zeggen, hij kan NULL (leeg) zijn hij kan false zijn en hij kan groter dan 1 zijn. (0 wordt hij nooit) Bij geen waarde (NULL) en false mag hij niet door. Maar kwam er achter dat "3 == true" dus gewoon de != false weg gehaald ;)

[ Voor 29% gewijzigd door Fles op 21-02-2006 16:41 ]


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 21:31

Gonadan

Admin Beeld & Geluid, Harde Waren
Graveheart schreef op dinsdag 21 februari 2006 @ 16:31:
[...]

Nou nee, hij kan false zijn hij kan null zijn en hij kan groter dan 0 zijn. Bij false en null mag hij niet door bij groter dan 0 wel.
null en 0 is niet hetzelfde hè ;)

if (blaat > 0) {}

maar dit lijkt me enigzins offtopic O-)

[ Voor 8% gewijzigd door Gonadan op 21-02-2006 16:37 ]

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

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

Bosmonster

*zucht*

Graveheart schreef op dinsdag 21 februari 2006 @ 16:31:
[...]

Nou nee, hij kan false zijn hij kan null zijn en hij kan groter dan 0 zijn. Bij false en null mag hij niet door bij groter dan 0 wel.

Edit: Laat ik het zo zeggen, hij kan NULL (leeg) zijn hij kan false zijn en hij kan groter dan 1 zijn. (0 wordt hij nooit) Bij geen waarde (NULL) en false mag hij niet door. Maar kwam er achter dat "3 == true" dus gewoon de != false weg gehaald ;)
Als je wilt checken of iets groter is dan 0, check dan of die groter is dan 0 :P

if ($x > 0) ...

Als die ook null kan zijn is het misschien noodzakelijk ook te kijken met isset.

if (isset($x) && $x > 0) ...

[ Voor 3% gewijzigd door Bosmonster op 21-02-2006 16:44 ]


Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Ja hij is weer terug! Wederom zonder aan dat stukje code te komen:

print_r($product); geeft "sinOle"

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat lijkt me niet helemaal de bedoeling, je verwacht op z'n minst een Object na een new :)

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!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
.oisyn schreef op dinsdag 21 februari 2006 @ 16:49:
Dat lijkt me niet helemaal de bedoeling, je verwacht op z'n minst een Object na een new :)
Ehm... Dat zit toch wel snor in m'n code geloof ik :? Hoe komt het anders dat hij het de eerste keer wel doet, maar als je direct daarna nog een keer het formulier verstuurt hij een fout geeft.

Update: Algehele willekeur, de ene keer doet hij het wel en de andere keer niet. Maar altijd na de tweede keer het formulier versturen.

[ Voor 17% gewijzigd door Fles op 21-02-2006 16:54 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Is dat niet vage cache in je browser die met oude resultaten komt? Of wordt je website over verschillende machines geloadbalanced maar is de code niet goed gereplicate? Aan je code lijkt me iig niets mis nee...

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!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 00:44

orf

Is die code echt wel goed?
In je eerste for loop roep je de functie get_product_id() aan.
In je tweede loop maak je drie maal een object aan en roep je de methode get_product_id() aan.

Acties:
  • 0 Henk 'm!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
FireFox geeft hetzelfde probleem. Bij sommige autos pakt hij nogsteeds de cache ookal gooi ik hem leeg en werk met headers. Maar bij de versie uit de cache geeft hij geen fout.

Als ik zeker weet dat hij de cache niet pakt en dus de huidige versie pakt, krijg ik nogsteeds bij de foutmelding bij het voor de tweede keer versturen van het formulier...
orf schreef op dinsdag 21 februari 2006 @ 17:02:
Is die code echt wel goed?
In je eerste for loop roep je de functie get_product_id() aan.
In je tweede loop maak je drie maal een object aan en roep je de methode get_product_id() aan.
Eerste loop vraag ik 4 keer een id op. In de tweede maak ik 4 keer een object aan en vraag de gegevens op aan de hand van een id.

Na weer wat prutsen: cache probleem lijkt verholpen te zijn na een restart van de webserver.
print_r($product) geeft nu: "Oingle" Dus ik denk dat hier "single" had moeten staan :D

[ Voor 52% gewijzigd door Fles op 21-02-2006 17:20 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Als je een new doet moet je gewoon een object krijgen, de rest van z'n code doet daar niets aan af.
In je eerste for loop roep je de functie get_product_id() aan.
In je tweede loop maak je drie maal een object aan en roep je de methode get_product_id() aan.
De error is dat hij een methode aan probeert te roepen op iets wat geen object is, terwijl dat wel een object zou moeten zijn (het is het resultaat van een new expression)

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!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Ik kan er wel omheen werken trouwens.
PHP:
1
2
3
4
5
6
7
8
9
10
  for ($ctr = 3; $ctr >= 0; $ctr --)
  {
    if ($product_id[$ctr])
    {
      $product[$ctr] = new product($product_id[$ctr]);

//DIT VERVALT
//      $product[$ctr]->get_product($product_id[$ctr]);
    }
  }

Zo blijft hij werken. Maar ben we super nieuwsgierig naar waar het fout ging. Als iemand de oplossing heeft: Graag.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het klinkt eerlijk gezegd als memory corruption... dat je $ctr ineens leeg is en die vage O op willekeurige plekken in de string "single"... er is iets goed fout. Gebruik je naast de standaard PHP extensions nog andere?

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!

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Nope, alleen php verder niets. Zal strax de server es helemaal rebooten, misschien dat hij het dan doet.
Pagina: 1