Vérification d'un nom entré en paramètre ?

travisbarker
Invité n'ayant pas de compte PHPfrance

16 mai 2006, 09:11

Bonjour !
je cherche à développer une classe "Personne" qui crée des personnes avec un nom et un prénom. Je voudrais effectuer des controles sur les chaines de caractères entrées par l'utilisateur.

Pour l'instant, j'ai le code suivant :

Code : Tout sélectionner

<?php class Personne { private $nom; private $prenom; public function __construct($nom, $prenom) { if ($this->verifieChaine($nom)) { $this->nom = $nom;} else{die('Le nom n est pas valide');} if ($this->verifieChaine($prenom)) { $this->prenom = $prenom;} else{die('Le prenom n est pas valide');} } public function __tostring() { return "Je suis $this->prenom $this->nom !"; } public function afficheToi() { print $this->__tostring(); } public function getNom() { return $this->nom; } public function getPrenom() { return $this->prenom; } private function contientDesCaracteresAdmis($chaine) { $ok = false; $caracteresAdmis = 'aäàâbcdeëèéêfghiïîjklmnoöôpqrstuûùvwxyz'; for ($index = 1; $index <= strlen($chaine); $index++) { if (strcspn ($caracteresAdmis, $chaine{$index}) == strlen($caracteresAdmis)) { echo 'juste'; } else { echo 'faux'; } } return $ok; } private function commenceParMajuscule($chaine) { $ok = false; if ($chaine != null && strlen($chaine)>=1) { $ok = ($chaine{0} >= 'A' && $chaine{0} <= 'Z'); } return $ok; } private function verifieChaine($chaine) { $ok = false; if ($chaine != null) { $ok = $this->commenceParMajuscule($chaine); if ($ok && strlen($chaine)>=2) $ok = $this->contientDesCaracteresAdmis($chaine); } return $ok; } } ?>
La vérification de la chaine se fait en 3 étapes :
- Commence par une majuscule
- Contient des caractères admis
- Valide la chaine si les deux étapes précedentes fonctionnent

Or, avec le code que j'ai écrit, il n'y a que la vérification de la majuscule qui fonctionne.
Quand je vérifie les caractères admis, j'ai "fauxfauxfaux..." comme réponse.

Pour tester la classe Personne, j'utilise ce code :

Code : Tout sélectionner

<?php require_once('classes.php'); $personne = new Personne(Stehlin, Alex); $personne->afficheToi(); ?>
Quelqu'un voit où est le problème ?

Merci d'avance !

Eléphant du PHP | 383 Messages

16 mai 2006, 12:40

deja, dans contientDesCaracteresAdmis($chaine) tu ne modifie pas la valeur de $ok..

et je pense que tu utilises incorrectement la fonction strcspn...

http://www.nexen.net/index.php?option=c ... rapide.php

Eléphanteau du PHP | 46 Messages

16 mai 2006, 12:48

C'est vrai que j'ai oublié le $ok...

Par contre, pour la fonction strcspn, je ne vois pas trop ou est l'erreur...
strcspn ($caracteresAdmis, $chaine{$index}) -> Je cherche si le caractère à l'index de la chaine est dans ma liste des caractères admis...
En tout cas j'ai repris l'exemple du livre PHP 5 avancé.

EDIT:
J'ai changé la methode contientDesCaracteresAdmis:

Code : Tout sélectionner

private function contientDesCaracteresAdmis($chaine) { $ok = false; $caracteresAdmis = 'aäàâbcdeëèéêfghiïîjklmnoöôpqrstuûùvwxyz'; for ($index = 1; $index <= strlen($chaine); $index++) { $ok = (strcspn ($caracteresAdmis, $chaine{$index}) == strlen($caracteresAdmis)); } return $ok; }

le soucis que j'ai maintenant : Je n'ai pas d'erreur quand je remplace un caractère du nom ou du prénom par un chiffre (par exemple)...

Eléphant du PHP | 383 Messages

16 mai 2006, 12:59

je te cite la doc :
strcspn retourne la taille du premier segment de str1 qui ne contient aucun des caractères de str2 .
donc si $chaine{$index} contient un caractere qui n'est pas dans caracteresAdmis, la taille du premier segment de caracteresAdmis qui ne contient pas ce caractere va etre la taille de caracteresAdmis tout entier...

donc moi j'inverserais tes conditions, ca dire soit mettre une negation devant la condition, soit mettre faux en consequence du if, et vrai dans le else...

mais je pense que le mieux est d'utiliser strspn :
if(strspn($chaine, $caracteresAdmis) == strlen($chaine)) 
{
   return vrai;
}else{
   return faux;
}
en plus cela t'evite de faire une boucle...
dans l'absolu, je pense que ce genre de test est plus facile a realiser avec des expressions reguliere.

Eléphanteau du PHP | 46 Messages

16 mai 2006, 13:19

mais je pense que le mieux est d'utiliser strspn :
if(strspn($chaine, $caracteresAdmis) == strlen($chaine)) 
{
   return vrai;
}else{
   return faux;
}
en plus cela t'evite de faire une boucle...
dans l'absolu, je pense que ce genre de test est plus facile a realiser avec des expressions reguliere.
J'ai modifié le code comme tu me l'a expliqué, mais même avec un nom valide, j'obtiens une erreur...

Et tu veux utiliser quoi comme expression régulière ?

Eléphant du PHP | 383 Messages

16 mai 2006, 13:44

je verrais un truc du genre :
if(preg_match('#[^aäàâbcdeëèéêfghiïîjklmnoöôpqrstuûùvwxyz]#',$chaine))
{
   return faux;
}else{
   return vrai;
}
ce qui signifie exactement "si tu trouves un caractere qui n'est pas dans aäàâbcdeëèéêfghiïîjklmnoöôpqrstuûùvwxyz, retourne faux, sinon retourne vrai."

Eléphanteau du PHP | 46 Messages

16 mai 2006, 13:51

je verrais un truc du genre :
if(preg_match('#[^aäàâbcdeëèéêfghiïîjklmnoöôpqrstuûùvwxyz]#',$chaine))
{
   return faux;
}else{
   return vrai;
}
ce qui signifie exactement "si tu trouves un caractere qui n'est pas dans aäàâbcdeëèéêfghiïîjklmnoöôpqrstuûùvwxyz, retourne faux, sinon retourne vrai."
J'ai essayé avec ta methode mais ça ne marche toujours pas... et je ne vois pas ou est l'erreur...

Mon code :
private function contientDesCaracteresAdmis($chaine) {
        if(preg_match('#[^aäàâbcdeëèéêfghiïîjklmnoöôpqrstuûùvwxyz]#',$chaine)){
            $ok = false;
        } else {
            $ok = true;
        }
      return $ok;
    }

Eléphant du PHP | 383 Messages

16 mai 2006, 13:55

moi non plus, je l'ai testée la :
http://www.lumadis.be/regex/test_regex.php

et ca a l'air de marcher... affiche ta variable chaine, pour voir ??

Eléphanteau du PHP | 46 Messages

16 mai 2006, 14:02

moi non plus, je l'ai testée la :
http://www.lumadis.be/regex/test_regex.php

et ca a l'air de marcher... affiche ta variable chaine, pour voir ??
J'ai rajouté
echo $chaine;
après
private function contientDesCaracteresAdmis($chaine) {
et il m'affiche le contenu de $nom suivi de "Le nom n'est pas valide"...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

16 mai 2006, 14:20

Moi j'utiliserais l'expression régulaire preg_match comme ça:
<?php 

class Personne { 

      private $nom; 
      private $prenom; 

      public function __construct($nom, $prenom) { 
        if ($this->verifieChaine($nom)) { 
            $this->nom = $nom;} 
            else{die('Le nom n est pas valide');} 

        if ($this->verifieChaine($prenom)) { 
            $this->prenom = $prenom;} 
            else{die('Le prenom n est pas valide');} 
    } 

    public function __tostring() { 
        return "Je suis $this->prenom $this->nom !"; 
    } 

    public function afficheToi() { 
        print $this->__tostring(); 
    } 

    public function getNom() { 
        return $this->nom; 
    } 

    public function getPrenom() { 
        return $this->prenom; 
    } 

    private function contientDesCaracteresAdmis($chaine) { 
        if ($chaine && (preg_match("#[a-zäàâëèéêïîöôûù]#", $chaine)) return true; else return false;       
    } 

    private function commenceParMajuscule($chaine) { 
            if ($chaine[0] && preg_match("#[A-Z]#", $chaine[0])) return true;  else return false;
    } 

    private function verifieChaine($chaine) { 
        if ($chaine && $this->commenceParMajuscule($chaine) && $this->contientDesCaracteresAdmis($chaine))
			return true; 
        else return false; 
    } 
} 

//Test
//personne valide
$personne_valide = new Personne("Stehlin", "Alex"); 
$personne_valide->afficheToi();

//Dans ce qui suit, déactiver un test pour tester le suivant (puisque l'erreur fait un Die)

//Nom non valide (maj manque au début)
$personne_non_valide1 = new Personne("stehlin", "Alex"); 
$personne_non_valide1->afficheToi();

//Prénom non valide (maj manque au début)
$personne_valide2 = new Personne("Stehlin", "alex"); 
$personne_valide2->afficheToi();

//Nom non valide (caractères non admis)
$personne_valide2 = new Personne("123", "Alex"); 
$personne_valide2->afficheToi();

//Prénom non valide (caractères non admis)
$personne_valide2 = new Personne("Stehlin", "123"); 
$personne_valide2->afficheToi();

?>
Remarque: pour plus d'infos sur preg_match : http://fr3.php.net/manual/fr/function.preg-match.php
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 46 Messages

16 mai 2006, 14:41

Moi j'utiliserais l'expression régulaire preg_match comme ça:
<?php 

class Personne { 

      private $nom; 
      private $prenom; 

      public function __construct($nom, $prenom) { 
        if ($this->verifieChaine($nom)) { 
            $this->nom = $nom;} 
            else{die('Le nom n est pas valide');} 

        if ($this->verifieChaine($prenom)) { 
            $this->prenom = $prenom;} 
            else{die('Le prenom n est pas valide');} 
    } 

    public function __tostring() { 
        return "Je suis $this->prenom $this->nom !"; 
    } 

    public function afficheToi() { 
        print $this->__tostring(); 
    } 

    public function getNom() { 
        return $this->nom; 
    } 

    public function getPrenom() { 
        return $this->prenom; 
    } 

    private function contientDesCaracteresAdmis($chaine) { 
        if ($chaine && (preg_match("#[a-zäàâëèéêïîöôûù]#", $chaine)) return true; else return false;       
    } 

    private function commenceParMajuscule($chaine) { 
            if ($chaine[0] && preg_match("#[A-Z]#", $chaine[0])) return true;  else return false;
    } 

    private function verifieChaine($chaine) { 
        if ($chaine && $this->commenceParMajuscule($chaine) && $this->contientDesCaracteresAdmis($chaine))
			return true; 
        else return false; 
    } 
} 

//Test
//personne valide
$personne_valide = new Personne("Stehlin", "Alex"); 
$personne_valide->afficheToi();

//Dans ce qui suit, déactiver un test pour tester le suivant (puisque l'erreur fait un Die)

//Nom non valide (maj manque au début)
$personne_non_valide1 = new Personne("stehlin", "Alex"); 
$personne_non_valide1->afficheToi();

//Prénom non valide (maj manque au début)
$personne_valide2 = new Personne("Stehlin", "alex"); 
$personne_valide2->afficheToi();

//Nom non valide (caractères non admis)
$personne_valide2 = new Personne("123", "Alex"); 
$personne_valide2->afficheToi();

//Prénom non valide (caractères non admis)
$personne_valide2 = new Personne("Stehlin", "123"); 
$personne_valide2->afficheToi();

?>
Remarque: pour plus d'infos sur preg_match : http://fr3.php.net/manual/fr/function.preg-match.php
Cette methode marche nickel chez moi !
Merci !

Mais je vais quand même essayer de débeuguer la première version...

Eléphanteau du PHP | 46 Messages

16 mai 2006, 15:00

Suite de mon problème... :oops:

J'ai créé un fichier PHP pour que l'utilisateur entre lui-même un nom et ça donne le code suivant :
<html>
<head>
 <title>Nom et prenom</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>

<form action="affiche_nom_et_prenom.php" method="POST">
<p>
Entrez un nom :</br>
<input name="nom" type="text"></br>
<input type="submit" value="Valider">
</p>
</form>

<?php

require_once('classes.php');

//Recupère le nom entré et l'assigne à la variable $nom
$_POST['nom'] = $nom;

//C'est $nom qui est testé
$personne_valide = new Personne($nom, "Alex");
$personne_valide->afficheToi();

?>

</body>
<html>
Et j'obtiens "le nom n'est pas valide"...

Eléphant du PHP | 383 Messages

16 mai 2006, 15:49

désolé de jouer les rabats joie, mais
private function contientDesCaracteresAdmis($chaine) {
        if ($chaine && (preg_match("#[a-zäàâëèéêïîöôûù]#", $chaine)) return true; else return false;       
    } 
ne fonctionnera pas comme tu veux... cette fonction renverra vrai des que la chaine contiendra au moins un caractere valide.. or toi tu veux qu'il n'y ai que des caracteres valides.. donc je pense qu'il faut utiliser la fonction que je t'ai proposée... si elle ne fonctionne pas, c'est qu'il doit y avoir un probleme sur la chaine..

Eléphanteau du PHP | 46 Messages

16 mai 2006, 16:10

désolé de jouer les rabats joie, mais
private function contientDesCaracteresAdmis($chaine) {
        if ($chaine && (preg_match("#[a-zäàâëèéêïîöôûù]#", $chaine)) return true; else return false;       
    } 
ne fonctionnera pas comme tu veux... cette fonction renverra vrai des que la chaine contiendra au moins un caractere valide.. or toi tu veux qu'il n'y ai que des caracteres valides.. donc je pense qu'il faut utiliser la fonction que je t'ai proposée... si elle ne fonctionne pas, c'est qu'il doit y avoir un probleme sur la chaine..
Non le problème, c'est que j'ai une erreur quand j'utilise la methose POST. Quand je rentre les nom et prénom directement dans le code PHP, je n'ai pas d'erreur.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

16 mai 2006, 16:30

désolé de jouer les rabats joie, mais
private function contientDesCaracteresAdmis($chaine) {
        if ($chaine && (preg_match("#[a-zäàâëèéêïîöôûù]#", $chaine)) return true; else return false;       
    } 
ne fonctionnera pas comme tu veux... cette fonction renverra vrai des que la chaine contiendra au moins un caractere valide.. or toi tu veux qu'il n'y ai que des caracteres valides.. donc je pense qu'il faut utiliser la fonction que je t'ai proposée... si elle ne fonctionne pas, c'est qu'il doit y avoir un probleme sur la chaine..
Non le problème, c'est que j'ai une erreur quand j'utilise la methose POST. Quand je rentre les nom et prénom directement dans le code PHP, je n'ai pas d'erreur.
jobherzt a raison, l'expression preg_match ne répond pas exactement à la validation.
Mais la solution est d'utiliser preg_match_all pour forcer la validation de tous les caractères de la chaine (sans devoir utiliser une boucle)
    private function contientDesCaracteresAdmis($chaine) { 
 		//L'expression détecte au moins un caractère non valide
                 if (preg_match_all("#[^a-zäàâëèéêïîöôûù]#", strtolower($chaine), $résultat)) return false;
		else return true;      
    } 
Remarque : le strtolower() utilisé permet d'ignorer les majuscules

Pour ce qui est de ton formulaire il faut inverser l'affectation du $nom :
Corrigé:
$nom = $_POST["nom"];
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène