[PHP] Controleren op 0 en isset conflict

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 18-08 18:12
Ik zat net enorm te klote met een variabele die een getal kan zijn (van 0 tot oneindig) of ook geen waarde kan bevatten.

Ik wou controleren of de variabele een waarde bevat, maar dat gaat fout want php ziet 0 als geen waarde. Om uiteindelijk de waarde te weten te komen heb ik 3 if statements nodig....:
PHP:
1
2
3
4
5
6
7
8
9
10
11
if ($id == 0 && is_numeric($id)) {
   // waarde is 0
}

if (!isset($id)) {
   // geen waarde
}

if (!empty($id) && is_numeric($id)) {
   // andere waarde
}

Als je hiernaar kijkt klopt php ook niet, want: bij die eerste if doe ik een check is_numeric(), maar waarom geeft php daarop wel true als hij eigenlijk vind dat $id geen waarde is? (Daarmee bedoel ik, hij zegt bij isset($id) => false).
Php vind dus wel dat $id = 0 een waarde is want is_numeric($id) geeft true, maar ook weer niet want isset($id) geeft false.

Doe ik nu erg moeilijk of is dit de enigste manier met php ?

Acties:
  • 0 Henk 'm!

  • x-force
  • Registratie: Maart 2001
  • Laatst online: 05-01-2024
Moet je dan niet met === gaan werken?
http://nl3.php.net/manual....operators.comparison.php

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!

Verwijderd

Wat wil je nu precies weten?
Wat is het doel van je script?

Acties:
  • 0 Henk 'm!

  • 4Real
  • Registratie: Juni 2001
  • Laatst online: 14-09-2024
PHP:
1
2
3
4
if ( isset($id) && int_val($id) )
{
     // goed (Y)
}


Als die niet geset is stopt die er al mee en als die wel gezet is maar geen int is doet hij ook niks

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Klopt niet, 4Real. int_val() maakt er een integer van. Deze lijkt me wel voldoende?
PHP:
1
2
3
4
5
if (!isset($id) || !is_int($id) || $id == '') {
  //ongeldig
} else {
  //geldig
}

Empty kun je niet gebruiken omdat die bij 0 true returnt. Waarom PHP bij is_numeric en is_int true geeft als je er een lege string in stopt is me niet duidelijk.

[ Voor 54% gewijzigd door NMe op 12-03-2006 18:36 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

-NMe- schreef op zondag 12 maart 2006 @ 18:34:
Waarom PHP bij is_numeric en is_int true geeft als je er een lege string in stopt is me niet duidelijk.
Is volgens mij ook niet waar?

PHP:
1
2
$test = (string) "";
echo is_numeric($test); // false

[ Voor 17% gewijzigd door Verwijderd op 12-03-2006 18:53 ]


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Waarom PHP bij is_numeric en is_int true geeft als je er een lege string in stopt is me niet duidelijk.
Ik krijg gewoon een false terug :?

March of the Eagles


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wat hij bij mij zegt weet ik niet, want ik heb het niet geprobeerd. Ik lees wel het volgende in de topicstart:
verytallman schreef op zondag 12 maart 2006 @ 17:30:
Als je hiernaar kijkt klopt php ook niet, want: bij die eerste if doe ik een check is_numeric(), maar waarom geeft php daarop wel true als hij eigenlijk vind dat $id geen waarde is?
Maar als het waar is wat jullie zeggen, dan heeft TS ergens iets fout gedaan. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Ik denk dat TS bedoelt dat $id = 0 true geeft, en dat niet kan omdat 0 geen waarde is (volgens mij gaat TS er dus vanuit dat met $id = 0, $id leeg is). Maar 0 is niet hetzelfde als NULL :)

[ Voor 32% gewijzigd door XWB op 12-03-2006 19:30 ]

March of the Eagles


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 18-08 18:12
Die eerdere redenering van mij klopt idd niet...heb me vergist.

Maar ik weet wel dat checken op niet niet feilloos gaat, vooral die === laat het afweten.

Ik heb er nu maar iets anders van gemaakt.

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Maar ik weet wel dat checken op niet niet feilloos gaat, vooral die === laat het afweten.
Hoezo? Wat lukt je niet dan? Met === vergelijk je types.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$int = 1;
$string = 1; 
if ($int === $string)
{
    echo 'waar';
}
else
{
    echo 'onwaar';
}
?>


Bovenstaande krijg je true terug, want beide zijn integers.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$int = 1;
$string = '1';
if ($int === $string)
{
    echo 'waar';
}
else
{
    echo 'onwaar';
}
?>


En bij deze krijg je false terug, want je hebt een integer en een string.

[ Voor 42% gewijzigd door XWB op 12-03-2006 20:01 ]

March of the Eagles


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Weet je wel wat === (de identity operator) doet dan? Die heeft het bij mij namelijk nog nooit laten afweten bij goed gebruik. :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 18-08 18:12
De === werkte bij mij toch echt niet. Ik heb daar mogelijk wel een verklaring voor.
De $id verkrijg is door:
$id = $_GET['id'];

Dit is geen int maar een string , daarom werkt de === niet. Dat is mijn enige verklaring.

Met intval() kan je dan wel van die $_GET['id'] een int maken, maar intval geeft een 0 terug bij een lege variabele. En dat wou ik niet want dan kan ik niet meer die gevallen eruit halen waarbij $id geen waarde had.

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
De === werkte bij mij toch echt niet. Ik heb daar mogelijk wel een verklaring voor.
De $id verkrijg is door:
$id = $_GET['id'];

Dit is geen int maar een string , daarom werkt de === niet. Dat is mijn enige verklaring.
Klopt, maar dan maak je er toch een integer van? $id = (int)$_GET['id'];

March of the Eagles


Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
hier krijg ik waarde terug, dus dit werkt prima:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

$id = '0';

if( (ctype_digit($id)) AND (is_numeric($id)) AND (isset($id)) ) {

    echo 'waarde';

}


else {

    echo 'geen waarde';

}

?>

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Hacku schreef op zondag 12 maart 2006 @ 20:00:
Klopt, maar dan maak je er toch een integer van? $id = (int)$_GET['id'];
Mjah, maar daarna heeft een check om te kijken òf het een integer was ook geen zin meer natuurlijk. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Als $id uit $_GET komt, kan je zoiets doen:

PHP:
1
2
3
4
5
if(array_key_exists('id', $_GET)) {
    $id = int_val($_GET['id']);
} else {
    $id = null;
}


Dan kan je kijken of $id === 0 (is 0) of $id === null (bestaat niet).

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Of je maakt een eigen variant op empty() die 0 niet als leeg beschouwd :)
PHP:
1
2
3
function strEmpty(&$in) {
    return (empty($in) && $in != '0');
}

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Verwijderd

Weet niet of het met deze kwestie te maken heeft, maar ter informatie: een variabele verkregen via GET of POST is nooit en te nimmer een integer en wordt altijd als een string behandeld, volgens mij.

Een klein testje bevestigde dit zojuist.

[ Voor 14% gewijzigd door Verwijderd op 13-03-2006 08:50 ]


Acties:
  • 0 Henk 'm!

  • JayVee
  • Registratie: Mei 2002
  • Laatst online: 31-08 10:22

JayVee

shibby++!

Hacku schreef op zondag 12 maart 2006 @ 20:00:
[...]
Klopt, maar dan maak je er toch een integer van? $id = (int)$_GET['id'];
Is nog hartstikke veilig ook als je $id wilt gebruiken in queries etc! :)

ASCII stupid question, get a stupid ANSI!


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
stef-o.nl schreef op zondag 12 maart 2006 @ 20:01:
hier krijg ik waarde terug, dus dit werkt prima:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

$id = '0';

if( (ctype_digit($id)) AND (is_numeric($id)) AND (isset($id)) ) {

    echo 'waarde';

}


else {

    echo 'geen waarde';

}

?>
Het lijkt me beter om als eerst te controleren of hij wel bestaat, met isset, ipv. op het laatst. Dat ivm. short circuit evaluation. In dit geval krijg je een error (of notice) als hij niet bestaat. Bovendien is zo veel wit ruimte en al die haakjes ook niet echt duidelijk:
PHP:
1
2
3
4
5
6
if ( isset($id) && ctype_digit($id) && is_numeric($id) ) {
    echo 'waarde';
}
else {
    echo 'geen waarde';
}

Noushka's Magnificent Dream | Unity

Pagina: 1