Perte de ma variable $_POST après un Submit

Résolu/Fermé
Raven76 Messages postés 250 Date d'inscription samedi 10 avril 2010 Statut Membre Dernière intervention 21 février 2024 - 10 nov. 2020 à 12:51
yg_be Messages postés 23258 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 octobre 2024 - 10 nov. 2020 à 17:22
Bonjour,

J'ai une page qui renvoi par la méthode POST une valeur que je récupère dans une autre page et que je place dans une variable.

Sur cette nouvelle page, j'ai un formulaire qui apparait dont le nombre de ligne à remplir varie en fonction de la valeur récupérée par le POST.

Une fois que je souhaite envoyer mon formulaire via un input de type Submit, je me rends compte que je perds la valeur de mon POST, ce qui fait que je n'envoie pas les données que je souhaite envoyer à ma base.

Voici le code :

$nb = $_POST['nb'];
echo "MODE DEBUG : Valeur récupérée : ".$nb; //affiche le nombre de ligne à générer dans la page
if(isset($_POST['formenvoi']))
{
$message= "valeur variable après submit : ".$nb;
}

--------

// avec plus bas mon submit
<input type="submit" formmethod="POST" name="formenvoi" value="ENVOYER"/>


Après le SUBMIT, je perds le contenu de $nb.

Vous auriez une piste ?

Mon but est de ne pas changer de page mais juste d'afficher un message à l'utilisateur pour indiquer que sa demande a été prise en compte.

Configuration: Windows / Edge 86.0.622.63

6 réponses

jordane45 Messages postés 38252 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 14 octobre 2024 4 692
10 nov. 2020 à 16:04
<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

session_start();
$serveur='aaa';
$login='bbb';
$mdp='ccc';
$nom_bd='ddd';

try{
  $bdd=new PDO('mysql:host=' . $serveur . ';dbname=' . $nom_bd . ';charset=utf8', $login, $mdp);
  // Activation des erreurs PDO
  $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
  $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch(PDOException $e) {
  die('Erreur : ' . $e->getMessage());
}

//si on a envoyé par POST la variable NB on la stocke en SESSION
if(!empty($_POST['nb'])){
  $_SESSION['nb'] = $_POST['nb'];// <= ici est la ligne 17 dans mon code
}

$nb = !empty($_SESSION['nb']) ? $_SESSION['nb'] : NULL;

echo "MODE DEBUG : Valeur récupérée : ".$nb; //affiche le nombre de ligne à générer dans la page
//MODE DEBUG +++
echo "<pre>";
echo "<br> Variables en session : <br>";
print_r($_SESSION);

echo "<br> Variables POST : <br>";
print_r($_POST);
echo "</pre>";
//FIN DEBUG



$message="Merci demandant à l'utilisateur de bien remplir tous les champs";
if(isset($_POST['formenvoi'])) {
  $message= "Valeur récupérée apres submit : ".$nb;
}
?>

1
Raven76 Messages postés 250 Date d'inscription samedi 10 avril 2010 Statut Membre Dernière intervention 21 février 2024 15
10 nov. 2020 à 16:51
Et voila, un super et grand merci à Jordane45.
Je récupère bien la valeur après le submit, je vais donc pouvoir écrire en base mon formulaire.
C'est juste ton "if" qui me résolve mon problème....

pourquoi est-ce que
$_SESSION['nb'] = $_POST['nb'];
n'est pas suffisant ?
0
yg_be Messages postés 23258 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 octobre 2024 1 541 > Raven76 Messages postés 250 Date d'inscription samedi 10 avril 2010 Statut Membre Dernière intervention 21 février 2024
10 nov. 2020 à 17:22
si tu rentres dans la page à partir du submit du formulaire qui contient nb (le formulaire que tu ne nous as pas montré), tu veux sauver nb dans la variable session.
par contre, si tu rentres dans la page à partir du formulaire que tu nous as montré, qui ne contient pas nb, tu ne veux surement pas écraser le contenu de la variable session.
la variable POST contient des informations venant du formulaire contenant le submit. la présence de nb dans la variable POST te permet donc de différencier les deux formulaires démarrant cette page.
0
yg_be Messages postés 23258 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 octobre 2024 Ambassadeur 1 541
10 nov. 2020 à 13:02
bonjour,
tu ne montres qu'une partie de ton code, et tu n'as pas précisé "php" dans les balises de code:
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

quand le code de la page se termine, la valeur des variables est oubliée.
quand l'utilisateur fait SUBMIT, le code de la page recommence à nouveau, et va rechercher la valeur de $nb dans le formulaire qui vient d'être posté.

le plus simple, c'est d'inclure le nombre de lignes dans le formulaire, comme cela il sera reposté.
le mieux, cependant, est, peut-être, d'utiliser des variables de session. tu trouveras beaucoup d'explications et d'exemples en faisant une recherche.
0
Raven76 Messages postés 250 Date d'inscription samedi 10 avril 2010 Statut Membre Dernière intervention 21 février 2024 15
10 nov. 2020 à 13:53
En effet, le code n'est pas complet, je n'ai faut que mettre la partie qui me pose problème et de manière simplifiée.
Je vais me renseigner sur le $_SESSION.

Je suis assez débutant en PHP
0
yg_be Messages postés 23258 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 octobre 2024 1 541 > Raven76 Messages postés 250 Date d'inscription samedi 10 avril 2010 Statut Membre Dernière intervention 21 février 2024
10 nov. 2020 à 14:46
es-tu aussi assez débutant en programmation en général?
0
Raven76 Messages postés 250 Date d'inscription samedi 10 avril 2010 Statut Membre Dernière intervention 21 février 2024 15 > yg_be Messages postés 23258 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 octobre 2024
10 nov. 2020 à 15:36
Je faisais beaucoup de VBA avant et depuis peu au php.
0
Raven76 Messages postés 250 Date d'inscription samedi 10 avril 2010 Statut Membre Dernière intervention 21 février 2024 15
Modifié le 10 nov. 2020 à 14:12
Voici mon nouveau code modifié mais ça ne fonctionne toujours pas.

$nb = $_POST['nb'];
$_SESSION['nb']=$nb;
echo "MODE DEBUG : Valeur récupérée : ".$nb; //affiche le nombre de ligne à générer dans la page
if(isset($_POST['formenvoi']))
{
$message= "Valeur récupérée après submit : ".$_SESSION['nb'];
}

----

// avec plus bas mon submit
<input type="submit" formmethod="POST" name="formenvoi" value="ENVOYER"/>


Après avoir cliqué sur le bouton d'envoi, je ne récupère pas ma valeur dans $_SESSION['nb'].

Ais-je mal fait les choses ?
0
jordane45 Messages postés 38252 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 14 octobre 2024 4 692
10 nov. 2020 à 14:20
Bonjour,

Commence par lire ET appliquer ce qui est indiqué ici : https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code (surtout la partie Activation de l'affichage des erreurs ET la récupération PROPRE des variables AVANT de les utiliser)

Ensuite, reviens avec le code modifié et surtout ... le code COMPLET !
0
yg_be Messages postés 23258 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 octobre 2024 1 541
10 nov. 2020 à 14:44
as-tu ajouté session_start()?
commence peut-être avec un exercice plus simple, peut-être avec deux pages qui se partagent une variable de session.
0
Raven76 Messages postés 250 Date d'inscription samedi 10 avril 2010 Statut Membre Dernière intervention 21 février 2024 15
10 nov. 2020 à 15:24
Oui bien sûr j'utilise bien un session_start()
Je l'utilise dans chacune de mes pages grâce à un include au début de mes pages.

Je parviens bien à faire passer mon session ID dans toutes mes pages.

Je bloque simplement sur cette perte de variable après un submit.
Sur les conseils de Jordane45, j'ai activé la gestion des erreurs , débogage et écriture du code.
J'ai également appliqué ce qui est indiqué dans le paragraphe "Récupérer PROPREMENT les variables AVANT de les utiliser".

J'obtiens maintenant un message après le submit :

Notice: Undefined index: nb in /var/www/sda/7/9/blabla.php on line 17


Je ne mets pas tous le code car je sais que le reste est bon.
Je sais que c'est ce que je vous ai remonté qui bloque.
Voici le code un peu plus complet :

<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

session_start();
$serveur='aaa';
$login='bbb';
$mdp='ccc';
$nom_bd='ddd';
try
{
$bdd=new PDO('mysql:host=' . $serveur . ';dbname=' . $nom_bd . ';charset=utf8', $login, $mdp);
} 
catch(Exception $e)
{ 
	die('Erreur : '.$e->getMessage());
}
$_SESSION['nb'] = $_POST['nb'];// <= ici est la ligne 17 dans mon code
$nb = !empty($_SESSION['nb']) ? $_SESSION['nb'] : NULL;
echo "MODE DEBUG : Valeur récupérée : ".$nb; //affiche le nombre de ligne à générer dans la page
$message="Merci demandant à l'utilisateur de bien remplir tous les champs";
if(isset($_POST['formenvoi']))
{
$message= "Valeur récupérée apres submit : ".$nb;
}
?>
--------- partie HTML pour le submit et le $message--------
<p align ="right">
<input type="submit" formmethod="POST" name="formenvoi" value="ENVOYER"/>
</p>													
<table>							
<tr>
<td align="left"><?php echo $message //Affichage du message pour l'utilisateur?></td>
</tr>								
</table>							
0
yg_be Messages postés 23258 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 octobre 2024 1 541
10 nov. 2020 à 15:39
si tu choisis de ne pas nous montrer ton code complet, nous ne pouvons pas deviner où sont tes erreurs.
le message d'erreur est très clair.
as-tu une question?

quand l'utilisateur fait SUBMIT, le code de la page recommence au début. pourquoi mentionnes-tu "perte de variable", alors que les variables ne persistent pas d'une page à l'autre?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Raven76 Messages postés 250 Date d'inscription samedi 10 avril 2010 Statut Membre Dernière intervention 21 février 2024 15
Modifié le 10 nov. 2020 à 16:02
Le truc c'est que je reste sur cette même page, je ne cherche pas en changer (même si je conçois que c'est la même page que je recharge).
Ce que je cherche à faire c'est afficher dans un message la valeur récupérée d'une précédente page ($_POST['nb']) après avoir cliqué sur mon submit.

Je le récupère bien lors du premier chargement de ma page, mais après le Submit, cette valeur disparait. j'ai bien compris que les variables POST se vidaient après un Submit.
Je l'ai mise dans un $_SESSION et c'est pareil, elle disparait.

A mois d'avoir mal écrit cela mais le code nécessaire, je vous l'ai mis.
Avoir le formulaire complet que je tente d'envoyer ne vous servirez à rien.

Ma question est donc comment garder cette valeur même après un submit ?
0
yg_be Messages postés 23258 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 octobre 2024 1 541
10 nov. 2020 à 16:35
c'est toi qui la fait disparaitre de la variable session, en écrivant, tout au début de ta page:
$_SESSION['nb'] = $_POST['nb'];


tu nous le caches, mais je pense que tu as deux façons de rentrer dans cette page, probablement parce que tu as deux submit. et tu ne différencie pas bien ce que doit faire la page en fonction de par quoi elle est appelée.

tu progresseras difficilement en travaillant ainsi sans comprendre, et en faisant corriger tes erreurs pas d'autres.
0
yg_be Messages postés 23258 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 octobre 2024 1 541
10 nov. 2020 à 16:50
nous as-tu montré la form qui te renvoyait "nb"?
0
M3NSONG3 Messages postés 615 Date d'inscription mardi 16 avril 2013 Statut Membre Dernière intervention 4 novembre 2021 162
10 nov. 2020 à 16:03
Sinon moi avant de partir dans des grandes explications de PHP et te sortir des sessions... Tu pourrais juste nous montrer ton code HTML entier ? Je ne vois pas balise fermante de la form.
0
Raven76 Messages postés 250 Date d'inscription samedi 10 avril 2010 Statut Membre Dernière intervention 21 février 2024 15
10 nov. 2020 à 16:37
Voici mon code HTML

Pour info, les lignes 51 à 76 se répètent en fonction de la valeur que je récupère justement d'une autre page avec le code
for ($i=1 ; $i<=$nb ; $i++){ // Boucle pour afficher autant de ligne que renseignée sur la page précédente

Aucun problème pour cela.

Dans mon exemple ci-dessous, j'ai laissé la valeur 1 sinon le code html serait plus grand.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
		<title>TEST</title>
		<meta http-equiv="content-type" content="text/html; charset=windows-1250">
		<link rel="stylesheet" type="text/css" href="../img/style.css">
		<script src="../img/function.js">
		</script> 
	</head>
	<body>
		<div align="center">
			<div align="center">
			<img src="../img/test1.png" alt="">
			<img src="../img/test2.png" alt="">			
			<br/><br/><br/><br/>
			<form method="POST" action="">
				<table id="page" cellpadding="0">
					<tr>
						<td id="hautgauche"></td>
						<td id="haut"></td>
						<td id="hautdroit"></td>
					</tr>
					<tr>
						<td id="gauche"></td>
						<td>
							<fieldset>
MODE DEBUG : Valeur récupérée : 1										<legend>tittre legende</legend></br>
										<table id="table_detail">
											<tr id="tr_detail">
												<td id="td_detail">
													<label for="Colonne1">Nom colonne 1</label>
												</td>											
												<td id="td_detail">
													<label for="Colonne2">Nom colonne 2</label>
												</td>
												<td id="td_detail">
													<label for="Colonne3">Nom colonne 3</label>
												</td>
												<td id="td_detail">
													<label for="Colonne4">Nom colonne 4</label>
												</td>
												<td id="td_detail">
													<label for="Colonne5">Nom colonne 5</label>
												</td>
												<td id="td_detail">
													<label for="Colonne6">Nom colonne 6</label>
												</td>
											</tr>
--- ICI se trouve le code PHP avec les balises qui vont bien pour la répétition du formulaire---
for ($i=1 ; $i<=$nb ; $i++){ // Boucle pour afficher autant de ligne que renseignée sur la page précédente
---
											<tr>
												<td align ="left">
													<input type="date" name="Colonne1_1" value="2020-11-10" min="2020-01-01" max="2037-12-31" required>
												</td>
												<td>
													<SELECT name="Colonne2_1">
														<option disabled selected>Liste déroulante</option>
														<option>Choix1</option><option>Choix2</option>
</SELECT>
												</td>
												<td>
													<input type="text" placeholder="Champ text" id="Colonne3" name="Colonne3_1"/>
												</td>
												<td>
													<textarea style="width:250px" placeholder="Champ text" id="Colonne4" name="Colonne4_1"></textarea>
												</td>
												<td>
													<textarea style="width:250px" placeholder="Champ text" id="Colonne5" name="Colonne5_1"></textarea>
												</td>
												<td>
													<select name="Colonne6_1">
														<option value="NON">NON</option>
														<option value="OUI">OUI</option>
													</select>
												</td>
											</tr>
 										</table>
										</fieldset>
											<p align ="right">
												<input type="submit" formmethod="POST" name="formenvoi" value="ENVOYER"/>
											</p>							
										<table>							
											<tr>
												<td align="left">Merci de bien remplir tous les champs pour l'ensemble de vos demandes !</td>
											</tr>								
										</table>							
										<table>
											<tbody>
												<tr id="fond">
													<td id="lien">
														<a href="accueil.php" id="lien">Retour à l'accueil</a>
													</td>
												</tr>
											</tbody>
										</table>
									</td>
									<td id="droit"></td>
								</tr>
								<tr>
									<td id="basgauche"></td>
									<td id="bas"></td>
									<td id="basdroit"></td>
								</tr>
							</table>
						</form>	
				</div>
			</body>
		</html>


Par contre, c'est l'écriture en base de donnée qui me pose problème puisqu' après avoir cliqué sur mon submit, je dois écrire toutes les lignes de mon formulaire en base.

Pour cela, j'avais écris :

$_SESSION['nb'] = $_POST['nb']; //nb étant la valeur récupérée dans un formulaire de la page précédente
$nb = !empty($_SESSION['nb']) ? $_SESSION['nb'] : NULL;
echo "MODE DEBUG : Valeur récupérée : ".$nb; //affiche le nombre de ligne à générer dans la page
$message="Merci de bien remplir tous les champs pour l'ensemble de vos demandes !";
if(isset($_POST['formenvoi']))
{
for ($i=1 ; $i<=$nb ; $i++)
{
// ici se trouve toutes mes variables a écrire en base ainsi que la commande pour l'écriture en base + le message ci-dessous
$message= "Valeur récupérée après submit : ".$nb;
}

Mais ma boucle for ne fonctionne pas justement parce que je perds la valeur $nb.

En espérant que c'est plus clair pour vous.
0
yg_be Messages postés 23258 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 octobre 2024 1 541 > Raven76 Messages postés 250 Date d'inscription samedi 10 avril 2010 Statut Membre Dernière intervention 21 février 2024
10 nov. 2020 à 16:43
la ligne 1 n'a aucun sens, tu as écrit toi-même que tu avais compris que le POST de la page précédente avait disparu...
comprends-tu que tu effaces ainsi ce que tu avait mémorisé dans la variable session?
0
Raven76 Messages postés 250 Date d'inscription samedi 10 avril 2010 Statut Membre Dernière intervention 21 février 2024 15 > yg_be Messages postés 23258 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 octobre 2024
10 nov. 2020 à 17:14
Lors du premier chargement de la page, je le garde bien, je le perds uniquement lorsque je cliquais sur le submit.
Ma ligne 1 servait justement à mettre mon post dans une variable session mais visiblement je m'y prenais mal.
Jordane45 m'a bien aidé pour le coup.
0