IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

implémentation de mon formulaire


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 110
    Points : 49
    Points
    49
    Par défaut implémentation de mon formulaire
    Bonsoir tout le monde!

    Je rame un peu avec mon formulaire moitié représentation procédurale moitié POO!
    Je n'arrive pas à utiliser une variable qui se trouve hors de la classe filter, appeler la variable $pseudo_free et $email_free pour savoir se que contiennent celles ci et donc savoir si l' email ou le pseudo est déja utiliser, je ne sais pas trop comment mi prendre!
    mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
     
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr" dir="ltr">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
        <title>Formulaire</title>
    <meta http-equiv="Content-Language" content="fr" />
    <meta name="description" content="inscription BLablabla" />    
    </head>
     
    <?php
     
    	/*$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
    	$reponse = $bdd->prepare('SELECT COUNT(*) AS nbr FROM membres WHERE login =:pseudo');
    	$reponse->bindValue(':pseudo',$_POST['Identifiant'] , PDO::PARAM_STR);
    	$reponse->execute();
    	$pseudo_free =($reponse->fetchColumn()==0)?1:0;*/
     
     
    	/*$rep = $bdd->prepare('SELECT COUNT(*) AS nbr FROM membres WHERE email =:mail');
    	$rep->bindValue(':mail',$email , PDO::PARAM_STR);
    	$rep->execute();
    	$rep->CloseCursor();
    	$email_free=($reponse->fetchColumn()==0)?1:0;*/
     
    class FilterTest
    {	
     
        public static function _call($a,$b){
     
    	$erreur = false;
     
    	 switch ($b){
     
    		case "STRING_IDENT":
    			$string = self::check_space($a);
     
    			/*if(!$pseudo_free){
    				$string = false;
    				$erreur = 'Votre pseudo est déjà utilisé.';
    			}
    			else*/if(strlen($string)<3 ){
    				$string = false;
    				$erreur = 'Votre identifiant doit contenir plus de 3 caractères';
    			}
    			elseif(strlen($string)>20 ){
    				$string = false;
    				$erreur = 'Votre identifiant doit contenir moins de 20 caractères';
    			}
    			elseif(preg_match('#^[a-z0-9àáâãäçèééêëìíîïñðòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜŽÝ ._\'-]{3,20}$#i', $string)){
    				$string=$string;
    			}
    			else{
    				$string = false;
    				$erreur='Cet identifiant ne correspond pas aux exigences de l\'administrateur.';
    			}
    		break;
     
    		case "STRING_PASSWORD":
    			$string=trim($a);
    			$_POST['PasswordConfirm']=trim($_POST['PasswordConfirm']);
     
    			if($string!=$_POST['PasswordConfirm']){
    				$string = false;
    				$erreur = 'Les deux mots de passe que vous avez insérés ne correspondent pas.';
    			}
    			elseif(strlen($string)<3){
    				$string = false;
    				$erreur = 'Votre mot de passe doit contenir plus de 3 caractères';
    			}
    			else{
    				$string= sha1('Gr@1n2s3l1' . md5($string) . 'gRaIn2$eL2');
    			}
    		break;
     
    		case "STRING_EMAIL":
    			$string = self::check_space($a);
    			$_POST['EmailConfirm']= self::check_space($_POST['EmailConfirm']);
    			/*if(!$email_free){
    				$string = false;
    				$erreur = 'L\'adresse email que vous avez insérée est déjà utilisée.';
    			}*/
    			if($string!=$_POST['EmailConfirm']){
    				$string = false;
    				$erreur = 'Les deux adresses email que vous avez entrées ne correspondent pas.';
    			}
    			elseif(strlen($string)>320){
    				$string = false;
    				$erreur = 'Votre adresse email comporte trop de caractères.';
    			}
       			elseif(preg_match('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#i', $string)){
    				$string=$string;
    			}
    			else{
    				$string = false;
    				$erreur='Vous avez inséré une adresse email non valide.';
    			}
    		break;
     	 }
     
    	return array('value'=>$string,'erreur'=>$erreur);
        }
     
    	public static function check_space($string){
    		$temp=trim($string);
    		$string="";
    		for ( $i = 1 ; $i < strlen($temp) +1 ; $i ++ ){
    			if ( $temp[$i-1]==" " &&  $temp[$i]==" "){
    			}
    			else{
    			$string.= $temp[$i-1] ;
    			}
    		}
    		return $string;
    	}
     
    }
     
    $options = array(
    			'Identifiant' => array(
    							  'filter' => FILTER_CALLBACK,
    							  'options' =>create_function('$a','return FilterTest::_call($a,"STRING_IDENT");') 
    								  ),
    			'Password' => array(
    						   'filter' => FILTER_CALLBACK, 
    						   'options' => create_function('$a','return FilterTest::_call($a,"STRING_PASSWORD");')
    						       ),
    			'Email' => array(
    						'filter' => FILTER_CALLBACK, 
    						'options' => create_function('$a','return FilterTest::_call($a,"STRING_EMAIL");')
    						    )
    );
     
        $resultat = filter_input_array(INPUT_POST, $options); 
     
    if($resultat != null)//Si le formulaire a bien été posté.
    { 		//Enregistrer des messages d'erreur perso.
    		$messageErreur = array(
    						  'Identifiant' => $resultat['Identifiant']['erreur'],
    						  'Email' => $resultat['Email']['erreur'],
    						  'Password' => $resultat['Password']['erreur']
    							  );
     
        $nbrErreurs = 0;
    ?>		
    	<ul>
    <?php 
    	foreach($options as $cle => $valeur)  //Parcourir tous les champs voulus.
    	{	
    		if(empty($_POST[$cle])) //Si le champ est vide.
    		{ 
                echo '<li> Veuillez compléter le champ requis « ' . $cle . ' ».</li><br/>';
                $nbrErreurs++;
    		}
            else if($resultat[$cle]['value'] == false) //S'il n'est pas valide.
    		{ 
                echo '<li>' .$messageErreur[$cle] . '</li><br/>';
                $nbrErreurs++;
    		}
    	}
    ?>  </ul>
    <?php	if($nbrErreurs > 0){
    		echo '<p>Les erreurs suivantes se sont produites pendant votre inscription :</p>';
    		}
     
    		if($nbrErreurs == 0)
    		{	
    			echo 'Bonjour ' . $resultat['Identifiant']['value'] . '!<br/> ';
    			echo 'Ton adresse de messagerie est bien ' . $resultat['Email']['value'] . '.<br/>';
    			echo 'Ton mot de passe est ' . $resultat['Password']['value'] . '.<br/>';
     
    		}
    }	
    else
    {
    	echo 'Vous n\'avez rien posté.';
    }
     
    ?>
    </html>

    ou bien rajouter une classe "Manager" qui pourra gérer chaque action:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
     
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr" dir="ltr">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
        <title>Formulaire</title>
    <meta http-equiv="Content-Language" content="fr" />
    <meta name="description" content="inscription BLablabla" />    
    </head>
     
    <?php
     
    class Manager
    {
            private $_db; // Instance de PDO
     
            public function __construct($db)
            {
                $this->setDb($db);
            }
     
            public function add()
            {
                $q = $this->_db->prepare('INSERT INTO membres SET nom = :nom');
                $q->bindValue(':nom', $_POST['Identifiant']);
                $q->execute();
            }
     
            public function exists($info)
            {
                $q = $this->_db->prepare('SELECT COUNT(*) FROM membres WHERE nom = :nom');
                $q->execute(array(':nom' => $_POST['Identifiant']));
     
                return (bool) $q->fetchColumn();
            }
     
            public function setDb(PDO $db)
            {
                $this->_db = $db;
            }
    }
    class FilterTest
    {	
     
        public static function _call($a,$b){
     
    	$erreur = false;
     
    	 switch ($b){
     
    		case "STRING_IDENT":
    			$string = self::check_space($a);
     
    			/*if(!$pseudo_free){
    				$string = false;
    				$erreur = 'Votre pseudo est déjà utilisé.';
    			}
    			else*/if(strlen($string)<3 ){
    				$string = false;
    				$erreur = 'Votre identifiant doit contenir plus de 3 caractères';
    			}
    			elseif(strlen($string)>20 ){
    				$string = false;
    				$erreur = 'Votre identifiant doit contenir moins de 20 caractères';
    			}
    			elseif(preg_match('#^[a-z0-9àáâãäçèééêëìíîïñðòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜŽÝ ._\'-]{3,20}$#i', $string)){
    				$string=$string;
    			}
    			else{
    				$string = false;
    				$erreur='Cet identifiant ne correspond pas aux exigences de l\'administrateur.';
    			}
    		break;
     
    		case "STRING_PASSWORD":
    			$string=trim($a);
    			$_POST['PasswordConfirm']=trim($_POST['PasswordConfirm']);
     
    			if($string!=$_POST['PasswordConfirm']){
    				$string = false;
    				$erreur = 'Les deux mots de passe que vous avez insérés ne correspondent pas.';
    			}
    			elseif(strlen($string)<3){
    				$string = false;
    				$erreur = 'Votre mot de passe doit contenir plus de 3 caractères';
    			}
    			else{
    				$string= sha1('Gr@1n2s3l1' . md5($string) . 'gRaIn2$eL2');
    			}
    		break;
     
    		case "STRING_EMAIL":
    			$string = self::check_space($a);
    			$_POST['EmailConfirm']= self::check_space($_POST['EmailConfirm']);
    			/*if(!$email_free){
    				$string = false;
    				$erreur = 'L\'adresse email que vous avez insérée est déjà utilisée.';
    			}*/
    			if($string!=$_POST['EmailConfirm']){
    				$string = false;
    				$erreur = 'Les deux adresses email que vous avez entrées ne correspondent pas.';
    			}
    			elseif(strlen($string)>320){
    				$string = false;
    				$erreur = 'Votre adresse email comporte trop de caractères.';
    			}
       			elseif(preg_match('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#i', $string)){
    				$string=$string;
    			}
    			else{
    				$string = false;
    				$erreur='Vous avez inséré une adresse email non valide.';
    			}
    		break;
     	 }
     
    	return array('value'=>$string,'erreur'=>$erreur);
        }
     
    	public static function check_space($string){
    		$temp=trim($string);
    		$string="";
    		for ( $i = 1 ; $i < strlen($temp) +1 ; $i ++ ){
    			if ( $temp[$i-1]==" " &&  $temp[$i]==" "){
    			}
    			else{
    			$string.= $temp[$i-1] ;
    			}
    		}
    		return $string;
    	}
     
    }
     
    $options = array(
    			'Identifiant' => array(
    							  'filter' => FILTER_CALLBACK,
    							  'options' =>create_function('$a','return FilterTest::_call($a,"STRING_IDENT");') 
    								  ),
    			'Password' => array(
    						   'filter' => FILTER_CALLBACK, 
    						   'options' => create_function('$a','return FilterTest::_call($a,"STRING_PASSWORD");')
    						       ),
    			'Email' => array(
    						'filter' => FILTER_CALLBACK, 
    						'options' => create_function('$a','return FilterTest::_call($a,"STRING_EMAIL");')
    						    )
    );
    	$db = new PDO('mysql:host=localhost;dbname=combats', 'root', '');
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); /
     
        $manager1 = new Manager($db);
     
    	$resultat = filter_input_array(INPUT_POST, $options); 
     
    if($resultat != null)//Si le formulaire a bien été posté.
    { 		//Enregistrer des messages d'erreur perso.
    		$messageErreur = array(
    						  'Identifiant' => $resultat['Identifiant']['erreur'],
    						  'Email' => $resultat['Email']['erreur'],
    						  'Password' => $resultat['Password']['erreur']
    							  );
     
        $nbrErreurs = 0;
    ?>		
    	<ul>
    <?php 
    	foreach($options as $cle => $valeur)  //Parcourir tous les champs voulus.
    	{	
    		if(empty($_POST[$cle])) //Si le champ est vide.
    		{ 
                echo '<li> Veuillez compléter le champ requis « ' . $cle . ' ».</li><br/>';
                $nbrErreurs++;
    		}
            else if($resultat[$cle]['value'] == false) //S'il n'est pas valide.
    		{ 
                echo '<li>' .$messageErreur[$cle] . '</li><br/>';
                $nbrErreurs++;
    		}
    	}
    ?>  </ul>
    <?php	if($nbrErreurs > 0){
    		echo '<p>Les erreurs suivantes se sont produites pendant votre inscription :</p>';
    		}
     
    		if($nbrErreurs == 0)
    		{	
    			echo 'Bonjour ' . $resultat['Identifiant']['value'] . '!<br/> ';
    			echo 'Ton adresse de messagerie est bien ' . $resultat['Email']['value'] . '.<br/>';
    			echo 'Ton mot de passe est ' . $resultat['Password']['value'] . '.<br/>';
     
    			/*$manager->add();  */    
    		}
    }	
    else
    {
    	echo 'Vous n\'avez rien posté.';
    }
     
    ?>
    </html>
    Je suis un peu pommé, si on pouvait m'éguiller ça serait sympa!

    Merci

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    essai comme ca après l'execution de la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print_r($reponse->fetchAll(PDO::FETCH_CLASS));

    et regarde la doc, ya plein de facon de récupérer les resultats

    http://php.net/manual/fr/pdostatement.fetch.php


    Note :

    tu peu faire les recherches ( bdd vs form ) dans les filtres, et prévoir les messages adequats pour gagner de la place
    Conception / Dev

  3. #3
    Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 110
    Points : 49
    Points
    49
    Par défaut
    Merci pour ta réponse !

    et regarde la doc, ya plein de facon de récupérer les resultats

    http://php.net/manual/fr/pdostatement.fetch.php
    Ok je vais aller lire tout ça!

    Note :

    tu peu faire les recherches ( bdd vs form ) dans les filtres, et prévoir les messages adequats pour gagner de la place
    Je ne comprends pas.. bdd vs form ? mettre les requetes de bdd dans les filtres ?

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    oui tout a fait, comme cela tu ne fait pas de double traitement, et tu te sert des valeurs filtrées
    Conception / Dev

  5. #5
    Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 110
    Points : 49
    Points
    49
    Par défaut
    oui tout a fait, comme cela tu ne fait pas de double traitement, et tu te sert des valeurs filtrées
    Ah d'accord mais j'ai toujours lu qu'il fallait faire une classe a part, qu'une classe avait un rôle... je vais tester tout ça je te tiens au courant

    merci pour tes reponses

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    Tu peu tout aussi faire une class à part, c'est vrai, mais rien ne t’empêche d'effectuer le test à l’intérieur du filtre..
    Conception / Dev

  7. #7
    Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 110
    Points : 49
    Points
    49
    Par défaut
    En faite si je mets les requetes de bdd dans les filtres... il faut que je place deux connections a la base de donnée, une dans la classe pour pouvoir utiliser les requêtes au niveau des filtres et l'autre connection hors de la classe pour pouvoir utiliser les requetes dans le reste du code.. c'est pas gênant d'avoir deux connections à la base de donnée ? ou alors la il faut vraiment que je crée une classe a part qui contiendrait toutes les requêtes ?!

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    Tu peu très bien faire au minima une class bdd avec une fonction qui se connecte, une qui gère les requêtes et une qui renvoi le résultat

    N"importe ou dans tes scripts, tu appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $bdd->connect();// de toute façon ça doit soit retourné la connexion active soit en créer une
    $res = $bdd->query('ma requete');
    print_r($res);
    Que penses tu de cette méthode ?
    Conception / Dev

  9. #9
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    salut,
    je trouve que ton travail ressemble au mien et je me demande après le temps es que tu as pu résoudre tes problèmes et m'aider par la même occasion à résoudre les miens
    merci d'avance

Discussions similaires

  1. ie ne retrouve pas un element de mon formulaire
    Par duge dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/02/2006, 10h50
  2. la date et heure sur mon formulaire
    Par azde7015 dans le forum Access
    Réponses: 11
    Dernier message: 07/02/2006, 11h40
  3. [JSF] Implémentation d'un formulaire dynamique
    Par Fleep dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/03/2005, 20h00
  4. [Debutant(e)]mise à jour de mon formulaire via JSP
    Par kouadjalain dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 11/08/2004, 16h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo