[PHP] Ongedeclareerde variabele in een if *

Pagina: 1
Acties:

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 16:32
ik heb hier een verschrikkelijk wazig probleem. het is een simpel if lusje maar op de een of andere manier voert PHP de lus uit terwijl de variabele waarop ik vergelijk in de if lus niet eens bestaat!

het gaat om de volgende code:
URL waarmee de boel aangeroepen wordt:
-----
todo.php?
action=1&
s=2&
del=1&
todo_id=26&
project_id_sel=14&
visit=1
-----
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
if ($s == 1)
{   
 //andere code
}


elseif ($s == 2)
{
   if ($uitgevoerd == 1 || $uitgevoerd == 0)
   {
     $query = "UPDATE todo SET uitgevoerd = $uitgevoerd WHERE id = $todo_id";
     mysql_query($query);
     $melding = 4;
     $todo_id = 0;
   }

   if ($del == 1)
   {
     echo "<BR><BR>$todo_id";
     $query = "DELETE FROM todo WHERE id = $todo_id";
     mysql_query($query);
     $melding = 1;
    }
}

nou is het wazige dat de if lus met $uitgevoerd ALTIJD wordt uitgevoerd en daarmee $todo_id op 0 wordt gezet.
ook als $uitgevoerd niet eens bestaat en nergens boven deze if lus wordt aangemaakt / veranderd :?
$uitgevoerd wordt dan ook niet eens meegeven met de URL.

de code staat bovenaan in todo.php onder wat includes, maar todo.php is de ENIGE pagina waarin deze variabele bestaat.

doe ik echter de vergelijking zo :
code:
1
2
3
4
5
if ($uitgevoerd == 1 || $uitgevoerd == "0")

of 

if ($uitgevoerd || $uitgevoerd == "0")

dan werkt het wel :? :?

iemand een idee wat ik fout doe of is dit mischien een bug in PHP?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-09 21:31

Janoz

Moderator Devschuur®

!litemod

Wees maar gerust.. Jij doet het fout.. Omdat uitgevoerd helemaal niet gedefinieerd is is het beter om isset() gebruiken. Waarschijnlijk heb je errorreporting erg laag staan en kom t er dus ook geen waarschuwing.

Wat hier gebeurt is omdat $uitgevoerd nergens een waarde gegeven word en voor het eerst wordt gebruikt in de if-conditie gaat php de variable aanmaken. Bij het aanmaken van een var wordt deze op false of 0 gezet, en dan voldoet je if-conditie.

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


  • AlKoholiK
  • Registratie: Januari 2001
  • Laatst online: 10-09 14:55

AlKoholiK

Mr. Dope E. Fish

wat ik denk is dat als je een var gaat opvragen, dattie dan wordt aangemaakt. je controlleer met $var == 1 offie bestaat, maar met $var == "1" of de waarde 1 erin zit. Gebruik gewoon die haakjes, en kijk of ze het van wel goed doen.

$var == 1 resulteert dus in een $var met waarde FALSE, maar $var == "1" resulteert in een $var met waarde TRUE en 1.

correct me if i'm wrong :)

DOPEFISH. The second-dumbest creature in the universe. This creature's thought patterns go "swim swim hungry, swim swim hungry". They'll eat anything alive and moving near them, though they prefer heroes.


Verwijderd

Ik denk dat de verklaring is dat false stiekum 0 is. Als je in een if-statement een var test die niet geset is zal deze var false opleveren en dat is dus gelijk aan 0.

Vrij logisch dan allemaal.
Test op "0" of test op $var == 0 && isset($var)

Maar zeker weten doe ik het niet.
Trouwens, als je al weet wat je moet doen zodat ie wel werkt, wat is het probleem dan :?

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 16:32
aha dat verklaart die wazige dingen die ik soms krijg in mijn php gebrabbel. :Y)

in ASP was het allemaal ietsje duidelijker.

nou weet ik in iedergeval hoe het komt en wat ik eraan moet doen. bedankt voor de snelle reacties :)

  • AlKoholiK
  • Registratie: Januari 2001
  • Laatst online: 10-09 14:55

AlKoholiK

Mr. Dope E. Fish

Op donderdag 14 februari 2002 12:06 schreef twiekert het volgende:
aha dat verklaart die wazige dingen die ik soms krijg in mijn php gebrabbel. :Y)

in ASP was het allemaal ietsje duidelijker.

nou weet ik in iedergeval hoe het komt en wat ik eraan moet doen. bedankt voor de snelle reacties :)
Zou je het aub even willen melden als het werkt, want ik kreeg die uitspatting opeens, maar ik zou niet weten of het goed is wat ik nou net geschreven heb *D

DOPEFISH. The second-dumbest creature in the universe. This creature's thought patterns go "swim swim hungry, swim swim hungry". They'll eat anything alive and moving near them, though they prefer heroes.


  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 16:32
Op donderdag 14 februari 2002 12:07 schreef AlKoholiK het volgende:

[..]

Zou je het aub even willen melden als het werkt, want ik kreeg die uitspatting opeens, maar ik zou niet weten of het goed is wat ik nou net geschreven heb *D
het werkt :7

nou nog even 1400 regels source nakijken om de if lussen te wijzigen waar nodig.

quotes om de waarde van de variabele heen werkt goed :)
code:
1
2
3
4
if ($uitgevoerd == "1" || $uitgevoerd == "0")
{
   // dit werkt dus
}

  • AlKoholiK
  • Registratie: Januari 2001
  • Laatst online: 10-09 14:55

AlKoholiK

Mr. Dope E. Fish

Op donderdag 14 februari 2002 12:12 schreef twiekert het volgende:

[..]

het werkt :7

nou nog even 1400 regels source nakijken om de if lussen te wijzigen waar nodig.

quotes om de waarde van de variabele heen werkt goed :)
code:
1
2
3
4
if ($uitgevoerd == "1" || $uitgevoerd == "0")
{
   // dit werkt dus
}
C00L!!!
Ik ben dus een verschrikkelijke n00b op PHPgebied, maar dit schoot me zo ff tebinnen.

Maargoed, leuk dat het werkt :)

DOPEFISH. The second-dumbest creature in the universe. This creature's thought patterns go "swim swim hungry, swim swim hungry". They'll eat anything alive and moving near them, though they prefer heroes.


  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 16:32
nog even voor de duidelijkheid.

als een variabele al aangemaakt is bijvoorbeeld $inlogcheck = 1;

en ik doe
code:
1
2
if ($inlogcheck == 1)
     // inlog = ok

dan controleert PHP toch of de waarde 1 in $inlogcheck staat? of $inlogcheck == 0 is controle of waarde 0 in $inlogcheck staat?

of moet er overal quotes omheen?

  • AlKoholiK
  • Registratie: Januari 2001
  • Laatst online: 10-09 14:55

AlKoholiK

Mr. Dope E. Fish

Op donderdag 14 februari 2002 12:17 schreef twiekert het volgende:
nog even voor de duidelijkheid.

als een variabele al aangemaakt is bijvoorbeeld $inlogcheck = 1;

en ik doe
code:
1
2
if ($inlogcheck == 1)
     // inlog = ok

dan controleert PHP toch of de waarde 1 in $inlogcheck staat? of $inlogcheck == 0 is controle of waarde 0 in $inlogcheck staat?

of moet er overal quotes omheen?
Als je quotes eromheen zet, controlleert hij of de waarde binnen die quotes in die var staat.
Als je er geen quotes omheen zet, controlleert hij of die var bestaat. Maar zodra je een var in het leven roept, bestaat hij. Dus $var == 1 zal altijd resulteren in TRUE(volgens mij hoor...)

Dus als je op WAARDEN gaat controlleren => altijd quotes gebruiken

DOPEFISH. The second-dumbest creature in the universe. This creature's thought patterns go "swim swim hungry, swim swim hungry". They'll eat anything alive and moving near them, though they prefer heroes.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Topic titel even aangepast... Je kunt er in 99.99% van de gevallen wel vanuit gaan dat het geen bug is (maar een feature ;) ).

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 16:32
Op donderdag 14 februari 2002 12:19 schreef AlKoholiK het volgende:

[..]

Als je quotes eromheen zet, controlleert hij of de waarde binnen die quotes in die var staat.
Als je er geen quotes omheen zet, controlleert hij of die var bestaat. Maar zodra je een var in het leven roept, bestaat hij. Dus $var == 1 zal altijd resulteren in TRUE(volgens mij hoor...)

Dus als je op WAARDEN gaat controlleren => altijd quotes gebruiken
ik dan maar gewoon om zeker te zijn overal quotes om heen.

  • Grum
  • Registratie: Juni 2001
  • Niet online
erm doe het dan gewoon GOED .. want met quotes ontloop je het eigenlijke probleem dat de waarde gewoon NIET defined is

dus doe iets als
code:
1
2
if(isset($variabele) && ($variabele == 0 || $variabele == 1))
   // doe iets

dat is de netste manier en 100% zonder errors/warnings op error_reporting(E_ALL);

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Grum_: dus doe iets als [isset]
Waarom krijg ik het idee dat dit een enorme work-around is voor het grote gebrek van variabele declaraties :) .

Als dit echt de goede manier is om te werken, zou ik sterk voor de invoering van variabele declaraties zijn (als ik uberhaupt in PHP zou werken ;) ).

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • CyeZ
  • Registratie: September 2001
  • Laatst online: 14:15

CyeZ

Vroem vroem!!!

Als je variablen gebruikt in een 'if' constructie dan zorgen de ""jes ervoor dat je een string vergelijkt.
bv:
code:
1
  if ($blaat == "1"){...}

Vergelijkt dus of in de variabele $blaat de tekst "1" staat.

Als je de ""jes weglaat, dus:
code:
1
  if ($blaat == 1){...}

Dan vergelijkje of de variabele $blaat het getal 1 bevat.

Het zou niks uit moeten maken, omdat PHP in principe geen type's gebruikt. Intern wordt dit echter wel gedaan.

Volgens mij is het zo (niet 100% zeker) dat op het moment dat je een variabele voor het eerst gebruikt deze automatisch wordt aangemaakt. Ook als dit in een vergelijking is. Deze variabele zal dan een standaard waarde krijgen, waarschijnlijk 0. Hierdoor loopt je check dus fout.

Om dit te voorkomen is er de speciale isset() functie, waarmee je kunt controleren of er aan een variabele een waarde is toegekent.
code:
1
  if(isset($blaat)){...}

[18:54] <Prammenhanger> |HunterPro|eet
[18:55] <Prammenhanger> lijkt best op
[18:55] <Prammenhanger> |HunterProFeet


  • AlKoholiK
  • Registratie: Januari 2001
  • Laatst online: 10-09 14:55

AlKoholiK

Mr. Dope E. Fish

Op donderdag 14 februari 2002 12:49 schreef CyeZ het volgende:
Als je variablen gebruikt in een 'if' constructie dan zorgen de ""jes ervoor dat je een string vergelijkt.
bv:
code:
1
  if ($blaat == "1"){...}

Vergelijkt dus of in de variabele $blaat de tekst "1" staat.

Als je de ""jes weglaat, dus:
code:
1
  if ($blaat == 1){...}

Dan vergelijkje of de variabele $blaat het getal 1 bevat.
Zo zat het dus. :)

Als je een var defineert met een STRING, en je vergelijkt hem met een WAARDE, dan loopt het mis. Je moet dus consequent blijven.

DOPEFISH. The second-dumbest creature in the universe. This creature's thought patterns go "swim swim hungry, swim swim hungry". They'll eat anything alive and moving near them, though they prefer heroes.


  • CyeZ
  • Registratie: September 2001
  • Laatst online: 14:15

CyeZ

Vroem vroem!!!

Op donderdag 14 februari 2002 12:48 schreef mbravenboer het volgende:

[..]

Waarom krijg ik het idee dat dit een enorme work-around is voor het grote gebrek van variabele declaraties :) .

Als dit echt de goede manier is om te werken, zou ik sterk voor de invoering van variabele declaraties zijn (als ik uberhaupt in PHP zou werken ;) ).
Het is dus inderdaad de goede manier om te werken. Ik ben het met je eens dat variabele declaraties eigenlijk missen in PHP. Doordat er in PHP geen variabele declaratie manier bestaat krijg je al snel het probleem dat variabelen ergens halverwege je code gedeclareerd worden. Hierdoor raak je dus snel het overzicht van je variabelen kwijt in grote (50Kb+) scripts. Een soortgelijk probleem kom je tegen als je een waarde die je via POST of GET in een variabele hebt gekregen als index voor een array wilt gebruikt. Je moet dat specifiek met de functie intval() aangeven dat het om een getal gaat ipv een stuk tekst.

[18:54] <Prammenhanger> |HunterPro|eet
[18:55] <Prammenhanger> lijkt best op
[18:55] <Prammenhanger> |HunterProFeet


  • Grum
  • Registratie: Juni 2001
  • Niet online
dat hoeft niet hoor :)

ff een link opzoeken >:)

http://www.e-gineer.com/articles/php-hackers-paradise-revisited.phtml

naar beneden scrollen naar sectie 3.7 'Know your data'

PS: bij php is der geen verschil tussen (numbered) arrays en named-arrays (structs)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Ben het er niet helemaal mee eens, CyeZ.

Het is namelijk zo dat PHP impliciet een type-conversie doet bij een vergelijk met ==. Wanneer je echter === gebruikt, checkt PHP ook het type. Mijn mening is dat je die dus moet gebruiken. Dan heb je isset namelijk helemaal niet nodig.

voorbeeld
code:
1
2
3
4
5
6
7
8
9
10
11
$var1 = false;
// $var2 bestaat dus niet

if ( $var1 == $var2 )
   echo "Var1 en var2 zijn in waarde gelijk...";
if ( $var1 === $var2 )
   echo "Var1 zijn in waarde zowel als in type gelijk";
/*
Output zal dus zijn:
Var1 en var2 zijn in waarde gelijk...
*/

Ik ben het met mbravenboer eens (alweer? ja alweer ;)) dat isset een beetje een schrale workaround is. Het werkt wel maar ik ben voor het gebruiken van ===.

Helaas ondersteunt PHP < 4.04 dit nog niet...

edit:
zie btw ook
Comparison Operators

edit2:
Grum> exact :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • CyeZ
  • Registratie: September 2001
  • Laatst online: 14:15

CyeZ

Vroem vroem!!!

De === operator is inderdaad ook een mogelijk om dit soort problemen op te lossen.

[beetje off-topic]
Jammer alleen dat er geen varianten van zijn voor '<' en '>'. Omdat een string altijd naar 0 word gecast leveren dit soort checks dus problemen op:
code:
1
if (-100 < "$blaat"){...}

Als hier nu tekst in de variabele $blaat staat gaat dit dus fout. (Aangenomen dat je niet wilt dat die tekst als '0' wordt geinterpreteerd).
[/beetje off-topic]

Voor de topic-starter is dus de === operator of de isset() functie een oplossing.

[18:54] <Prammenhanger> |HunterPro|eet
[18:55] <Prammenhanger> lijkt best op
[18:55] <Prammenhanger> |HunterProFeet


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Ik vind de === oplossing het mooist, maar dat mag topicstarter zelf kiezen ;)
CyeZ:
Jammer alleen dat er geen varianten van zijn voor '<' en '>'. Omdat een string altijd naar 0 word gecast leveren dit soort checks dus problemen op:
code:
1
if (-100 < "$blaat"){...}

Als hier nu tekst in de variabele $blaat staat gaat dit dus fout. (Aangenomen dat je niet wilt dat die tekst als '0' wordt geinterpreteerd).
Dat begrijp ik niet. Als je een "groter dan" of "kleiner dan" evaluatie doet, waarom zou je dat dan op text-strings toepassen? Ik bedoel het volgende:
code:
1
2
3
4
5
6
7
8
9
// dit is logisch:
$blaat = "1";
if ( $blaat > 0 ) // <-- hier wordt dus impliciet gecast naar int
   echo "Positief getal!!";

// maar dit :?
$blaat = "text";
if ( $blaat < 0 )
   echo "watte?";

Ik begrijp dat punt niet helemaal, licht eens een beetje toe plz :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • CyeZ
  • Registratie: September 2001
  • Laatst online: 14:15

CyeZ

Vroem vroem!!!

Op donderdag 14 februari 2002 14:20 schreef drm het volgende:
[..]

Dat begrijp ik niet. Als je een "groter dan" of "kleiner dan" evaluatie doet, waarom zou je dat dan op text-strings toepassen? Ik bedoel het volgende:

Ik begrijp dat punt niet helemaal, licht eens een beetje toe plz :)
Ik gebruik zelf af en toe functies die of een stuk tekst/array terug geeft als de bewerking goed is gegaan, of een getal die een fout aangeeft. In zo'n geval is het dus heel goed mogelijk dat de variabele die je in je check gebruikt dus een stuk tekst/array bevat ipv een getal. Bij dit soort constructies moet je dus goed opletten dat je vergelijking niet perongelijk die string als 0 aanziet.

[18:54] <Prammenhanger> |HunterPro|eet
[18:55] <Prammenhanger> lijkt best op
[18:55] <Prammenhanger> |HunterProFeet


  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 16:32
de === vergelijking & controle lijkt mij ook het mooist omdat dat nog het overzichtelijkst is :)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Ah op zo'n fiets. Ja, dat kan ik me voorstellen. Maar als dat soort ambiguiteiten optreden zou je misschien na moeten denken over een ander functie-voorschrift.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 16:32
Op donderdag 14 februari 2002 14:32 schreef drm het volgende:
Ah op zo'n fiets. Ja, dat kan ik me voorstellen. Maar als dat soort ambiguiteiten optreden zou je misschien na moeten denken over een ander functie-voorschrift.
wat is dan de beste manier zijn om een getal die je krijgt via POST of GET te vergelijken?

1. if (isset($s) && $s == 1)

2. if (intval($s) == 1)

3. if ($s == "1")
Pagina: 1