Spark Posté 26 Juin 2007 Posté 26 Juin 2007 (modifié) 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é 26 Juin 2007 par Spark
captain_torche Posté 26 Juin 2007 Posté 26 Juin 2007 Essaye éventuellement avec if (!empty($_POST['id']) && $_POST['id'] !== '0') L'opérateur triple !== permet une comparaison de type et de valeur, et donc ne sera ici valide que pour un 0, pas pour une chaîne vide.
Spark Posté 26 Juin 2007 Auteur Posté 26 Juin 2007 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 Merci.
Portekoi Posté 26 Juin 2007 Posté 26 Juin 2007 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.
Spark Posté 26 Juin 2007 Auteur Posté 26 Juin 2007 (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é 26 Juin 2007 par Spark
Portekoi Posté 26 Juin 2007 Posté 26 Juin 2007 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.
captain_torche Posté 26 Juin 2007 Posté 26 Juin 2007 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'))
pluriels Posté 27 Juin 2007 Posté 27 Juin 2007 (modifié) 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é 27 Juin 2007 par pluriels
captain_torche Posté 27 Juin 2007 Posté 27 Juin 2007 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.
Spark Posté 28 Juin 2007 Auteur Posté 28 Juin 2007 (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é 28 Juin 2007 par Spark
Portekoi Posté 28 Juin 2007 Posté 28 Juin 2007 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.
NorSeb Posté 28 Juin 2007 Posté 28 Juin 2007 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 !==
captain_torche Posté 28 Juin 2007 Posté 28 Juin 2007 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.
Spark Posté 28 Juin 2007 Auteur Posté 28 Juin 2007 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é . 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 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 ). Merci à tous.
Spark Posté 30 Juin 2007 Auteur Posté 30 Juin 2007 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 :-)
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant