Aller au contenu

empty et le zéro, y'a t-il une alternative ?


Spark

Sujets conseillés

Bonjour tous le monde,

Avant d'exécuter un requête de vérifie que les champs du formulaire ne sont pas vide, et pour cela j'utilise

if (!empty($_POST['id']) AND etc)

Or un de mes champs peut contenir le zéro (0), le broblème est le suivant :

Depuis PHP 4, la chaîne de caractères "0" est considérée comme vide.

Que me proposez vous comme alternative ? Sachant que isset n'est pas bon non plus (édit : d'ailleurs je ne comprend pas pourquoi ! Il laisse passer tout passer).

Modifié par Spark
Lien vers le commentaire
Partager sur d’autres sites

Merci,

Mais, si ca ne passe pas avec la seul condition !empty ca ne va pas fonctionner mieux si on rajoute une condition ! Il faut supprimer !empty() et mettre autre chose à la place

"Si la variable n'est pas vide ca passe, mais il ne faut pas que le zéro soit considéré comme NULL", oh ba tien tu m'as donner une idée (qui fonctionne) :

if ($variable!= NULL AND etc ...)

Résolu :P

Merci.

Lien vers le commentaire
Partager sur d’autres sites

Mais, si ca ne passe pas avec la seul condition !empty ca ne va pas fonctionner mieux si on rajoute une condition ! Il faut supprimer !empty() et mettre autre chose à la place

Faux : Avec le AND, il faut que les deux conditions soient vérifiées. Donc ca marchera aussi.

Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)

Ca ne marchais pas donc j'ai cherché autre chose, j'ai pas du bien mettre le code.

EDIT : je viens de refaire un test et ça n'a pas marché, je vous mets le code original et complet :

if (isset($_POST['id']) AND !empty($addon) AND !empty($description) AND !empty($lien) AND is_numeric($taille) AND !empty($MD5) AND !empty($version) AND !empty($type) AND !empty($taillecd) && $taillecd !== '0')

La variable incriminé est la dernière ($taillecd).

Modifié par Spark
Lien vers le commentaire
Partager sur d’autres sites

Essaie ceci :

<?

$taillecd = 0;

if ($taillecd>=0 and is_numeric($taillecd)){
echo "ok";
}
else
{
echo "pas ok";
}
?>

Le is_numeric est nécessaire car si $taillecd = "", la condition $taillecd>=0 est considérée comme vraie.

Lien vers le commentaire
Partager sur d’autres sites

Il faut regrouper les deux conditions de $taillecd dans le même groupe de parenthèses pour que ça marche :

if (isset($_POST['id']) AND !empty($addon) AND !empty($description) AND !empty($lien) AND is_numeric($taille) AND !empty($MD5) AND !empty($version) AND !empty($type) AND (!empty($taillecd) && $taillecd !== '0'))

Lien vers le commentaire
Partager sur d’autres sites

1)

je ne suis pas bien sûr mais pourquoi utiliser l'opérateur AND et à la fin l'opérateur && ?

(!empty($taillecd) && $taillecd !== '0')

Normalement, ça ne change rien, mais sait-on jamais.

2)

je suppose que $taillecd provient aussi du formulaire ?

quand tu définis $taillecd, cela doit venir d'une ligne du type :

$taillecd = $_POST['taillecd'];

essaie une expression ternaire :

$taillecd = isset($_POST['taillecd'])?$_POST['taillecd']:0;

Traduction de l'expression :

si le formulaire envoie bien une valeur pour taillecd, alors $taillecd vaut $_POST['taillecd'], sinon elle vaut 0

de cette manière, $taillecd sera toujours une valeurs numérique.

Remarque : il faut aussi bien contrôler que la valeur est numérique.

Le test devient :

if (isset($_POST['id']) AND !empty($addon) AND !empty($description) AND !empty($lien) AND is_numeric($taille) AND !empty($MD5) AND !empty($version) AND !empty($type) AND $taillecd != 0)

Modifié par pluriels
Lien vers le commentaire
Partager sur d’autres sites

Tout simplement parce qu'il utilise l'opérateur AND, et que j'utilise l'opérateur &&, qui sont strictement équivalents.

Il y a eu amalgame lors des copier/coller, mais comme ils ont le même comportement, ça ne pose pas de préjudice.

Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)
Essaie ceci :

<?

$taillecd = 0;

if ($taillecd>=0 and is_numeric($taillecd)){
echo "ok";
}
else
{
echo "pas ok";
}
?>

Le is_numeric est nécessaire car si $taillecd = "", la condition $taillecd>=0 est considérée comme vraie.

Non le 0 doit être considéré comme vrai, c'est le but depuis le début. La solution is_numeric($taillecd) != NULL est mieux il me semble.

Il faut regrouper les deux conditions de $taillecd dans le même groupe de parenthèses pour que ça marche :

if (isset($_POST['id']) AND !empty($addon) AND !empty($description) AND !empty($lien) AND is_numeric($taille) AND !empty($MD5) AND !empty($version) AND !empty($type) AND (!empty($taillecd) && $taillecd !== '0'))

Ok, là je comprend, parce tu m'a vraiment fais douté sur la fonction de &&

En gros !== veut dire "peut être égal à" ?

1)

je ne suis pas bien sûr mais pourquoi utiliser l'opérateur AND et à la fin l'opérateur && ?

Normalement, ça ne change rien, mais sait-on jamais.

captain_torche à vu juste, une petite embrouille :)

2)

je suppose que $taillecd provient aussi du formulaire ?

quand tu définis $taillecd, cela doit venir d'une ligne du type :

$taillecd = $_POST['taillecd'];

Exacte

essaie une expression ternaire :

$taillecd = isset($_POST['taillecd'])?$_POST['taillecd']:0;

Traduction de l'expression :

si le formulaire envoie bien une valeur pour taillecd, alors $taillecd vaut $_POST['taillecd'], sinon elle vaut 0

de cette manière, $taillecd sera toujours une valeurs numérique.

Remarque : il faut aussi bien contrôler que la valeur est numérique.

Le test devient :

if (isset($_POST['id']) AND !empty($addon) AND !empty($description) AND !empty($lien) AND is_numeric($taille) AND !empty($MD5) AND !empty($version) AND !empty($type) AND $taillecd != 0)

Alors là non, parce le but est de vérifier que l'utilisateur à bien rempli le champs, pas de combler un oubli !

Merci à tous pour vos interventions.

Maintenant pourquoi est ce que je n'est pas vérifié que c'est un numérique ? Et bien tous simplement parce je ne sais pas si un nombre pointé "." est considéré comme un nombre, ou s'il faut utiliser la virgule. Et si le tiret "-" est considéré comme le signe moins (-12.1). D'ailleurs je ne sais même pas s'il s'agit de tirets ou de moins (et oui je n'ai pas (encore) essayé) car j'ai rempli la table à partir d'un fichier xml pour justement le rendre administrable facilement.

Voilà tous ;-)

Modifié par Spark
Lien vers le commentaire
Partager sur d’autres sites

Non le 0 doit être considéré comme vrai, c'est le but depuis le début. La solution is_numeric($taillecd) != NULL est mieux il me semble.

Euh prend au moins de le temps de tester les codes que l'on te donne!

>=0 signifie que la valeur doit être supérieur ou égale à 0.

Donc la condition est bien validée avec un '0'. Et concernant le is_numeric($taillecd) != NULL, cela ne veut pas dire grand chose car la fonction renvoi True ou False donc, dans les deux cas, différente de Null!

Si la personne saisie 'AAAAAAA', cela sera valide.

Lien vers le commentaire
Partager sur d’autres sites

Juste un précision sur les comparaisons :

== sera toujours vrai que la valeur comparée soit false ou 0

=== fait la "différence", a fortiori !==

Lien vers le commentaire
Partager sur d’autres sites

Le is_numeric me parait être une bonne solution, mais pas utilisé comme ça.

Il ne renverra JAMAIS la valeur NULL (c'est forcément un booléen), donc ta condition ne fonctionnera pas.

A priori, un is_numeric($taillecd) doit suffire, à moins que tu ne veuilles vérifier également les virgules, auquel cas tu dois les transformer en points (une virgule dans ta variable, et is_numeric retourne false).

Ton code ressemblerait donc à ça :

is_numeric(str_replace(',', '.', $taillecd));

Pour ta seconde question, une triple égalité ===, signifie que les deux valeurs sont équivalentes, et de même type.

Pour simplifier :

Avec une égalité double ==, les valeurs 0, '0', '' (vide), NULL et false sont équivalentes. une comparaison entre elles renverrait true.

Avec une égalité triple ===, toutes ces valeurs sont différentes car de types différents (quoique je ne suis pas sûr pour la valeur vide).

Une inégalité triple !==, est juste l'équivalent de l'inégalité double !=, la comparaison de type en plus.

Lien vers le commentaire
Partager sur d’autres sites

Euh prend au moins de le temps de tester les codes que l'on te donne!

>=0 signifie que la valeur doit être supérieur ou égale à 0.

Donc la condition est bien validée avec un '0'. Et concernant le is_numeric($taillecd) != NULL, cela ne veut pas dire grand chose car la fonction renvoi True ou False donc, dans les deux cas, différente de Null!

Si la personne saisie 'AAAAAAA', cela sera valide.

Pardon j'avais fais l'amalgame avec != (pas que je ne fasse pas la différence (jeu de mot ?) mais juste lu trop vite, désolé.

Et le is_numeric($taillecd) != NULL, c'est encore une erreur :/ Je n'aurais même pas essayé un tel code ! J'ai répondu vite fais par respect et un minimum de suivit ... car je suis tellement crevé depuis 2 jours que je passe un minimum de temps devant PC. Ton code répond donc bien au besoin que j'ai présenté :blush: . A un détaille prêt que je n'avais pas signalé, les nombres sont négatif ou positif. J'en ai profité pour aussi tester les tiret et les moins, cela ne fais aucune différence, tout comme le point "1.1" qui est considéré comme un nombre (ce que j'ai dans ma BDD). Ce qu'y veut, is_numeric suffit à lui tout seul.

Merci ;-)

Le is_numeric me parait être une bonne solution, mais pas utilisé comme ça.

Il ne renverra JAMAIS la valeur NULL (c'est forcément un booléen), donc ta condition ne fonctionnera pas.

A priori, un is_numeric($taillecd) doit suffire, à moins que tu ne veuilles vérifier également les virgules, auquel cas tu dois les transformer en points (une virgule dans ta variable, et is_numeric retourne false).

Ton code ressemblerait donc à ça :

is_numeric(str_replace(',', '.', $taillecd));

Pour ta seconde question, une triple égalité ===, signifie que les deux valeurs sont équivalentes, et de même type.

Pour simplifier :

Avec une égalité double ==, les valeurs 0, '0', '' (vide), NULL et false sont équivalentes. une comparaison entre elles renverrait true.

Avec une égalité triple ===, toutes ces valeurs sont différentes car de types différents (quoique je ne suis pas sûr pour la valeur vide).

Une inégalité triple !==, est juste l'équivalent de l'inégalité double !=, la comparaison de type en plus.

Après avoir lu 3 fois j'ai compris :P

Merci pour vaut réponse, is_numeric(str_replace(',', '.', $taillecd)) semble être la meilleur solution, cela permettra de corriger d'éventuelle fautes de frappes, je testerais ce week-end (là dodo :P).

Merci à tous.

Lien vers le commentaire
Partager sur d’autres sites

Suite et fin,

J'ai mis :

$taillecd=str_replace(',', '.', $_POST['taillecd']);

Puis dans la vérification avant la requête :

is_numeric($taillecd)

Encore merci :-)

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...