Undefined variable
Na het inspecteren van mijn php code bleek ik een aantal 'undefined variables' te hebben.
Heb als beginner even bevestiging nodig, indien mogelijk.
1) Dit zorgde voor undefined variable:
Mijn aangepaste code:
2) Dit zorgde voor undefined variable:
(result niet gelijk aan 'leeg'?)
Mijn aangepaste code:
Guido
Anyhow, een undefined variable wil zeggen dat de variabele nog niet is aangemaakt. Als je iets doet met een variabele die nog niet is aangemaakt, krijg je die melding.
Met isset() kun je controleren of een variabele is aangemaakt. Bij het versturen van een formulier worden niet standaard alle invoervelden (variabelen) teruggestuurd. Alleen die zijn ingevuld door de gebruiker. In zo'n geval kan het dus zinvol zijn om eerst te valideren of een veld wel is ingevuld (of een methode te gebruiken die zo'n controle zelf al uitvoert).
Gewijzigd op 15/03/2015 00:32:12 door Ozzie PHP
Bedankt voor je reactie en uitleg. Maakt het voor mij weer een stukje duidelijker.
Bedoeling van mijn bericht: wou weten of ik het zo goed 'vertaalde'?
Guido
Gewijzigd op 15/03/2015 00:50:29 door Guido -
Een iets conreter voorbeeldje zodat je je er wellicht iets meer bij kunt voorstellen. Stel je wilt controleren hoeveel benzine er in de tank van willekeurige auto's zit. Het eerste wat je dan zult moeten doen is controleren of er überhaupt een benzinetank in de auto zit. Misschien rijdt ie wel op diesel of gas, of volkomen electrisch. Vraag 1 is dus is er een benzinetank (isset) en vervolgens ga je kijken wat daar in zit.
Oké ... het is weekend, dus een wat leuker voorbeeldje. Stel je gaat op straat een enquête houden en alle vrouwen boven de 18 vragen welke kleur (de variabele) ondergoed ze aan hebben. Dan zou het zomaar kunnen dat er een paar tussen zitten die helemaal geen ondergoed aan hebben :) De eerste vraag zou dus moeten zijn "Heeft u ondergoed aan?" (ofwel de isset() controle) en pas daarna kun je vragen naar de kleur. Oh ... het stellen van de zojuist genoemde vraag is geheel voor eigen risico. Ik kan niet voor de gevolgen instaan :)
Geef je variabelen een beginwaarde, dan heb je dat probleem niet.
Ozzie PHP op 15/03/2015 00:51:38:
Oké ... het is weekend, dus een wat leuker voorbeeldje. Stel je gaat op straat een enquête houden en alle vrouwen boven de 18 vragen welke kleur (de variabele) ondergoed ze aan hebben. Dan zou het zomaar kunnen dat er een paar tussen zitten die helemaal geen ondergoed aan hebben :) De eerste vraag zou dus moeten zijn "Heeft u ondergoed aan?" (ofwel de isset() controle) en pas daarna kun je vragen naar de kleur. Oh ... het stellen van de zojuist genoemde vraag is geheel voor eigen risico. Ik kan niet voor de gevolgen instaan :)
Toch zie je de Vieze Man het vaak zo doen, zonder functies:
op te lossen, volstaat inderdaad het gebruik van isset().
Maar belangrijk is dan ook de vraag, waar $sent dan vandaan had moeten komen.
Niet zelden wordt deze techniek gebruikt om te kijken of er een form-element genaamd "sent" verstuurd was, of dat er ?sent=1 in de url stond.
Dus waar wel al een jaar of 12 $_POST['sent'] en $_GET['sent'] hadden moeten gebruiken. Helaas zijn er nog geneog tutorials en boeken te vinden waarde oude manier gebruikt wordt.
Of er is code te downloaden van ontwikkelaars die ipv het aanpassen van hun code, gekozen hebben voor het zorgen dat hun server op de oude manier bleef werken.
Weliswaar zou je dan inderdaad van je melding af zijn, (met isset) maar je detecteert ook nooit meer dat een form verstuurd was.
Ik heb deze tutorial gebruikt, die undefined variable meldingen geeft:
http://code.tutsplus.com/articles/creating-a-simple-contact-form-for-simple-needs--wp-27893
Notice: Undefined variable: result
Notice: Undefined variable: form_data
Notice: Undefined variable: sent
Notice: Undefined variable: info
Werkt prima, maar blijkbaar toch niet helemaal goed in elkaar gezet.
Guido
Gewijzigd op 15/03/2015 15:11:08 door Guido -
Het is altijd handig om ook de comments bij zo'n artikel te lezen. Hier staat meestal (veel) aanvullende informatie in.
Ward van der Put op 15/03/2015 11:42:46:
Toch zie je de Vieze Man het vaak zo doen, zonder functies:
Dat brengt me dan toch even bij dit filmpje. "ooooh dan krijg ik ballûh in muh buik ..." Ken je die nog? Hahaha ... trouwens mooi om het "stadsbeeld", de mensen en gebouwen in dat filmpje te zien. Kun je goed zien hoe dat veranderd is ten opzichte van nu.
Kan 1 van jullie me helpen om deze undefined variabeles te laten verdwijnen, want het lukt me gewoon niet om dit met mijn kennis op te lossen.
Guido
Laat eens een beetje relevante code zien die één van je foutmeldingen toont?
Zo moeilijk is het niet.. Stel jij hebt geen auto. En je vrouw/vriend/collega zegt tegen jou: Kan ik bij jou in de auto meerijden?
huh? Dat gaat dus niet. Je kunt dan twee dingen doen:
a) of je zorgt dat er een auto komt
b) of je zorgt dat iedereen eerste even gaat nadenken of jij wel een auto hebt.
in code:
a)
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$auto = true;
// de rest van je code mag je m gebruiken want hij staat nu klaar voor je
?>
$auto = true;
// de rest van je code mag je m gebruiken want hij staat nu klaar voor je
?>
b)
Code (php)
De praktijk:
In de praktijk moet je de variabelen die van buiten je programma komen als onzeker beschouwen.
Voorbeelden hiervan zijn $_POST, $_GET, $_REQUEST en $_COOKIE variabelen. Je weet nooit of je ze wel of niet meegestuurd krijgt. dus kun je weer twee dingen doen:
a)
Code (php)
b)
Code (php)
Gewijzigd op 16/03/2015 15:02:08 door Frank Nietbelangrijk
Moet de variabele een specifieke waarde hebben, zoals $sent == true in je voorbeeld, dan controleer je daarop:
Eventueel kun je dat waar nodig natuurlijk verfijnen:
Code (php)
Gewijzigd op 16/03/2015 14:55:08 door Ward van der Put
Ik ben geen voorstander van empty() omdat een waarde 0 als leeg beschouwd wordt. Daarnaast is deze functie volledig overbodig.
Ik ga ermee aan de slag en zie hoe ver ik kom.
Maar mocht iemand het leuk vinden om mijn script 'clean' te maken, laat het me weten :-).
Guido
Beschouw de variabele $sent. Dit stelt (mits deze naamgeving juist is gekozen) een soort van toestand voor, of een antwoord op de vraag "is X verstuurd?" zo je wil. Ik zou verwachten dan op elk moment deze variabele een van de twee waarden kan hebben: true of false.
Initieel is het aannemelijk dat in de code waar deze variabele wordt gebruikt, er nog niets verstuurd / gebeurd is. Een logische initiele waarde is dan ook false. Dan is er op een zeker moment een bewerking (bijvoorbeeld het versturen van een e-mail) die kan slagen of niet. Dit kan er toe leiden dat de waarde (toestand) van $sent verandert.
Op elk moment wéét je dus wat de waarde van $sent is, en wat de mogelijke waarden zijn.
Een controle op het bestaan van zo'n "boolean variable" komt mij daarom als onlogisch over.
isset() gebruik je als er geen (absolute) zekerheid is dat een variabele (meestal een array-index) bestaat. Hier is meestal sprake van als deze variabelen afkomstig zijn uit een externa bron (denk aan de superglobals $_GET, $_POST etc.). Maar controleren op het bestaan van variabelen waar je zelf de controle over hebt is nogal suf, het is net of je in je eigen code bent vergeten of je deze variabele geïntroduceerd had (of toch niet?).
Als je dit soort variabelen initieel een waarde geeft dan maak je je applicatie minder dubbelzinnig. Want wat betekent het als isset($interneVariabele) false oplevert? Dan houdt dat is dat $interneVariabele op dat moment de waarde null had, of niet was gedeclareerd. Maar het was een interne variabele... Hogwash!
Geef variabelen die je zelf introduceert een waarde. En pas altijd op met het gebruik van de waarde null, vermijd dit als je kan.
EDIT: Ik wijk af van mijn reagerende voorgangers op de volgende punten:
- ik controleer boolean variabelen niet met isset()
- ik vergelijk boolean variabelen niet met een boolean
if ($sent ==(=) true) is suf, gebruik gewoon if ($sent)
wat je wel zou kunnen doen in het kader van leesbaarheid is
if ($sent (=)== false) in plaats van if (!$sent) - die uitroepteken kijk je wellicht overheen of kun je vergeten!
Gewijzigd op 16/03/2015 15:16:54 door Thomas van den Heuvel
in die tutorial worden $sent en $result zo te zien alleen aangemaakt als $error false is.
Ik moest ook even kijken maar de truc is dat je geen nieuwe waarde aan constante kunt toekennen.
Code (php)
1
2
3
4
5
2
3
4
5
<?php
if ($sent = true) { <-- MERK OP DAT ER PER ONGELUK EEN = TE WEINIG STAAT maar je krijgt geen foutmelding
// ...
}
?>
if ($sent = true) { <-- MERK OP DAT ER PER ONGELUK EEN = TE WEINIG STAAT maar je krijgt geen foutmelding
// ...
}
?>
scheelt weer een hoop gezoek naar je eigen fout dus.
Gewijzigd op 16/03/2015 16:08:05 door Frank Nietbelangrijk
Daarin staat een hoofdstukje "E-Mailing the E-Mail"
In de code daaronder staat
pas dat aan naar
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
$error = false;
$sent = false;
$result = false;
?>
if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
$error = false;
$sent = false;
$result = false;
?>
Toevoeging op 16/03/2015 16:12:13:
dat voorkomt dat die booleans alleen aangemaakt worden als er aan bepaalde voorwaarden is voldaan. (als $errors false is op regel 30 of 41