Le code "plus propre" ne fonctionne pas. [Résolu]

Signaler
-
 Daniel -
Bonjour,

J'ai un script sur une page qui devrait recevoir les données d'un formulaire.... Les données arrivent bien et elles s'affichent à l'écran avec ce code on ne peut plus basique
<?php
  $Votant = $_POST['Votant'];
  $Num = $_POST['Num'];
  $Vote1 = $_POST['Vote1'];
  $Vote2 = $_POST['Vote2'];
  $Vote3 = $_POST['Vote3'];
  $Vote4 = $_POST['Vote4'];
  $Vote5 = $_POST['Vote5'];
  $Vote6 = $_POST['Vote6'];
  $Vote7 = $_POST['Vote7'];
  $Vote8 = $_POST['Vote8'];

  echo  $Votant, ' ', $Num, ' ', $Vote1, ' ', $Vote2, ' ', $Vote3, ' ', $Vote4, ' ', $Vote5, ' ', $Vote6, ' ', $Vote7, ' ', $Vote8;
?>


Par contre avec le code suivant, les données ne s'affichent pas. j'ai bien le mot "Test" mais pas les variables.
<?php

		//activation de l'affichage des erreurs PHP
		error_reporting(E_ALL);
		ini_set('display_errors', TRUE);
		ini_set('display_startup_errors', TRUE);
		echo "Test  <br>";

		// on vérifie d'abord que tous les champs ont été envoyés
		if(isset($_POST['Action']))
		{
		$Action = $_POST['Action'];
		
		//déclaration des variables
		$Votant = $_POST['Votant'];
		$Num = $_POST['Num'];
        $Vote1 = $_POST['Vote1'];
        $Vote2 = $_POST['Vote2'];
        $Vote3 = $_POST['Vote3'];
        $Vote4 = $_POST['Vote4'];
        $Vote5 = $_POST['Vote5'];
        $Vote6 = $_POST['Vote6'];
        $Vote7 = $_POST['Vote7'];
        $Vote8 = $_POST['Vote8'];
			
		//test d'affichage des variables
	    
 		echo $Votant.'<br>';
		echo $Num.'<br>';
		echo $Vote1.'<br>';
		echo $Vote1.'<br>';
		echo $Vote2.'<br>';
		echo $Vote3.'<br>';
		echo $Vote4.'<br>';
		echo $Vote5.'<br>';
		echo $Vote6.'<br>';
		echo $Vote7.'<br>';
		echo $Vote8.'<br>';
				
		//Test OK => passage en commentaire
	
// création des requetes INSERT selon la valeur de la variable $Action
 	
/*		//on inclut le fichier de connexion à la bdd
		require_once "../secure/cnxBdd.php";
	 
		//$sth appartient à la classe PDOStatement
		$sth = $bdd->prepare("INSERT INTO Vote (Votant, Num, Vote1, Vote2, Vote3, Vote4, Vote5, Vote6, Vote7, Vote8) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
		$sth->execute(array($Votant, $Num, $Vote1, $Vote2, $Vote3, $Vote4, $Vote5, $Vote6, $Vote7, $Vote8));
             
		echo '<br><br>	Votre vote a bien été transmis.  Merci <br>
*/   
} 
?>



Et là je sèche depuis quelques heures... si vous pouviez m’aiguiller sur le pourquoi ce serait super gentil.
La requête est en commentaire car tant que les variables ne s'afficheront pas, c'est même pas la peine de vouloir les envoyer sur la BDD.
Merci d'avance.
Daniel


Configuration: Windows / Firefox 82.0

4 réponses

Messages postés
30349
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 novembre 2020
3 026
Bonjour,

Vu que ça bloque au niveau du IF .... as tu bien une variable $_POST['Action'] qui est envoyée dans ton formulaire ??

Peux tu, juste après ton
echo "Test  <br>";

faire un
echo "<pre>";
print_r($_POST);
echo "</pre>";

et nous montrer ce qu'il contient ?

PS: Pour l'instant, ce code n'est pas plus "propre" ... tu y as juste activé l'affichage des erreurs PHP...
Donc à voir si tu n'aurais pas des messages d'erreur qui s'afficheraient.... et dans ce cas... nous les donner...
Bonjour Jordane45,

Voici le résultat après le mot Test :

Array
(
[Votant] => TOTO
[Num] => 1555_13
[Vote1] => NON
[Vote2] => ABSTENTION
[Vote3] => NON
[Vote4] => ABSTENTION
[Vote5] => OUI
[Vote6] => OUI
[Vote7] => OUI
[Vote8] => OUI
)

Et il n'y a aucun message d'erreur php
Messages postés
30349
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 novembre 2020
3 026
Et il n'y a aucune variable Action non plus ....
Donc normal qu'il n'entre pas dans ton if ...
J'ai bien
<form name="0" action="EnvoiVote.php" method="post">

à l'ouverture du formulaire.
Messages postés
30349
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 novembre 2020
3 026
mais ça... ça ne génère pas de variable Action ....
Il faut avoir un INPUT qui ait comme NAME le mot "Action"
à la limite, tu peux ajouter, dans ton form

<form name="0" action="EnvoiVote.php" method="post">
  <input type="hidden" name="Action" value="1" />
>
Messages postés
30349
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 novembre 2020

Oui c'était aussi une solution mais je ne pense pas avoir fait une grosse erreur en donnant le name d'une variable du formulaire dans le isset.
Messages postés
30349
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 novembre 2020
3 026 > Daniel
Tu peux aussi, simplement mettre un attribut NAME au bouton qui te sert à faire le SUBMIT
<input type="submit" name="Action" value="Envoyer" />


mais oui, ta solution fonctionne également.
Salut,
name = 0? ça vous sert ça? Pas la bonne syntaxe en tout cas , un nom ne pouvant être un nombre si on veut l'utiliser en tant que variable dans un programme.

Ce que vous indiquez est simplement l'adresse de la page qui va traiter les données du formulaire.
Vu que vous utilisez la méthode POST toutes les valeurs du formulaire seront envoyées via la variable globale $_POST.
La variable ACTION n'existe donc pas, dans le formulaire HMTL c'est un attribut de balise qui indique simplement quelle action sera effectuée: en l’occurrence envoyer les données à la page PHP indiquées.

/!\ attention au noms de fichiers(et de dossiers) avec des majuscules. Parfois celles ci ne sont pas prise en compte et au mieux cela sera une source possible d'erreur; donc mieux vaux écrire tout en minuscule(fichiers et dossiers) pour éviter les erreurs. "envoivote.php" donc sera plus propre, plus simple à utiliser(c'est déjà plus rapide à taper) et évitera les erreurs pour les serveurs qui ne prennent pas en compte les majuscules.

Donc comme vous l'avez indiqué vous même tout (les valeurs/données du formulaires) sont transmises par la variable super-globale $_POST. Donc c'est celle ci que vous devez tester, nulle part il n'existe de variable $_POST['action'] sauf évidemment si vous en attribuez une.
Ainsi la syntaxe de votre condition:

if (!empty($_POST))
/* code ici  */
}



C'est donc la base de l'utilisation d'un formulaire (HTML) qui vous manquait ici.

Autre détail mais d'importance pour la requête je vous conseille de regarde du côté de PDO:
https://www.php.net/manual/fr/book.pdo.php

Il vaut mieux aussi vérifier que les champs sont bien remplis directement dans le formulaire.
Cela évite une requête serveur si les champs ne sont pas correctement remplis et sera donc plus rapide pour avoir l'erreur(les champs doivent être remplis)

Voir par exemple l'attribut de balise "required" à compléter par des vérifications en JavaScript(donc côté client aussi) qui permettent d'affiner un peu le message d'erreur si les champs ne sont pas correctement remplis.
Cela n'empêche pas non plus de vérifier côté PHP toutefois, le but étant de rendre impossible l'enregistrement dans la base de valeurs incohérentes(des nombres quand on attends des lettres ou inversement, des valeurs qui ne sont pas cohérent avec le SI.. etc.)


Plus de détails sur la transmission de données via la méthode POST ici:

https://www.php.net/manual/fr/reserved.variables.post.php


edit: owned
> Pikachu
Bonjour Pikachu,
Merci pour ces compléments.
Oui le required est utilisé comme le pattern et le js pour permettre à l'auteur la conservation de sa saisie.
Pour le PDO, Jordane m'a déjà envoyé un article à lire mais j'irai tout de même faire un tour sur votre lien.
Merci encore pour votre contribution à mon "sauvetage".
Daniel
Ok .. vu l'erreur.
J'étais reparti d'une page où il y avait une variable action.... alors que là, je ne l'avais plus.
En remplaçant Action par une variable existante ça marche beaucoup mieux.
En fait le Isset ne contrôle la présence que d'une variable. De là, on considère que les autres aussi sont bien arrivées.

Merci pour le temps passé sur cette banalité pour toi mais qui m'a fait encore progresser.
@+ et merci encore Jordane45
Messages postés
30349
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 novembre 2020
3 026
Et n'oublies pas, vu que tu fais du PDO, à placer CHAQUE requête dans un bloc TRY/CATCH
https://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
>
Messages postés
30349
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
27 novembre 2020

Ok, je vais lire l'article.
Merci de ta générosité.
Daniel