Page 1 sur 1

doublon à cause de données renvoyées

Posté : 01 mai 2010, 17:23
par bref
Bonjour,
lorsque l'on réactualise une page php qui a reçoit des informations par formulaire d'une autre page, ces informations sont renvoyées. Si ma page utilise ces infos pour ajouter un champs dans une base de données, alors à chaque fois l'entité est dupliquée avec le champs ID incrémenté de 1.
J'aimerais savoir comment il est possible d'éviter ce problème ?

Merci d'avance.

Re: doublon à cause de données renvoyées

Posté : 01 mai 2010, 17:30
par Dr@ke
Il existe plusieurs moyens comme par exemple la redirection:
http://www.commentcamarche.net/faq/878- ... edirection

De cette façon, l'utilisateur une fois redirigé vers une autre page avec la fonction header(), les données du formulaire sont perdues.

PS: tu peux même rediriger sur la même page si cela t'arrange :wink:

Re: doublon à cause de données renvoyées

Posté : 01 mai 2010, 17:40
par bref
Si je redirige de cette façon, les scripts de la page seront bien exécutés ? Donc j'ajoute mon enregistrement et je vais sur une autre page ? Ou il faut procéder d'une manière particulière ?

Re: doublon à cause de données renvoyées

Posté : 01 mai 2010, 17:47
par Dr@ke
Eh bien test, tu veras :wink:

Re: doublon à cause de données renvoyées

Posté : 01 mai 2010, 18:46
par bref
Ah, je sais pas comment j'ai fait mais j'avais pas lu ça:
De cette façon, l'utilisateur une fois redirigé vers une autre page avec la fonction header(), les données du formulaire sont perdues.
Bon ben y a plus qu'à tester :)
Merci

Re: doublon à cause de données renvoyées

Posté : 01 mai 2010, 23:54
par bref
Hmm, comment faire si le formulaire renvoi sur la même page ?
Si je traite le formulaire et une redirection dans la foulée, je ne peux plus confirmer le traitement du formulaire.
Et je ne peux pas faire un truc du genre
if($_SERVER['HTTP_REFERER'] == page1.php) { 
header('Location: page2.php');
exit(); }
J'ai pas trop d'idée pour l'instant :(

Re: doublon à cause de données renvoyées

Posté : 02 mai 2010, 12:58
par Dr@ke
Post tes scripts formulaire html et php

Re: doublon à cause de données renvoyées

Posté : 02 mai 2010, 16:37
par bref
J'ai neuf pages avec au moins autant de formulaires, enfin voici un exemple:
<form method="post" action="Administration.php">
<h2>Ajouter un produit:</h2>
nom du produit:<input type="text" name="nom"/><br/>
rubrique:<select name="rubrique">
<option value="alimentation">Alimentation</option>
<option value="cuisine">Cuisine</option>
<option value="jouets">Jouets</option>
</select><br/>
description du produit:<textarea name="description"></textarea><br/>
<input type="hidden" name="password" value="motdepasse" />
<input type="submit" name="add" value="Valider"/>
</form>
if(isset($_POST['add']))
{
	$result = mysqli_query($link, "INSERT INTO produit (nom, rubrique, description) VALUES ('".$_POST['nom']."','".$_POST['rubrique']."', '".$_POST['description']."') ") or trigger_error('requete invalide', E_USER_ERROR);	
	if($result)
	{
		echo '"'.$_POST['nom'].'" a &eacute;t&eacute; ajout&eacute; au catalogue.<br/>';
	}				
}
Le formulaire et le script étant sur la page Administration.php

Re: doublon à cause de données renvoyées

Posté : 03 mai 2010, 13:14
par Dr@ke
Ce n'est pas forcément simple a mettre en place.

Pour la redirection, tu peux regarder un tutoriel sur la temporisation de sortie:
http://www.siteduzero.com/tutoriel-3-38 ... n-php.html

Sinon, regarde ici:
http://www.developpez.net/forums/d10478 ... s-refresh/

Re: doublon à cause de données renvoyées

Posté : 03 mai 2010, 14:51
par bref
Merci.
La solution avec variable de session me parait assez simple même si elle m'oblige à rajouter des lignes partout.
Je crois aussi que je vais me mettre au JS, ça a l'air pratique dans bien des cas :)

Re: doublon à cause de données renvoyées

Posté : 03 mai 2010, 15:47
par AB
Hmm, comment faire si le formulaire renvoi sur la même page ?
Si je traite le formulaire et une redirection dans la foulée, je ne peux plus confirmer le traitement du formulaire.
Mais si tu peux !... en renvoyant une variable dans ton header.
if ($_POST['formulaire'])
{
if ($traitement de formulaire == 'ok') {$mes = 1;} else {$mes = 2;}
header("Location: page2.php?mes=$mes");
exit(); }
}

$message = null;
if (isset($_GET['mes'])) 
{
  switch($_GET['mes'])
   {
    case "1" : $message = 'Traitement ok';break;
    case "2" : $message = 'Traitement NON ok';break;
   }
}

if (isset($message)) echo $message;

Re: doublon à cause de données renvoyées

Posté : 03 mai 2010, 17:27
par bref
C'est tout bête, je n'y avais pas pensé :D

Re: doublon à cause de données renvoyées

Posté : 03 mai 2010, 17:39
par Dr@ke
Il faut juste faire attention de ne rien envoyé avant ta redirection, donc soit mettre la redirection au début de ton script, soit utiliser le tutoriel de Temporisation de sortie que je t'ai conseillé.
Donc adapter ton script.

Ensuite il faut trouver une solution pour faire la différence entre le simple affichage de la page, le post du formulaire, et l'affichage de la page après la redirection.
Pour pouvoir les traiter différemment.
Le Post d'AB en est un exemple.

Dans tous les cas, la fonction isset(), sera bien pratique :)

Re: doublon à cause de données renvoyées

Posté : 04 mai 2010, 00:05
par AB
Il faut juste faire attention de ne rien envoyé avant ta redirection, donc soit mettre la redirection au début de ton script...
Ben ça peut prêter à confusion... La redirection tu la mets bien ou tu veux tant que tu n'as rien fait afficher avant.
Et comme dans un code normalement structuré on sépare le plus possible le code php (en haut du script) de l'affichage (en bas du script), il peut bien y avoir plusieurs centaines ou milliers de lignes de code php dans lesquelles tu peux faire des redirections avec un headers.

Donc je veux dire qu'il faut (sauf à employer un buffer comme tu le dis plus loin) les mettre avant de faire afficher quoi que ce soit, mais ce n'est pas nécessairement au début du script.

Re: doublon à cause de données renvoyées

Posté : 04 mai 2010, 00:11
par Dr@ke
Ben oui évidemment c'est logique. C'est exactement ce que je disais.
Mais les erreurs de headers sont courantes et donc c'était un point important à souligner.