Undefined variable (alternatieven?)
Dus een kort voorbeeldje:
Ik heb een variable $_GET['waarde'] ergens staan, waarbij de waarde bepaald wordt door een link. Echter als er niet op een bepaalde link geklikt wordt, zal deze variabelen dus niet gedefinieerd zijn. Voorheen werd dit gewoon NULL, maar nu gaat het script klagen wat hoogst vervelend is.
In topics zie ik dan dat deze warnings uit te zetten zijn. Als reacties daarop zie ik dat je dan een slechte programmeerstijl aanneemt; Je vermijdt dan het probleem ipv het op te lossen.
Wat ik nergens duidelijk kan vinden, is hoe dit nou eigenlijk goed op te lossen is.
Ik ben er inmiddels achter dat met isset() te controlleren valt of een variabele gedefinieerd is. Dat valt dan toe te passen wanneer er sprake is van IF{}
Als ik zo'n niet gedefinieerde variable direct wil toepassen, bijvoorbeeld in een mysql_query, dan gaat dit niet op.
Een mogelijke oplossing waar ik zelf op uit kom is dan dat ik deze waarde van tevoren ga definieren, dus als volgt:
If(isset($GET_['waarde'])){
$waarde = $GET_['waarde'];
}
else{
$waarde = "";
}
Ik heb inmiddels te maken met duizenden variabelen waar ik dit dan voor moet gaan toepassen en ik vind deze manier nogal omslachtig.
Mijn vraag luidt dan ook of er een andere manier waarop dit aan te pakken is. Is er niet een manier om variabelen op te roepen, waarbij ze automatisch een NULL-waarde krijgen als ze niet gedefinieerd zijn?
Gewijzigd op 01/01/1970 01:00:00 door Kevin Driessen
De warings proberen je duidelijk te maken dat je een variable gebruikt die nog niet gedefinieerd is. Als je goed zou programmeren zou dit dus geen probleem moeten zijn. Dit valt echter wel uit te zetten in httpd.conf maar ik weet niet zo snel of dat ook meoglijk is in je php.ini file. Als je dit gewoon wilt vermijden moet je inderdaad isset() gebruiken.
Je zegt 'als je goed zou programmeren zou dit dus geen probleem moeten zijn'... Ik vind zoiets wel een erg makkelijk antwoord, want 'goed' is erg subjectief.
Laat ik het zo stellen: ik ben uit hobby gaan programmeren en al mijn kennis doe ik op door dingen op te zoeken op het internet. Ik ben dus een superamateur, maar kan inmiddels wel aardig wat programmeren (mbt php).
Ik beschouw deze warnings dus wel degelijk als een probleem. de conclusie zou zijn dat ik niet goed programmeer, maar dat is dan ook direct mijn vraag: hoe moet het dan wel?
Het uitzetten in httpd.conf zal geen moeite zijn, dat heb ik zo uitgezocht. Echter zal ik dan doorgaan met programmeren op een foute manier en uiteindelijk kan ik hierdoor klemlopen als er in de toekomst nog updates plaats gaan vinden waardoor deze foute manier van programmeren niet meer ondersteund wordt. Ik begin dus liever nu aan het herstellen van mijn fouten, dan dat ik dat moet doen wanneer het nog veel meer werk zal gaan kosten.
quote:
"Als je dit gewoon wilt vermijden moet je inderdaad isset() gebruiken."
Ik wil het niet vermijden, maar ik wil het oplossen. Is mijn zelfbedachte optie met isset dan werkelijk de enige optie?
Het is net zoiets als roepen: Jan wat is je naam? Zonder te kijken of Jan er wel is.
Over je probleem: ik merk een beetje het traditionele liedje hier. Iemand leert wat PHP en maakt een leuk script, vervolgens wordt het groter en complexer. Als je dan later terug kijkt op wat je gemaakt hebt blijkt het niet handig te zijn geweest of gewoon niet veilig, en dat kan een probleem zijn als het nog ingewikkelder wordt. Dus maak eerst een plan van wat je nu eers wil doen: hoe gaat de database er uit zien, gebruik ik hoofdletters, doe ik alles in het engels, documenteer ik alles en ga zo maar door. Hiernaa wordt het al een stuk oversichtelijker wat je aan het doen bent.
"Als je goed zou programmeren zou dit dus geen probleem moeten zijn." is misschien een beetje anders overgekomen dat ik bedoelt had. Als je namelijk eerst definieerd en dan de variables gebruikt werkt het wel, dus het is een kwestie van luiheid/gemakzucht. Het klinkt in feite ook logisch dat als je iets gaat gebruiken het er dan ook moet zijn, toch? Ook zeg je dat je een soort van bang bent dat als het allemaal iets anders wordt dat je hele systeem dan niet meer werkt. Dit vind ik echter een verkeerd opmerking omdat het in de prakrijk weinig voorkomt.
Je kunt deze waring een soort van beschouwen als een "fout" in php en het ligt dus niet zozeer aan jou. En ja isset is inderdaat een van de weinige opties.
Quote:
Ik vind het een leuke vergelijking. Ik denk trouwens dat je bedoelt "Jan, ben je er?" ipv 'wat is je naam', want je weet de naam al, evenals je al weet hoe de variabele heet XDHet is net zoiets als roepen: Jan wat is je naam? Zonder te kijken of Jan er wel is.
Maar om alsnog bij-de-hand te reageren: wat je zegt klinkt logisch, maar nu even vanuit dit aspect:
Als ik zou roepen "jan, ben je er?" en ik krijg geen reactie, dan concludeer ik dus dat hij er niet is.
Ofterwijl: als je een variabele en die variabele is er niet, dan lijkt het mij gewoon logisch dat deze variabele geen waarde heeft (gelijk te stellen aan NULL).
Dit is in feite wat PHP ook doet, echter krijg je dan de waarschuwing dat die variabele niet bestaat...
Nu kan ik, zoals yorick zegt, dit beschouwen als een onnozel iets van PHP. het is echter dan mijn ergernis dat ik dan mensen zie zeggen dat 'je je kop in het zand steekt'. In plaats van jullie ermee lastig vallen, zou ik graag hen ermee lastigvallen, maar die berichten gaan jaren terug, dus erop reageren zal weinig zin hebben.
Nu zit ik slechts met de twijfels waarvoor ik moet kiezen:
enerzijds valt het negeren van die warnings te zien als slecht programmeurstijl, maar anderzijds is het toepassen van 'isset' erg lomp en zal bepaalde delen van mijn scripts verdrievoudigen (als al niet meer). Niet dat het direct de site vertraagt, maar ik houd er liever wel alvast rekening mee.
In ieder geval bedankt voor jullie reacties en het meedenken.
Notice beteknt iets als merk op.
Het is proper om de notices weg te werken, maar notices veranderen meestal niets aan je php logica.
Gewijzigd op 01/01/1970 01:00:00 door Emmanuel Delay
Emmanuel Delay schreef op 21.12.2009 15:33:
Oh, srry voor het verkeerd herinneren van het type melding. Dat het niets verandert aan de werking van het script weet ik al. Uit bovenstaande berichten is dat ook op te maken (zoals gezegd kan de notice uitgezet worden). Er is echter een reden dat notices bedacht zijn en dat negeren bevalt mij dus niet helemaal.Het gaat hier niet om warnings, het gaat om notices.
Gewijzigd op 01/01/1970 01:00:00 door Kevin Driessen
Kevin schreef op 21.12.2009 15:24:
enerzijds valt het negeren van die warnings te zien als slecht programmeurstijl, maar anderzijds is het toepassen van 'isset' erg lomp en zal bepaalde delen van mijn scripts verdrievoudigen (als al niet meer). Niet dat het direct de site vertraagt, maar ik houd er liever wel alvast rekening mee.
Ik vind het eerder lomp om variabelen te gebruiken waarvan je niet weet of ze bestaan. Maar zo verschrikkelijk veel user input is er toch niet om even te checken? Ook zou je dit in een functietje kunnen zetten, waarmee je het bijvoorbeeld meteen checkt op foute input
Als je het uit wilt zetten is dit wrs de makkelijkste manier:
Gewijzigd op 01/01/1970 01:00:00 door Pim -
Pim schreef op 21.12.2009 16:26:
Het is maar waarmee je 'opgevoed' bent. De één vind vanzelfsprekend dat je variabelen moet aangeven, de ander vindt het vanzelfsprekend dat de variabelen een null-waarde krijgen als er geen waarde is.Ik vind het eerder lomp om variabelen te gebruiken waarvan je niet weet of ze bestaan.
Niet weten of ze bestaan? Dit hangt dus af van een situatie: wanneer er aan bepaalde eisen voldaan wordt, zal deze variabele wel een waarde hebben. In een ander geval, zal deze niet benoemd worden. Het is een kwestie van gemakzucht.