[PHP][discussie] Variabelen definieëren en error reporting

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • posttoast
  • Registratie: April 2000
  • Laatst online: 23:34
Een tijd terug had ik de PHP error reporting van mijn ontwikkelserver altijd op E_ALL staan. Je krijgt dan ook errors terug van variabelen die je niet gedefinieërd hebt. Toendertijd definieërde ik ook altijd netjes alle variabelen die ik gebruikte.

Toen ik echter met een aantal andere programmeurs een stuk van mijn code doornam verklaarden ze mij voor gek dat ik dat deed. Het was volgens hen veel meer werk en redelijk onzinnig, omdat in een productieomgeving over het algemeen de variabelen die niet gedefinieërd zijn toch de waarde NULL krijgen en het dus helemaal niet nodig is om alles te definieëren. Vanaf toen ben ik dit niet meer gaan doen, wat inderdaad tijd scheelde (geen bergen IF's meer die checken of een POST of GET waarde geset is bijvoorbeeld).

Vandaag liep ik echter tegen een probleem aan: een ongedefinieërde variabele kreeg plotseling de waarde 1, waardoor een script niet goed meer werkte. Dit was op een nogal oude PHP versie (4.2.2), maar toch erg vreemd. Ik sprak met een programmeur die mijn stuk code daarop moest implementeren, en hij vond het juist raar dat ik niet alle variabelen netjes gedefinieërd had en mijn error reporting niet op E_ALL had staan.

Jullie snappen het al: ik weet het niet meer. Ik snap dat het het netst is om alles te definiëren, maar doen jullie dat allemaal ook daadwerkelijk? En indien niet: waarom niet? Ik vraag me af of ik mezelf weer "netter" moet leren programmeren, dus ik ben erg benieuwd naar jullie argumenten.

[ Voor 1% gewijzigd door posttoast op 11-05-2006 19:14 . Reden: Typo ]

omniscale.nl


Acties:
  • 0 Henk 'm!

  • Rob
  • Registratie: Februari 2000
  • Niet online

Rob

Alle variabelen netjes declareren geeft ook een goed beeld van alle variabelen die je gebruikt.
Dat kan weer handig zijn voor andere programmeurs die in je code werken.

In the beginning the Internet was a bunch of smart users with dumb terminals. Now...


Acties:
  • 0 Henk 'm!

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Ik doe het wel. Controleer ook altijd of variablen wel via POST of GET aanwezig zijn.

Reden is simpel. Dan weet ik tenminste zeker dat dat allemaal in orde is. Er zijn altijd wel genoeg bugs om na te lopen in complexe scripts. En dit soort beginner gepruts wil je dan gewoon niet hebben.

Die programeurs waar je mee sprak zijn hun geld echt niet waard als ze dergelijk prutswerk af durven te leveren bij hun opdrachtgevers.

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Ik check ook altijd alles wat binnenkomt + declareer m'n vars.

Je maakt je code er gewoon leesbaarder door en je voorkomt problemen met register_globals / includes (geinclude bestand bevat variabele met dezelfde naam bijv.).

Acties:
  • 0 Henk 'm!

  • Wizz15
  • Registratie: Januari 2004
  • Laatst online: 26-10-2022
ik ben het er ook mee eens dat je altijd E_ALL moet gebruiken en je vars declareren. Vooral als er meerdere mensen aan moeten werken is dit declareren zeer handig.

Bij php 5 zou ik trouwens ook op E_STRICT ( error_reporting( E_ALL | E_STRICT ); ) checken, zeker als je ook object-georienteerd bezig bent.

PSN: RikBruil | BFBC2 stats


Acties:
  • 0 Henk 'm!

  • RuudBurger
  • Registratie: Oktober 2003
  • Laatst online: 20-09 21:38
als je kijkt of er geen lege variables zijn en check of de variable wel is wat hij moet zijn (string, int) dan krijg je ook minder kans op fouten en "hackbare" software lijkt mij..

Acties:
  • 0 Henk 'm!

Verwijderd

niet-gedeclareerde POST-variabelen vind ik juist wel handig soms:
PHP:
1
2
3
4
5
6
7
8
if (!isset($_POST["var"]))
{
    // laat formulier zien (action=$_SERVER["PHP_SELF"])
}
else
{
   // doe formulierafhandeling
}

Of zouden jullie dat anders oplossen?

Acties:
  • 0 Henk 'm!

  • RuudBurger
  • Registratie: Oktober 2003
  • Laatst online: 20-09 21:38
ik doe altijd zoiets

PHP:
1
2
3
4
5
6
7
8
$variable = (isset($_GET['var'])) ? $_GET['var'] : "standaardwaarde" ;

if ($variable == "blaat"){

}
elseif ($variable == "standaardwaarde") {

}

[ Voor 23% gewijzigd door RuudBurger op 11-05-2006 19:42 ]


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Verwijderd schreef op donderdag 11 mei 2006 @ 19:36:
niet-gedeclareerde POST-variabelen vind ik juist wel handig soms:
PHP:
1
2
3
4
5
6
7
8
if (!isset($_POST["var"]))
{
    // laat formulier zien (action=$_SERVER["PHP_SELF"])
}
else
{
   // doe formulierafhandeling
}

Of zouden jullie dat anders oplossen?
PHP:
1
2
3
4
5
6
7
8
9
if ($_SERVER['REQUEST_METHOD']) == 'POST')
{
    $var = isset($_POST['var']) && isset($_POST['var'] != '' ? $_POST['var'] : 'standaardwaare';
    // doe formulierafhandeling
}
else
{
   // laat formulier zien
}


Uiteraard ook altijd de data goed controleren.

Als je trouwens geen zin hebt om telkens een hoop controles te doen kan je ook zoiets doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function getVariable($name, $type, $defaultvalue = '')
{
   $result = $defaultvalue;

   switch ($type)
   {
     case 'POST' :
       if (isset($_POST[$name]) && $_POST[$name]) != '') $result = $_POST[$name];
       break;
     case 'GET' :
       if (isset($_GET[$name]) && $_GET[$name] != '') $result = $_GET[$name];
       break;
   }

   return $result;
}

$var = getVariable('email', 'POST');


In die functie stop je controles zoveel je wil, en dat hoef je dan ook maar 1 keer te doen.

March of the Eagles


Acties:
  • 0 Henk 'm!

  • x-force
  • Registratie: Maart 2001
  • Laatst online: 05-01-2024
je zou ook nog met $_REQUEST[] kunnen werken? Dan hoef je niet elke keer te controleren of het uit de post of de get array komt.

VangenopBetaalwater.nl Het platform om ervaringen over betaalwater in Frankrijk te delen met andere karpervissers zodat iedereen kan vangen op betaalwater!


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Mwah, soms wil je juist garanderen dat het specefiek uit 1 van die twee komt.

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


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Persoonlijk controleer ik liever of het uit de post of get array komt, ik wil namelijk zekerheid over m'n code. Als ik een value uit de url hebben wil dan wil ik die van nergens anders.

March of the Eagles


Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 22:41
Het grootste nadeel van
PHP:
1
if ($_SERVER['REQUEST_METHOD']) == 'POST')

is dat deze niet altijd bruikbaar is. Wat als de pagina met het formulier de eerste keer al met POST-waarden wordt aangeroepen? (en dus nog wel getoond dient te worden?)
Dan lijkt me een controle op een waardie die alleen bij dat formulier ingevuld kan worden toch handiger.

Voor het E_ALL gedeelte, ik declareer alle variabelen van te voren. Geeft een mooi overzicht, en bovendien voorkomt het dat door middel van register_globals de site fouten gaat genereren. (of de beveiliging omzeild wordt)

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • posttoast
  • Registratie: April 2000
  • Laatst online: 23:34
Bedankt voor al jullie reacties, het is erg leerzaam. Even een resumé van wat ik tot nu toe geleerd heb:

Het is goed om al je variabelen te declareren, al is het maar voor het overzicht. Zet daarom ook je PHP error reporting op E_ALL om ervoor te zorgen dat je dit ook echt doet.

Hierover vraag ik me nog wel iets af:
Grote prutser schreef op donderdag 11 mei 2006 @ 19:24:
Ik check ook altijd alles wat binnenkomt + declareer m'n vars.

Je maakt je code er gewoon leesbaarder door en je voorkomt problemen met register_globals / includes (geinclude bestand bevat variabele met dezelfde naam bijv.).
Bedoel je hiermee dat het sowieso niet netjes is om in een geinclude bestand een variabele te gebruiken die gedeclareerd is in het "moederbestand"?

En nog een vraagje, wat is "beter":

dit:
PHP:
1
$variable = (isset($_POST['var'])) ? $_POST['var'] : "" ;

of dit:
PHP:
1
$variable = (isset($_POST['var'])) ? $_POST['var'] : NULL ;


Dit dan in het geval waarin je bijvoorbeeld een hidden veld in een formulier hebt, waarbij er alleen een value moet staan als $_POST['var'] geset is.

omniscale.nl


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

posttoast schreef op donderdag 11 mei 2006 @ 23:34:
Bedoel je hiermee dat het sowieso niet netjes is om in een geinclude bestand een variabele te gebruiken die gedeclareerd is in het "moederbestand"?
Op zich is daar niks mee, hoewel het geen kwaad kan om het goed te documenteren wat een include file verwacht en wat het doet :)
En nog een vraagje, wat is "beter":

dit:
PHP:
1
$variable = (isset($_POST['var'])) ? $_POST['var'] : "" ;

of dit:
PHP:
1
$variable = (isset($_POST['var'])) ? $_POST['var'] : NULL ;


Dit dan in het geval waarin je bijvoorbeeld een hidden veld in een formulier hebt, waarbij er alleen een value moet staan als $_POST['var'] geset is.
wat je als default value maar wilt gebruiken, en ook helemaal afhankelijk van de situatie. Jij moet verder op in je code namelijk weer verder met die value.

Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

posttoast schreef op donderdag 11 mei 2006 @ 23:34:
En nog een vraagje, wat is "beter":

dit:
PHP:
1
$variable = (isset($_POST['var'])) ? $_POST['var'] : "" ;

of dit:
PHP:
1
$variable = (isset($_POST['var'])) ? $_POST['var'] : NULL ;


Dit dan in het geval waarin je bijvoorbeeld een hidden veld in een formulier hebt, waarbij er alleen een value moet staan als $_POST['var'] geset is.
Dat hangt af van of je lege strings als user input accepteert :) wil je dat wel, dan zul je voor de laatste optie moeten gaan, want controleren of de string ongelijk is aan "" gaat dan niet meer werken.

ifconfig eth0 down

Pagina: 1