[PHP] IF laat verkeerde vars door.

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

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb de volgende code:
code:
1
2
3
4
5
6
7
8
9
while(list($param,$waarde) = each($settings[0]))
            {
                echo "VALUE: ".$waarde." KEY: ".$param;
                if(($waarde != "" AND $waarde != 0) AND $param != "users_id")
                {
                    echo "CORRECT";
                    $this->$param = $waarde;
                }
            }

Bij het echoen geeft hij wel degelijk een waarde. In dit geval echoot hij:

VALUE: ff8800 KEY: tableheadercolor.

Hij voldoet dus aan de if, echter echot hij niet CORRECT, en tevens set hij de object variabele $this->$param ook niet. Ik staar me blind, maar ik zie het niet.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 16:51
Die haakjes zijn in ieders geval niet nodig omdat alles verplicht is.Verder zal $param door je loop weer worden overschrven, gebruik eens een andere naam, misschien helpt dat. Al ben ik er niet zeker van of dit ook zo is in een class.

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
doe eens
PHP:
1
if (!empty ($waarde) AND $param != "user_ids"){};


*haal zoveel mogelijk dingen uit je if-je, totdat het goed gaat en bouw hem vandaar opnieuw op

[ Voor 45% gewijzigd door PrisonerOfPain op 28-10-2003 21:37 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Probeer eens met haakjes rond $waarde != "" en haakjes rond $waarde != 0?
Dus dat je krijgt:

PHP:
1
if((($waarde != "") AND ($waarde != 0)) AND $param != "users_id")

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 15:29

MBV

Waarom lees je de waarde uit met this-> en test je hem zonder this-> ? Ik denk dat daarin de fout zit. Ik heb gehoord dat je membervariabelen altijd met this-> moet aanroepen (klok/klepel, ga vrijdag/zaterdag zelf aan het knutselen met klasses in php)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

sir5: aan dat soort vage probeerseltjes heb je natuurlijk ook niets.

lisson01: het zit m in die $waarde != 0
Dat geeft namelijk false als $waarde een string is. Probeer eens $waarde !== 0

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!

Verwijderd

Topicstarter
De empty functie werkt. Mooi zo! Maar waarom werkte mijn functie dan niet ?)

Okay, dus wat doet precies een dubbel = teken?

[ Voor 25% gewijzigd door Verwijderd op 28-10-2003 21:40 ]


Acties:
  • 0 Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 16:24
Verwijderd schreef op 28 October 2003 @ 21:30:
Ik heb de volgende code:
code:
1
2
3
4
5
6
7
8
9
while(list($param,$waarde) = each($settings[0]))
            {
                echo "VALUE: ".$waarde." KEY: ".$param;
                if(($waarde != "" AND $waarde != 0) AND $param != "users_id")
                {
                    echo "CORRECT";
                    $this->$param = $waarde;
                }
            }

Bij het echoen geeft hij wel degelijk een waarde. In dit geval echoot hij:

VALUE: ff8800 KEY: tableheadercolor.

Hij voldoet dus aan de if, echter echot hij niet CORRECT, en tevens set hij de object variabele $this->$param ook niet. Ik staar me blind, maar ik zie het niet.
Je probleem zit 'm in de zogenaamde impliciete type cast die in de IF gebeurt. Als je nl. $waarde != 0 hebt staan, evalueert PHP de string in $waarde naar een numerieke waarde. In jouw geval evalueert de waarde 'ff8800' naar 0 en gaat de if dus mis.

Je zou het als volgt kunnen oplossen:

PHP:
1
if($waarde != "" AND (!is_numeric($waarde) || $waarde != 0) AND $param != "users_id")


Overigens had je dit zelf ook wel kunnen uitvinden door de verschillende onderdelen uit de IF weg te halen om te kijken waar het nu mis gaat.

De aangedragen oplossingen met haakjes toevoegen/weghalen hebben niets met het probleem te maken.

De oplossing om met empty() te gaan werken, resulteert in DIT geval in een werkende IF, maar daar is empty() niet voor bedoeld. Het is een toevallig side-effect dat het nu goed gaat. empty() is nl. niets anders dan een omgekeerde boolean typecast, dus NIET een controle of een variabele leeg is!

Gebruik maar eens het resultaat van een functie direct in een empty() aanroep. Dan krijg je een compiler error! Niet vreemd overigens, omdat empty() alleen op variabelen werkt. Voorbeeld:

PHP:
1
2
3
if(empty(strtoupper($variable))) {
 echo "LEGE VARIABELE";
}


Dit voorbeeld genereert dus een compiler error.

[ Voor 45% gewijzigd door mjax op 28-10-2003 21:49 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Testen op is_numeric is natuurlijk ook een beetje overbodig als php ook vergelijkingsoperatoren heeft die niet typecasten (de extra = erachter) :)

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!

  • mjax
  • Registratie: September 2000
  • Laatst online: 16:24
.oisyn schreef op 28 oktober 2003 @ 21:41:
Testen op is_numeric is natuurlijk ook een beetje overbodig als php ook vergelijkingsoperatoren heeft die niet typecasten (de extra = erachter) :)
Helemaal mee eens, maar in het licht van mijn enigszins educatieve verhaal, leek mij de keuze voor is_numeric() duidelijker dan de !== operator.

Maar verder heb je helemaal gelijk.

Acties:
  • 0 Henk 'm!

  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024

Roa

of gewoon "0", dan doetie et ook volgens mij :P

Research is what I'm doing when I don't know what I'm doing.

Pagina: 1