doublon à cause de données renvoyées

bref
Invité n'ayant pas de compte PHPfrance

01 mai 2010, 17:23

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.

Mammouth du PHP | 985 Messages

01 mai 2010, 17:30

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:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

bref
Invité n'ayant pas de compte PHPfrance

01 mai 2010, 17:40

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 ?

Mammouth du PHP | 985 Messages

01 mai 2010, 17:47

Eh bien test, tu veras :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

bref
Invité n'ayant pas de compte PHPfrance

01 mai 2010, 18:46

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

bref
Invité n'ayant pas de compte PHPfrance

01 mai 2010, 23:54

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 :(

Mammouth du PHP | 985 Messages

02 mai 2010, 12:58

Post tes scripts formulaire html et php
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

bref
Invité n'ayant pas de compte PHPfrance

02 mai 2010, 16:37

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

Mammouth du PHP | 985 Messages

03 mai 2010, 13:14

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/
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

bref
Invité n'ayant pas de compte PHPfrance

03 mai 2010, 14:51

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 :)

ViPHP
AB
ViPHP | 5818 Messages

03 mai 2010, 15:47

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;

bref
Invité n'ayant pas de compte PHPfrance

03 mai 2010, 17:27

C'est tout bête, je n'y avais pas pensé :D

Mammouth du PHP | 985 Messages

03 mai 2010, 17:39

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 :)
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
AB
ViPHP | 5818 Messages

04 mai 2010, 00:05

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.

Mammouth du PHP | 985 Messages

04 mai 2010, 00:11

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.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.