par
Ryle » 26 avr. 2007, 09:55
C'est pas tant le problème de la fonction empty, c'est php pour qui : zéro (0), faux (FALSE), chaine vide ('') sont trois valeurs strictement identiques.
if (0 == FALSE) // vrai
if (0 == '') // vrai
if (FALSE == '') // vrai
La seule façon de différencier ces valeurs, c'est de considérer leurs types. Le premier est un nombre (int), le deuxième un booléen (boolean) et le dernier une chaine (String). Tu peux pour cela soit utiliser getType() pour connaitre le type d'une variable, soit utiliser les opérateurs "===" ou "!==" pour comparer valeur et type.
if (0 === FALSE) // faux, la valeur est la même, mais le type est différent (int / boolean)
if (0 === '') // faux
if (FALSE === '') // faux
Normalement, même si php n'est pas intransigeant sur la question, il ne faudrait comparer que des varibles de même type (ce qu'impose la plupart des autres langages). Ainsi pour comparer un nombre et une chaine, il faudrait convertir (cast) l'un des deux avant de pouvoir faire la comparaison
Pour en revenir à ton cas, pourquoi mettre une valeur par défaut à 0 et rendre le champ obligatoire ? pourquoi ne pas simplement le laissé vide et facultatif ? au pire si tu as besoin du 0, il te suffit de l'affécter si jamais tu constates que le champ est resté vide

C'est pas tant le problème de la fonction empty, c'est php pour qui : zéro (0), faux (FALSE), chaine vide ('') sont trois valeurs strictement identiques.
[php]if (0 == FALSE) // vrai
if (0 == '') // vrai
if (FALSE == '') // vrai[/php]
La seule façon de différencier ces valeurs, c'est de considérer leurs types. Le premier est un nombre (int), le deuxième un booléen (boolean) et le dernier une chaine (String). Tu peux pour cela soit utiliser getType() pour connaitre le type d'une variable, soit utiliser les opérateurs "===" ou "!==" pour comparer valeur et type.
[php]if (0 === FALSE) // faux, la valeur est la même, mais le type est différent (int / boolean)
if (0 === '') // faux
if (FALSE === '') // faux[/php]
Normalement, même si php n'est pas intransigeant sur la question, il ne faudrait comparer que des varibles de même type (ce qu'impose la plupart des autres langages). Ainsi pour comparer un nombre et une chaine, il faudrait convertir (cast) l'un des deux avant de pouvoir faire la comparaison :)
Pour en revenir à ton cas, pourquoi mettre une valeur par défaut à 0 et rendre le champ obligatoire ? pourquoi ne pas simplement le laissé vide et facultatif ? au pire si tu as besoin du 0, il te suffit de l'affécter si jamais tu constates que le champ est resté vide :)