Inscrit depuis le 15/08/2014
Personne de confiance
|
02h06 - 27/04/17
Modéré FR
Bonjour,
Comme tu l'as sûrement remarqué -ou pas-, selon l'utilisation que tu as des inputs type texte en HTML, tu as peut-être été confonté au problème suivant :
Si, dans un input de type texte, tu entres un nombre entier -ou décimal-, la valeur récupérée via un formulaire ou via Ajax sera une chaine de caractères... Logique (parce que c'est un input texte) ! Mais comment faire si, en utilisant un seul input de type texte, tu veux, en fonction de la forme de la valeur : si la valeur est du texte ou un nombre, faire agir ton script différement ?
Tout d'abord, il faut noter que la fonction PHP is_int() (ou is_float()) ne fonctionne pas, car la valeur retournée est forcément du texte... De plus, PHP étant un language très tolérant au niveau des types de données, un is_int("10") ne "passe pas" et est considéré comme une chaîne de caractères, logique...
Donc, comment faire ?
C'est simple, on va utiliser la fonction intval() ou floatval() qui prend en paramètre une chaîne de caractères et qui va retourner -si il peut- la valeur numérique de la chaine.
Voici différents cas d'applications de intval() : intval(10) => 10 intval("10") => 10 intval("Texte") => 0 intval("1un") => 1 intval("un1") => 0
En voyant ces exemples, on déduis donc que dans le cas d'une chaîne, un 0 est retourné, dans le cas d'une chaine commençant par un nombre mais contenant ensuite du texte, le nombre du début est retourné, dans le cas d'une chaine commençant par du texte et finissant par un nombre, un 0 est retourné.
C'est bien, mais du coup, c'est toujours un nombre entier qui est retourné, même si c'est du texte, donc c'est innexploitable...
Si ! Car (dans le cas général), une chaine de caractères "retourne" 0 et un nombre "retourne" lui-même, alors on a juste à tester la valeur retournée, si elle est égale à 0, c'est qu'on a du texte sinon, c'est un nombre !
Si tu as un esprit logique, tu as tout de suite compris que cette méthode est faillible car si on entre le nombre 0, il est interprété comme du texte !
Alors... Comment faire ?
C'est simple ! En regardant les exemples si dessus, on peux trouver LA technique !
Pour se faire, on a juste à ajouter un nombre APRES notre chaîne de caractères renvoyée par l'input ! Je demande pas de faire ça directement dans l'input, mais on concatène le retour directement dans notre script.
Tu la vois venir la soluce là ?
Sauf que PHP, c'est cool, c'est pas indulgent niveau type de données, mais vas-y pour concaténer une chaîne avec un nombre... Je plaisante, c'est facile et logique, pour concaténer 2 chaînes, on fais un "chaine1"."chaine2" alors avec une chaîne et un nombre, on fais quoi ? "chaine".str(5) biensûr...! Attends, on me dis dans l'oreillette que je m'embête pour rien... Et oui, on s'en fiche de passer notre 5 en type nombre... C'est pourquoi, un simple "chaine"."5" fonctionne aussi car c'est notre fonction intval() qui fais le taf après.
Bref, comme je suis gentil, je te donne des exemples (dans le cas d'un formulaire envoyé en POST) : Quand "chaine" est passé dans l'input : intval($_POST['input'].str(4)) => 0 Quand 4 est passé dans l'input : intval($_POST['input'].str(4)) => 44
Pas très très explicite comme exemple -on est d'accord-, c'est pour ça que je vais traduire les variables des deux exemples maintenant : intval("chaine".str(4)) => 0 intval("4".str(4)) => 44 (Note : le 4 passé dans l'input est toujours sous forme de chaîne, il n'y a pas de raisons qu'il soit sous forme de nombre, si t'attendais à un nombre, recommence dès le début...)
Voilà, on a donc enfin notre solution ! Voilà un exemple complet :
if(intval($_POST['input']."7") == 0){ echo "On a du texte !"; //Et tu fais ce que tu veux avec } else { echo "On a un nombre"; /Et tu fais ce que tu veux avec } ?>
C'est bon, on a fini... Et là, tu te dis peut-être : Rolala ! C'est vraiment compliqué de faire ça !
Oui, c'est sûr, maintenant que tu est arrivé au bout, que je t'ai donné une solution propre et à peu près logique, je t'en donne une autre, qui fonctionne (peut être même pas) mais (et) qui n'est pas du tout logique (enfin, si, elle est logique pour PHP) :
Comme PHP n'est pas difficile avec les types de variables (je l'ai dis plus haut), on peux "additionner" une chaîne avec un nombre ! Et en plus, si la chaîne contient en réalité un nombre, il fais l'opération sans problèmes -le malin-... Mais on a quand même un minimum de logique de sa part, si il ne peux pas faire l'opération (si on a du texte quoi), il ne la fait pas MAIS il garde seulement le nombre ! (j'ai dis "logique" ? Désolé...)
Exemples : "3" + 3 = 6 "3" + "3" = 6 "trois" + 3 = 3 "trois" + "trois" = 0
Alors, tu me connais maintenant, avec l'exemple, tu la vois venir la deuxième soluce hein ?
Récapitulons. On peux additionner une chaîne avec un nombre, si la chaîne contient un nombre, il fait l'addition mais si la chaîne contient du texte, il garde seulement le nombre...
Voilà la deuxième solution :
if($_POST['input'] + 1 == 1){ echo "On a du texte !"; //Et tu fais ce que tu veux avec } else { echo "On a un nombre"; /Et tu fais ce que tu veux avec } ?>
Et là, tu te dis sûrement que, celle-ci n'est pas infaillible... Car, si un "0" est entré dans l'input, on obtient 1 donc la condition est vraie, donc il dit que c'est du texte... Maintenant, trouve une solution pour que le 0 mis dans l'input ne pose pas problème... Addition, soustration, multiplication déjà tu peux oublier... Il reste quoi ? La division... Oui mais pas trop, je m'explique : 0/1 = 0, 0/x = 0, voilà c'est tout...
On fait comment du coup ? Simplement, on prend l'inverse du nombre (et pas son opposé), appelons maintenant la logique de PHP : Si on calcule l'opposé d'un nombre, on obtient bien son opposé (merci PHP), si on calcule l'opposé d'une chaîne, on obtient "false" ! Là tu me diras : Parfait, à partir de là, si j'ai "false", la condition ne passe pas, donc ce n'est pas un nombre...
Mais, attends, comment on l'a vu en dessus, PHP se comporte bizarrement si on a un nombre en début ou en fin de chaîne avec du texte... On a donc : 1/"4" = 0.25 1/4 = 0.25 1/"quatre" = false 1/"4quatre" = 0.25 ! Merci PHP 1/"quatre4" = false
Donc voilà, déjà que cette deuxième soluce n'est pas très propre et logique, il faut bricoler parce que Monsieur PHP fais des choses bizarres avec les chaînes, tu peux l'oublier et utiliser la première... T'es quand même courageux d'avoir lu jusqu'à la fin pour une deuxième soluce qui ne marche pas.
Tu peux me répondre et partager ta propre solution à ce problème !
Maintenant que j'ai fini, je l'avoue, il faut vraiment avoir l'utilité d'utiliser un input texte pour avoir un script qui doit agit différement si on a mis du texte ou un nombre dedans...
Bonne continuation dans vos périples de programmation en PHP !
#C_Vincent
|