Perte de ma variable $_POST après un Submit [Résolu]

Signaler
Messages postés
231
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
10 novembre 2020
-
Messages postés
13393
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
30 novembre 2020
-
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

Messages postés
30422
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
30 novembre 2020
3 039
<?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;
}
?>

Messages postés
231
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
10 novembre 2020
14
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 ?
Messages postés
13393
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
30 novembre 2020
750 >
Messages postés
231
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
10 novembre 2020

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.
Messages postés
13393
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
30 novembre 2020
750
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.
Messages postés
231
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
10 novembre 2020
14
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
Messages postés
13393
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
30 novembre 2020
750 >
Messages postés
231
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
10 novembre 2020

es-tu aussi assez débutant en programmation en général?
Messages postés
231
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
10 novembre 2020
14 >
Messages postés
13393
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
30 novembre 2020

Je faisais beaucoup de VBA avant et depuis peu au php.
Messages postés
231
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
10 novembre 2020
14
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 ?
Messages postés
30422
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
30 novembre 2020
3 039
Bonjour,

Commence par lire ET appliquer ce qui est indiqué ici : https://www.commentcamarche.net/faq/48399-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 !
Messages postés
13393
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
30 novembre 2020
750
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.
Messages postés
231
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
10 novembre 2020
14
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>							
Messages postés
13393
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
30 novembre 2020
750
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?
Messages postés
231
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
10 novembre 2020
14
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 ?
Messages postés
13393
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
30 novembre 2020
750
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.
Messages postés
13393
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
30 novembre 2020
750
nous as-tu montré la form qui te renvoyait "nb"?
Messages postés
566
Date d'inscription
mardi 16 avril 2013
Statut
Membre
Dernière intervention
28 novembre 2020
116
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.
Messages postés
231
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
10 novembre 2020
14
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.
Messages postés
13393
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
30 novembre 2020
750 >
Messages postés
231
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
10 novembre 2020

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?
Messages postés
231
Date d'inscription
samedi 10 avril 2010
Statut
Membre
Dernière intervention
10 novembre 2020
14 >
Messages postés
13393
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
30 novembre 2020

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.