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

Langage PHP Discussion :

Le switch ne marche pas


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Points : 8
    Points
    8
    Par défaut Le switch ne marche pas
    Bonjour à tous,

    Bien qu'étant une fervente lectrice du site (merci d'ailleurs à tous les contributeurs pour leurs tutos clairs et sympathiques), je poste ici pour la première fois.

    Si je fais appel à vous aujourd'hui c'est que je me retrouve confrontée à un soucis depuis plusieurs jours. Je bosse actuellement sur l'élaboration d'un formulaire en php.
    Celui-ci est composé de 2 choses:
    - la classe qui permet le traitement du formulaire + le script qui exécute les instructions
    - le formulaire en html.

    Le principe est simple (le code qui suit est normalement assez commenté et explicite pour être facilement compréhensible): l'utilisateur vient sur la page du formulaire et remplit les champs. Au clic sur "submit" ou s'il tape "entrée", le script vérifie la validité des champs (s'ils sont vides, s'ils correspondent au pattern passé en paramètre etc...) Lorsque tout est ok, le script envoie un mail avec le contenu du formulaire et affiche un message pour remercier l'utilisateur.

    Le problème: le script reste bloqué toujours au même endroit, c'est-à-dire avant la vérification du contenu des champs de formulaire. J'ai une variable $action, dans ma classe, qui permet de déterminer l'état du formulaire (1= jamais exécute, 2=validation des données entrées, 3= envoi du mail). Seulement, il reste bloqué, comme si $action ne changeait jamais d'état. Or lorsque que je fais un "echo Email->__getAction();", il me dit bien que $action=2.

    Ci-après le code, de manière à être plus explicite. J'espère que vous aurez compris mon problème, sinon je ré-expliquerais ^_^°

    Merci par avance à ceux qui auront la gentillesse de me venir en aide.

    Bonne journée à tous!!

    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
    <?php
    		class SendMail
    		{
    			// propri�tés privées : tous les éléments et attributs utilisables (certaines valeurs sont entrées par défaut)
    			//variable de ma classe[...]
    			var $action; //variable permettant de tester si le formulaire vient juste d'�tre cr�er
     
     
    			//Constructeur
    			public function  SendMail ($type = "texte")
    			{ 
    				$this->action=1;
    				if ($type == "texte")
    				{ 
    					$this->entete = "Content-type: text/plain; charset=iso-8859-1n"; 
    				} 
    				elseif ($type == "html")
    				{ 
    					$this->entete = "Content-type: text/html; charset=iso-8859-1n"; 
    				} 
    			}
     
    			public function __GetAction()
    			{
    				return $this->action;
    			}
     
    			public function __SetAction($new_Action)
    			{
    				$this->action=$new_Action;
    			}
     
    			//instructions de ma classe [...]			
    		}//fin de la classe SendMail
     
     
    		//Création d'un nouvel objet SendMail
    		$destinataire="test@test.com"; //on configure l'adresse destinataire
    		$objet="Test mail site";
    		$contenu="";
    		$Email=new SendMail("HTML");
     
    		echo '<p>test cas 1</p>';
     
     
    		switch($Email->__GetAction())
    		{
    			case 1:
    				//on met tous les champs à vide s'ils sont nulls
    				$nom          =    isset($_POST['nom'])            ?  $_POST['nom'] : '';
    				//etc...[...]
    			break;
     
    			case 2:
    				//Récupération des variables du formulaire
     
    				$valid=0; //variable servant à déterminer si $action change d'état ou non
     
    				//on vérifie que les entrées obligatoires ne soient pas vides
    				//on vérifie, si elles sont remplies, qu'elles correspondent
    				//au pattern passé en paramètre
     
    				if($Email->TestEmpty($nom))
    				{
    					echo '<p>Le champ "Nom" est vide</p>';
    					$valid++;
    				}
    				else
    				{
    					if($Email->TestEntry($Email->patternstring, $nom)==0)
    					{
    						echo '<p>Le champ "Nom" n\'a pas un format valide</p>';
    						$valid++;
    					}
    				};
     
    				//idem pour les autres champs [...]
     
     
    				if($valid==0)
    				{
    					$Email->__SetAction(3); 
                                            //les entrées sont valides, on passe à l'envoi de mail
    				}
    			break;
    			case 3:
    				//Envoi du mail car toutes les données sont valides
    				//[...]
    			break;
    		}
    		$Email->ActionSubmit();
    		echo '<p>'.$Email->__GetAction().'</p>';
     
    	?>
    	<div ID="Body">
    		<H2>Nous contacter</H2>
    		<form method="POST" action="?" enctype=“multipart/form-data”>
    			<fieldset>
    				<legend>Vos coordonn&eacute;es</legend>
    				<label class="label_Coord" for="nom">Nom </label><input type="text" name="nom" id="nom" value="<?php echo htmlentities($nom); ?>"/><p class="p_asterisk">*</p><br/>
    <!-- Je n'ai mis qu'un champs, mais la syntaxe est la même pour les autres -->
    			<p class="p_com">Veuillez remplir les champs suivit d'un <strong>*</strong></p>
    			<input type="submit" value="Envoyer"/>
    		</form>
    	</div>

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu devrais mettre ton echo de controle juste avant le switch, on ne sait jamais.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    Résultat: il retourne 1, ce qui signifie qu'avant le switch il est bien initialisé à 1.... Sauf qu'il doit changer d'état après exécution du premier cas....

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je dirais plutôt que c'est le traitement du case 1 qui modifie la valeur.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    Oui c'est ça.... Il traite les instruction du case 1 puis modifie la valeur de $action de manière a passer à la validation des données

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ah mais non ça ne marche pas comme ça.
    C'est le résultat de l'expression qui est comparée au "case" : si la variable est modifiée en cours de route, ce n'est pas pris en compte.

    Si 2 est toujours traité après 1, tu peux enlever le break entre 1 et 2.
    Sinon il faut passer par des condition if/elseif.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    Je vais te donner mon algo de principe, tu comprendras peut-être mieux le pourquoi du comment....
    (je tiens à souligner le fait que j'ai tester pas mal de choses avant de venir ici, notamment en passant par des structures conditionnelles if(...)else(...) )

    nouvel objet SendMail()
    //à ce stade, grâce au constructeur, $action=1, ce qui signifie que le formulaire //n'a encore jamais été exécuter, donc l'utilisateur vient juste d'ouvrir la page

    quand $action==1 => on met les champs à null, prêts à être remplit
    quand $action==2 => on traite les données, on vérifie leur validité, on affiche les erreurs si besoin
    quand $action==3 => on envoi le formulaire valide (puisqu'on est forcément passé par $action==2)

    En passant par des if(...), ça ne marche pas, il stagne toujours...

    Comment faire alors?

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    if ($action == 1) {
    // traitement
    $action = 2;
    }
     
    if ($action == 2) {
    // traitement
    }

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    Ok, c'est la méthode que j'avais déjà essayé...

    Mais du coup, il me balance tous les messages d'erreur....Et pour cause: les champs sont vides, puisque pas encore remplit...Ce que je voudrais c'est qu'il vérifie au clic sur submit ou quand l'utilisateur tape sur "entrée"....

    Et je ne veux pas passer par javascript, car c'est désactivable...Et comme c'est pour un site professionnel (et aussi accessoirement pour un oral pour mon BTS ^^), il faut que je sécurise au maximum le truc...

    En tous cas merci Sabotage pour ta patience et tes explications, j'ai quand même avancer un peu grâce à ça.

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je ne vois pas bien ce que tu veux obtenir au final.

    La vérification d'un formulaire ca peut s'ecrire tout simplement comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
    $champ = isset($_POST['champ']) ? trim($_POST['champ']) : "";
     
    if (isset($_POST["valider"]) && !empty($champ)) {
    echo $champ;
    }
    else {
    echo '<form action="" method="post">
    <input type="text" value="' . $champ . '" />
    <input type="submit" name="valider" />
    </form>';
    }

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    Alors, ce que je veux obtenir...

    J'ai mon fichier php divisé en "2 parties" => le script php et le formulaire html. Dans mon script php, j'ai des méthodes qui me permettent notamment de retirer les espaces indésirables avant et après les chaînes, de remplacer les balises HTML inserrées en caractères inoffensifs, de contrôler si ma saisie est vide, sinon, si elle correspond à un pattern...etc.
    Ces fonctions là sont exploitées après dans un script, le fameux qui se déroule en 3 étapes:
    1) je n'ai jamais exécuté le formulaire, je mets les champs à vide, prêts à être remplit.
    2) j'ai remplit mes champs, je clic sur "envoyer", le script vérifie mes données et affiche les éventuels messages d'erreurs. Si tout est ok, on passe à l'étape 3
    3) Toutes les données sont valides, j'envoie le mail avec les données saisies et j'affiche un message de remerciement.

    Je voulais éviter de mélanger Php et HTML....Mais je crains, à la lecture de ta solution, que je n'ai pas le choix. Qu'en pense-tu?

    Merci encore pour ta réponse

    PS: si tu as une adresse mail, je peux t'envoyer le fichier php, pour que tu regarde de plus près.

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Si tu compares mon exemple et ton code, tu vois qu'il n'y a pas plus d'entremelement PHP/HTML dans l'un que dans l'autre.
    Ton système d'étape n'est pas mauvais et doit fonctionner. Il faut juste que tu sois rigoureux sur les tests et les enchainements que tu fais.

    Tu peux même mettre le formulaire dans un fichier inclus.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Si tu compares mon exemple et ton code, tu vois qu'il n'y a pas plus d'entremelement PHP/HTML dans l'un que dans l'autre.

    Tu peux même mettre le formulaire dans un fichier inclus.
    Je ne comprends pas bien. Dans ton exemple précédent, tu inclus du HTML dans ton script Php. Je viens d'essayer en suivant ton exemple, mais le champs ne s'affiche plus...

    Quand à mettre le formulaire dans un "fichier inclus", qu'entends-tu par là?

    Merci d'avance

  14. #14
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Dans ton exemple précédent, tu inclus du HTML dans ton script Php
    toi aussi non ?


    J'ai oublié le name dans le formulaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $champ = isset($_POST['champ']) ? trim($_POST['champ']) : "";
     
    if (isset($_POST["valider"]) && !empty($champ)) {
    echo "envoi du mail avec la valeur " . $champ;
    }
    else {
       include formulaire.php;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    echo '<form action="" method="post">
    <input type="text" name="champ" value="' . $champ . '" />
    <input type="submit" name="valider" />
    </form>';

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    C'est bon, j'ai compris le principe ^^
    Merci beaucoup. Bon, maintenant, ce sont mes checkbox qui font de la résistance mais je devrait pouvoir m'en sortir.

    Une dernière petite question, je comptais demander à mon patron la permission de mettre la classe que j'ai créée en "libre-service". Est-ce que ça intéresserait des gens d'après toi, sachant qu'elle ne crée pas un formulaire mais permet juste son traitement avec x champs?

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    Rebonjour,

    J'ai quasiement finis le formulaire, il ne me reste que les checkbox. J'arrive à récupérer leurs valeurs lorsque j'écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $checkbox1=    isset($_POST['checkbox1'])          ?  $_POST['checkbox1'] : 'Non';
    Mon soucis, c'est que du coup, dans le mail il m'écrit:

    checkbox1: on //si la checkbox a été sélectionnée sinon il met
    checkbox1: Non

    Or, j'avais créer une fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public function ValidCb($checkbox)
    			{
    				if(isset($checkbox))
    				{
    					return $checkbox="Oui";
    				}else
    				{
    					return $checkbox="Non";
    				}
    			}
    qui était censée permettre de changer le "on" en "Oui", si la checkbox est cochée. A priori, lorsque j'écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $checkbox1=    $Email->ValidCb($_POST['checkbox1']);
    il m'écrit que "checkbox1" n'est pas définis, erreur qui disparait si je lui mets la forme ternaire précédente.

    A quoi est-ce du? Ai-je manqué un chapitre? ^_^°

    Merci d'avance

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Lorsque tu ne coches pas une checkbox dans un formulaire, la variable correspondante n'est pas envoyée et donc n'existe pas.

    tu passes donc à ta méthode une variable ($_POST['checkbox1']) qui n'existe pas. D'où l'erreur.

    isset tolère que tu lui passe une variable inexistante vu que c'est sa fonction.

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    Ok, je viens de comprendre ^^

    Comment faire, alors, pour faire en sorte qu'il m'écrive "oui", si la checkbox est cochée, à la place de "on"?

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $checkbox1=    isset($_POST['checkbox1'])          ?  'Oui'  : 'Non';
    ou alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $checkbox1=    $Email->ValidCb( @$_POST['checkbox1'] );
    Utiliser l'arobase pour masquer une erreur n'est jamais recommandé, mais dans le cas présent on peut le considérer comme acceptable étant donné que ta méthode se base sur isset.

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 20
    Points : 8
    Points
    8
    Par défaut
    Super!!!!!! Merci beaucoup!!! Je teste tous ça, logiquement, ça devrait fonctionner.

    Merci encore pour vos réponses et vos explications!!!

Discussions similaires

  1. 'SHOW TABLES' marche pas sous postgresql !?
    Par fet dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 13/05/2004, 10h28
  2. Maximiser fenêtre ne marche pas
    Par sandrinec dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/06/2003, 13h02
  3. Réponses: 9
    Dernier message: 07/05/2003, 13h57
  4. [GifDecoder] marche pas dans applet avec IE
    Par formentor dans le forum Applets
    Réponses: 2
    Dernier message: 06/05/2003, 11h43
  5. Sysdate qui marche pas ??
    Par StouffR dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/08/2002, 14h23

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