


Validation numérique robuste: `is_numeric ()` vs `filter_var ()`
is_numeric () vérifie si une valeur peut être interprétée comme un nombre, en acceptant des formats comme Hex, Notation Scientific et Whitespace, mais ne renvoie qu'un booléen sans casting de type. 2. Filter_var () avec filter_validate_int ou filter_validate_float valide et désinfecte en renvoyant le nombre réel ou faux, gère les vérifications de la plage et rejette l'espace blanc. 3. Utiliser is_numeric () pour les vérifications de type interne sur les données de confiance où les performances sont importantes. 4. Utilisez filter_var () pour la validation d'entrée de l'utilisateur pour assurer la sécurité, la mise en forme stricte et la conversion de type approprié. Pour une validation numérique robuste et sécurisée des données externes, filter_var () est le choix clair.
Lors de la validation de l'entrée numérique dans PHP, le choix de la bonne fonction est importante, en particulier lorsque la sécurité, la manipulation de types et les cas de bord sont sur la ligne. Deux outils couramment utilisés sont is_numeric()
et filter_var()
avec les filtres FILTER_VALIDATE_FLOAT
ou FILTER_VALIDATE_INT
. Mais lequel devriez-vous réellement utiliser et quand?

Décomposons-le.
1. Qu'est is_numeric()
ce que fait réellement
is_numeric()
vérifie si une variable peut être interprétée comme un nombre dans le système de type lâche de PHP.

is_numeric ("42"); // vrai is_numeric ("3.14"); // vrai is_numeric ("0xff"); // vrai (hexadécimal) is_numeric ("1e4"); // vrai (notation scientifique) is_numeric ("123"); // vrai (signe de tête) is_numeric ("- 5.6"); // vrai is_numeric ("42"); // vrai (espace blanc autorisé!) is_numeric (""); // FAUX is_numeric ("42abc"); // FAUX
✅ PROS:
- Très permissive - accepte de nombreux formats numériques valides.
- Rapide et intégré.
❌ contre:

- Renvoie
true
pour les chaînes avec des espaces blancs / traînants. - Accepte Hex (
0xFF
) et la notation scientifique (1e4
), qui peut ne pas être souhaitée. - Ne fait pas la distinction entre les entiers et les flotteurs.
- Aucun casting de type - il ne valide que, ne désinfectue pas.
⚠️ Zone de danger :
is_numeric(" 42 ")
Renvoietrue
, mais si vous attendez une entrée stricte, ces espaces peuvent provoquer des problèmes en aval.
2. Comment fonctionne filter_var()
pour les nombres
filter_var()
vous donne plus de contrôle en offrant des filtres dédiés:
Pour les entiers:
filter_var ("42", filter_validate_int); // 42 filter_var ("42", filter_validate_int); // FAUX filter_var ("42.0", filter_validate_int); // FAUX filter_var ("0xff", filter_validate_int); // 255 (Hex valide)
Pour les flotteurs:
filter_var ("3.14", filter_validate_float); // 3.14 filter_var ("1e4", filter_validate_float); // 10000 filter_var ("3.14", filter_validate_float); // FAUX
✅ PROS:
- Peut valider et désinfecter (renvoie le nombre réel ou
false
). - Comportement plus prévisible.
- Prend en charge des options comme
min_range
,max_range
.
// s'assurer que la valeur est un entier entre 1 et 100 filter_var ($ input, filter_validate_int, [ 'Options' => ['min_range' => 1, 'max_range' => 100] ]));
❌ contre:
- Un peu plus verbeux.
- Par défaut, accepte toujours les notations hexadécimales et scientifiques à moins que vous ne les désinfectez.
3. Différences clés en un coup d'œil
Fonctionnalité | is_numeric() | filter_var(..., FILTER_VALIDATE_INT/FLOAT) |
---|---|---|
Renvoie le numéro réel | ❌ (retourne bool) | ✅ (lance et renvoie le numéro ou false ) |
Gire Whitespace | ✅ (le permet) | ❌ (échoue sur les espaces environnants) |
Notation scientifique ( 1e4 ) | ✅ | ✅ (pour le flotteur), ❌ (int) |
Hexadécimal ( 0xFF ) | ✅ | ✅ (si autorisé) peut être filtré |
Validation de plage | ❌ | ✅ (via les options) |
Localisation (par exemple "3,14") | ❌ ( is_numeric("3,14") = false) | ❌ Idem |
4. Quand utiliser lequel?
✅ Utiliser is_numeric()
quand:
- Vous effectuez des contrôles de type rapide pendant la logique interne.
- La contribution a déjà été désinfectée.
- Vous souhaitez accepter un large éventail de valeurs nombres (y compris Hex, Notation SCI).
- Les performances sont essentielles et la contribution est fiable.
✅ Utilisez filter_var()
quand:
- Valider l'entrée de l'utilisateur (formulaires, API, paramètres de requête).
- Vous devez à la fois valider et convertir en un numéro approprié.
- Vous souhaitez appliquer un formatage strict (pas d'espace blanc).
- Vous avez besoin de contraintes de plage.
? Conseil de sécurité : préfère toujours
filter_var()
pour la saisie de l'utilisateur - il est conçu pour filtrer les données non fiables.
Bonus: désinfection avant de valider
Parfois, vous voulez autoriser Whitespace mais utilisez toujours filter_var()
:
$ input = trim ("42"); filter_var ($ input, filter_validate_int); // fonctionne maintenant → 42
Ou interdire Hex:
filter_var ($ input, filter_validate_int, [ 'flags' => filter_flag_allow_hex ])); // omettez ce drapeau pour rejeter hex
Verdict final
-
is_numeric()
est un assistant de vérification de type , pas un outil de validation pour l'entrée externe. -
filter_var()
est le bon choix pour une validation numérique robuste et sécurisée des utilisateurs.
? Règle de base : si les données proviennent de l'extérieur de votre script (formulaire, API, URL), utilisez
filter_var()
. S'il est interne et que vous avez juste besoin de vérifier la flexibilité de type,is_numeric()
c'est bien.
Fondamentalement, ce n'est pas vraiment une épreuve de force - chaque place a sa place, mais pour une validation robuste , filter_var()
gagne d'un mile.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Useintl.numberformatwithUser-specificLocalesforcorrectDigitgroupingandDecimalseparators.2.FormatCurrencyusingstyle: 'Currency'withiso4217codesandLocale-SpecificSymbolplacement.3.ApplyCompactNotationForLaRemberstoEnHanCeReadabilityWithunitsLikeMor लल

L'utilisation de l'extension BCMATH est la clé pour résoudre la précision des calculs financiers PHP, car il effectue des opérations décimales avec une précision arbitraire par des chaînes, en évitant les erreurs d'arrondi des nombres à virgule flottante; 2. Vous devez toujours passer sous la forme d'une chaîne et définir les paramètres d'échelle (tels que BCADD ('0,1', '0,2', 2)) pour vous assurer que le résultat est précis aux décimales requises; 3. Évitez de passer directement les nombres à virgule flottante à la fonction BCMATH, car la précision a été perdue avant de passer les paramètres; 4. Vous pouvez définir les décimales mondiales par le biais de BCCALE (2) pour vous assurer que le calcul financier conserve deux décimales uniformément; 5. BCMATH par défaut troncature plutôt que d'arrondissement, et vous devez implémenter vous-même la logique d'arrondi (par exemple par le biais de la fonction BCROUND); 6. La valeur d'entrée doit être vérifiée.

Lorsqu'il est nécessaire de traiter les entiers dépassant PHP_INT_MAX (comme 9223372036854775807), 1. Toute bibliothèque mathématique de précision telle que l'extension GMP ou la brique / mathématiques doit être utilisée; 2. GMP est basé sur la bibliothèque C, avec des performances élevées mais nécessite une prise en charge du serveur; 3. Brick / Math est une implémentation PHP pure, qui est facile à porter mais plus lent; 4. Lors de l'initialisation de grands nombres, les chaînes doivent être utilisées pour éviter la perte de précision; 5. Toutes les opérations doivent éviter les nombres à virgule flottante pour garantir la précision. Le choix final dépend du degré de contrôle environnemental, des exigences de performance et des préférences de style de code, mais les grands entiers doivent être initialisés en toute sécurité dans les chaînes.

MT_RAND () ISNOTSECURYFORCRYPROGRAMMENTSPURESSBAUSEITUSELESHEMERSENNETWISTERALGORITHM, qui produira unpréactable

intdiv () performStrueIntegerDivisionAndissaferforwHolenumbers, tout en (int) AfterdivisionRisksfloating-pointprecisionErrors.2

IS_NUMERIC () CheckSifavAluecanBeterpretedasanumber, acceptant les formalités liées à la science, la science et le blanc, ButonlyreturnsaboolidatedWithoutTypecast.2.filter_var ()

Les opérations bit

Le problème des nombres de points flottants inexacts est courant en PHP, en particulier dans les calculs financiers ou les comparaisons précises. La cause profonde est que les décimales ne peuvent pas être stockées avec précision dans la représentation des points flottants binaires (standard IEEE754), entraînant des résultats tels que 0,1 0,2 ≠ 0,3; 1. Lorsque vous comparez l'égalité des nombres de points flottants, vous devez utiliser les valeurs de tolérance (epsilon) au lieu d'utiliser directement ==; 2. Les calculs financiers devraient éviter d'utiliser des nombres de points flottants et utiliser plutôt des entiers (comme dans les unités de division) ou une extension BCMATH; 3. BCMATH effectue des calculs de précision arbitraires à travers des chaînes, qui conviennent aux scénarios de haute précision, mais ont de faibles performances; 4. Il convient de noter que la conversion de type PHP peut implicitement convertir des chaînes ou des entiers en nombres de points flottants pour introduire des erreurs; En bref, les nombres de points flottants inexacts sont un problème de calcul général, mais en
