Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/04/2011, 04h11   #1
Invité de passage
 
Homme Victor
Inscription : avril 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Victor
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : avril 2011
Messages : 3
Points : 2
Points : 2
Par défaut Fonction de Gestion des variables : is_int()

Bonjour à tous.

Je poste pour la première fois sur un forum ayant sujet au php.
J'ai jusqu'ici réussis à trouver avec google et autre les solutions à mes problèmes, sachant que pour la plus part des cas, quelqu'un a déjà rencontrer un problème similaire.

Je viens vers vous cette fois car malgré les tests différents et les recherches sur de nombreux forum, je ne trouve pas la solution.

Tout betement, je veux vérifier :
  • si une variable existe,
  • si c'est un numérique, (inutile quand j'utilise la vérification suivante je pense)
  • si c'est un entier.

Ayant tester dans plusieurs sens, je ne comprend pas pourquoi pour le nombre entier quelquonque, la vérification de l'entier me renvois false et m'affiche donc le message d'erreur contenue dans l'else.
Je récupère la variable avec extract ($_POST);
Et le fais que le message d'erreur s'affiche prouve que la variable existe. sinon il ne ferait même pas le test.

Je débute en php et il se peut que je ne code pas dans les règles ou que j'utilise des vérifications inutiles, mais Merci du coup de main.
Voici mon code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
if (!empty ($time_heure))
{
	if (is_numeric($time_heure))
	{
		if (is_int($time_heure))
		{
			echo $valid_time;	
		}
		else
		{
		 	echo "Ce n'est pas un entier.";
		 	$erreur++;
		}
	}
	else
	{
		echo "Ce n'est pas un nombre";
	}
}
else
{
$control_time = 1;		
}
Merci à tous d'avance.
Ykouko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 08h22   #2
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
$_POST comme toutes les autres variables superglobales considèrent que les variables sont de type String.
Chose que tu pourrais constater avec var_dump() de ta variable.

Je te conseille donc de passer par intval() et vérifier que le retour de intval() est égal à la chaîne de caractères (en raison de la flexibilité de PHP à convertir des nombres d'une chaîne de caractères en nombre.)

Dans le cas d'une chaîne de caractère qui n'est pas un entier le retour de intval() sera 0 ce qui sera forcement différent de ta chaîne.

Code :
1
2
3
4
 
intval("10.1") == "10.1" => false
intval("10") == "10" => false
intval("test") == "test" => false
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/04/2011, 12h33   #3
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 709
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 709
Points : 3 279
Points : 3 279
Salut

Le principe général me semble correcte, sauf peut être un qui demande précision.

Code :
1
2
3
4
if (!empty ($time_heure))
{
 
}
empty() inclus la valeur 0 (et même "0"), pourtant, 0 est non seulement un numérique, mais aussi un entier.
Si le but est d'obtenir des valeurs strictement supérieurs à 0, alors Ok, sinon ça va pas.
0 est vraiment un cas particulier, de même que false peu semer la zizanie.

Le plus simple c'est de se référer à la doc concernant : empty()
Et faire des essai.


Citation:
Je récupère la variable avec extract ($_POST);
Je te déconseils d'utiliser extract() comme ça sans une véritable raison, surtout sans tenir compte du contexte.
Là encore, extract() est très particulier, lis la doc pour t'en rendre compte :
extract()
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/04/2011, 00h08   #4
Invité de passage
 
Homme Victor
Inscription : avril 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Victor
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : avril 2011
Messages : 3
Points : 2
Points : 2
Bonsoir. Merci pour vos réponses.

Je viens d'appliquer intval() comme tu me l'as conseillé transgohan et cela fonctionne, Merci.

Code :
1
2
 
if ($time_heure == intval($time_heure))
Pourrais tu juste, me préciser ce que l'on considéré comme "type String" ?
Ça ne me parle pas, même si je l'ai lu à plusieurs reprise dans le manuel php, je n'ai jamais eu à chercher des infos dessus. Si jamais tu n'as pas le temps d'y répondre je ferais une recherche.

Citation:
Envoyé par RunCodePhp Voir le message
Salut

Le principe général me semble correcte, sauf peut être un qui demande précision.

Code :
1
2
3
4
if (!empty ($time_heure))
{
 
}
empty() inclus la valeur 0 (et même "0"), pourtant, 0 est non seulement un numérique, mais aussi un entier.
Si le but est d'obtenir des valeurs strictement supérieurs à 0, alors Ok, sinon ça va pas.
0 est vraiment un cas particulier, de même que false peu semer la zizanie.

Le plus simple c'est de se référer à la doc concernant : empty()
Et faire des essai.


Je te déconseils d'utiliser extract() comme ça sans une véritable raison, surtout sans tenir compte du contexte.
Là encore, extract() est très particulier, lis la doc pour t'en rendre compte :
extract()

RunCodePhp, merci pour tes conseils mais j'aimerais quelques précisions. Pour bien en comprendre tout le sens.

Dans le cas présent, j'utilise (!empty) car je souhaite juste savoir si la variable est remplie et qu'elle ne correspond pas à 0. ( Je vérifie si l'utilisateur à préciser un Time heure ou minute. Même s'il a mis 0 heure je souhaite que la le script ne continue pas. J'ai donc pensé que "empty" était plus approprié que "isset" ou autre...( que je ne connais surement pas.)

Si tu penses que je devrais faire ce contrôle d'une autre manière je veux bien avoir ton avis. Mais pour le moment, "empty" à réussis les tests que j'ai pu faire.

Sinon tu me conseilles d'être prudent avec extract(), pour quelle raison ? Dans cette situation je récupère les données d'un formulaire de 15 variables envoyés par Post. Les données transmises ne peuvent arriver que par une seul page.

Une petite question me vient à l'esprit en écrivant ces lignes...

Peut-on appliquer en une ligne la fonction "htmlentities()" à toutes les variables récupérer par Post. Du style :

extract (htmlentities($_POST));

ou dans le genre.

Dans tous les cas, Merci pour votre aide précieuse et merci à tous ceux qui font vivre les forums php car sans eux je serais bien perdu ...

Bonne soirée.

Ykouko
Ykouko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 08h00   #5
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
Citation:
Sinon tu me conseilles d'être prudent avec extract(), pour quelle raison ? Dans cette situation je récupère les données d'un formulaire de 15 variables envoyés par Post. Les données transmises ne peuvent arriver que par une seul page.
C'est totalement faux, rien ne m'empêche de créer mon propre formulaire sur mon ordinateur et de le faire pointer vers ton script.
Ainsi si tu as une variable $id qui défini l'identifiant de la personne connectée je n'ai qu'à me créer un champs input de name id qui contiendra l'id de l'administrateur pour écraser ta variable.

Citation:
extract (htmlentities($_POST));
Non mais cela peut être fait rapidement avec une boucle foreach :
Code php :
1
2
foreach($_POST as $key => $valeur)
  $_POST[$key] = htmlentities($valeur);
Cependant c'est une fonction qu'on utilise généralement à l'affichage et non pour traiter le retour d'un formulaire...

Citation:
Pourrais tu juste, me préciser ce que l'on considéré comme "type String" ?
Le type String correspond au type Chaîne de caractères en algorithme.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 09h54   #6
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 709
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 709
Points : 3 279
Points : 3 279
Citation:
Si le but est d'obtenir des valeurs strictement supérieurs à 0, alors Ok, sinon ça va pas.
Citation:
'utilise (!empty) car je souhaite juste savoir si la variable est remplie et qu'elle ne correspond pas à 0.
Donc c'est bon.

Citation:
Sinon tu me conseilles d'être prudent avec extract(), pour quelle raison ?
Si tu ne lis pas la doc, tu ne sauras pas pourquoi.

Il est dit, je cite :
Citation:
Avertissement
N'utilisez pas extract() sur des données inconnues, comme les données utilisateurs (i.e. $_GET, $_FILES, etc.).
... etc ...
Donc y compris $_POST.

Vu que tu débute, je ne suis pas certain que tu as bien pris en compte ce que provoque cette fonction.
A une époque (Php4), beaucoup l'utilisait à tord et de travers.
Ce qui s'appelle un vrai fausse bonne idée.

Le piège de cette fonction appliquée sur des données extérieurs comme POST, GET, etc ... c'est que ça incite d'abord à minimiser les vérifications sur ces données qui pourtant demande des précautions.

Mais pire, faut bien percevoir quelle va extraire absolument toutes les données contenu dans le tableau, et les convertir en variable.
Donc pas seulement celles que ton code va prévoir de vérifier, mais toutes les autres qu'un pirate plus malin que les autres pourra rajouter.
Par conséquent on ouvre une porte, de donner la possibilité à quelqu'un d'injecter des données non désirées.


Cette fonctionne utilisée dans ce contexte là est inévitablement un manque de sécurité.

Mais c'est pas tout, cette fonction effectue encore d'autres opérations qui peuvent avoir des effets indésirables.
Voir la doc.


Vois tu mieux ?
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/04/2011, 10h37   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
tout ça se fait avec filter
regarde du coté de filter_input(_array)
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/04/2011, 23h51   #8
Invité de passage
 
Homme Victor
Inscription : avril 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Victor
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : avril 2011
Messages : 3
Points : 2
Points : 2
Je n'avais pas compris entièrement le sens de cette phrase, et $_post n'étant pas citer

Citation:
Avertissement
N'utilisez pas extract() sur des données inconnues, comme les données utilisateurs (i.e. $_GET, $_FILES, etc.).
... etc ...
Merci pour la précision. J'avais pourtant lu la doc mais comme il y a souvent beaucoup à lire je focus sur ce qui me parle.


Citation:
tout ça se fait avec filter
regarde du coté de filter_input(_array)
Merci stealth35 pour cette précision. j'ai suivis ce lien et il me parait très intéressant. Merci à vous en tout cas et bonne continuation.
Ykouko est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h02.


 
 
 
 
Partenaires

Hébergement Web