Garder les valeurs des POST d'une page [edit du sujet]

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Garder les valeurs des POST d'une page [edit du sujet]

par dread » 15 sept. 2007, 21:11

Comme ca fait un moment que j'ai envoyé le dernier post, je me permet de me répondre!

A défaut d'avoir réussi à faire ce que je voulais, j'ai opter pour une solution qui ne me satisfait qu'à moitié.

Je reviens donc vers vous en espérant peut-être avoir plus de précision.

Pour le rappel de la situation:

J'ai une page composé de deux blocs. Celui de gauche contient un formulaire de recherche multicritère genre type d'habitation, nombre de pièces, budget, ville. Le bouton de type submit qui valide le formulaire permet de générer le contenu du bloc de droite, à savoir la liste des biens immobiliers correspondant à la recherche exécutée précedemment.

Mon problème intervient lorsque je souhaite avoir plus d'information sur un bien se trouvant dans la liste et que je suis envoyé sur la page contenant ses informations. En effet, au retour sur la page de la liste, les critères qui avaient été selectionnés dans le formulaire et qui avaient générés la liste des biens ne restent pas et du coup, la liste des biens n'est plus celle correspondant à ma recherche initiale. Je trouve ca particulièrement gênant de devoir refaire la même recherche à chaque fois que je reviens sur la page.

Afin de sauvegarder les données de ma recherche, je souhaitais utiliser les sessions. Le problème, c'est que je n'arrive pas à bien les utiliser puisque comme je le dis dans mon dernier post, soit les données sont sauvegardées mais je n'arrive plus à les modifier dans le formulaire de recherche, soit les données ne sont pas retenues mais du coup le formulaire fonctionne.

A l'heure actuelle, j'ai abandonné l'idée d'utiliser les sessions et lorsque je souhaite avoir plus d'informations sur un bien, la page les contenant est ouverte via un lien avec un target="_blank".
Mais cette solution ne me convient pas vraiment pour diverses raisons.

En espérant avoir été plus précis concernant mon problème, merci pour toute aide apportée.

par dread » 10 sept. 2007, 16:19

Quand tu décoches une checkbox, est ce que cela envoi une donnée.

Sinon, j'ai beau tenter diverses syntaxes, a chaque fois j'en reviens au même:
- soit je peux changer la valeur de la session en cochant / décochant une checkbox mais par contres je change de page et que je revient ou si j'effectue un tri, la valeur est perdu;
- soit mes données restent en session quoique je fasse mais impossible de décocher la checkbox et de modifier la valeur en session.

N'y a t'il pas de juste milieu dans l'univers des sessions couplées au checkbox??

Je vais creusé du côté de la solution que tu énonces Ryle.

EDIT:

je viens de faire un echo de count($_post) et si tu décoche une checkbox, ca renvoi comme valeur 0. Si je quitte la page et que je reviens, j'ai comme valeur 0.
Donc impossible de différencier le décochage de la perte de la valeur en quittant la page!!

Je commence à douter de la possibilité à garder mes POST en session.

Sinon, pour info, quand je suis sur une autre page et que je fais "précédente", un message apparait comme quoi "la page que je tente de voir contient des données envoyées par POST qui ne sont plus dans le cache..." et si je fais ok, il retrouve mes POST.

Par contre, si je reviens sur la page via le lien retour que j'ai fais, il ne met pas de message et je perds la valeur de mes POST.

par Ryle » 10 sept. 2007, 16:02

Ce qui est bizare c'est qu'il ne te garde pas la données en session..

En ce qui concerne la case à cocher, si elle n'est pas cochée elle n'est pas envoyée, donc pas dans $_POST, mais comme elle était en session tu gardes la valeur "cochée".

En fait, pour gérer les cases à cocher, ton test ne devrait pas se faire juste sur la présence de la variable, mais également sur la vérification que des données ont été envoyées en post, par ex : if (count($_POST) > 0)

par dread » 10 sept. 2007, 14:31

J'avais déjà essayer quelques possibilités comme celle-ci pour le POST de maison par exemple et garder sa valeur:
if ((isset($_POST['maison'])) || ($_POST['maison'] != $_SESSION['maison']))  {
	$maison = $_POST['maison'];
} elseif (isset($_SESSION['maison'])) {
	$maison = $_SESSION['maison'];
}
$_SESSION['maison'] = $maison;

echo $maison.'<br/>';
echo $_POST['maison'].'<br/>';
//Prise en compte du type de biens
if (($maison == 1) && (isset($_POST['appart'])) && (isset($_POST['terrain']))) {
	$type = " AND type_bien <= 3 ";
} elseif (($maison == 1) && (isset($_POST['appart']))) {
	$type = " AND type_bien <= 2 ";
} elseif (($maison == 1) && (isset($_POST['terrain']))) {
	$type = " AND (type_bien = 1 OR type_bien = 3) ";
} elseif ((isset($_POST['appart'])) && (isset($_POST['terrain']))) {
	$type = " AND type_bien >= 2 ";
} elseif ($maison == 1) {
	$type = " AND type_bien = 1 ";
} elseif (isset($_POST['appart'])) {
	$type = " AND type_bien = 2 ";
} elseif (isset($_POST['terrain'])) {
	$type = " AND type_bien = 3 ";
}
Le problème restait le même, cad que si je clique sur un des liens pour effectuer un tri, ma session disparait et idem si je clique sur le lien d'un résultat pour avoir plus d'infos et que retourne ensuite sur ma page.

De plus, si je repart sur le modèle que j'utilise pour le $tri, quand je coche ma checkbox de post maison, la valeur se met bien en session mais si je la décoche, elle garde la même valeur, ce qui n'est pas bon quand on veut modifier les critères de recherche.

Je dois me tromper de piste certainement.

Alors quelle technique adopter?

par Ryle » 10 sept. 2007, 12:42

bon bon, j'ai comrpis, tu veux utiliser des sessions, on va faire avec des sessions ;)

Sur le principe, ce que tu a fait avec $tri est bon. Si la données est envoyée par post ou get, tu l'utilises, sinon tu regardes si elle est en session. Sachant que tu peux très bien coller directement tout ton tableau $_POST en session :)

par dread » 10 sept. 2007, 11:35

Le problème c'est que les URL à rallonge, c'est pas très bon, non?
Il y a quand même pas mal de critères entre le type de bien, le nombre de pièce, le budget, la ville, si on prend en compte les villes proches, plus le tri.
J'évite en général d'allourdir l'URL.

N'y a t-il pas une autre solution?

par Ryle » 10 sept. 2007, 11:26

Oki, alors en ce cas, le plus simple c'est de passer (si possible) les critères de ta recherche dans l'url (en GET donc). Ainsi lorsque l'utilisateur fait précédent ou revient sur la page, les données de l'url sont récupérées et la page reconstruite avec ces critères :)

par dread » 10 sept. 2007, 10:57

Merci pour ta réponse Ryle!

Sur la page qui affiche les résultats suite à la recherche préalable, une personne intéressée par l'un de ces résultats peut être redirigée vers une autre page ayant plus d'information sur ce résultat (dans mon cas: plus d'info sur un bien immobilier). Par contre, je souhaiterais que si cette personne fait "précédent" ou utilise le bouton de retour vers la page des résultats, qu'elle retombe bien sur la même page qu'elle avait quitté, i.e. avec les mêmes résultats et le même critère de tri si elle en avait utilisé un.

Est-ce que la technique des champs hidden pourra convenir aussi dans ce cas??

Si oui, alors je veux bien que tu m'en dises un peu plus sur sa mise en place, stp.

Et concernant ma requête sur le nombre de pièce qui effectivement n'est pas optimisée, je vais m'aider de ce que tu m'as proposé pour l'améliorer.

par Ryle » 10 sept. 2007, 10:23

Et pourquoi ne pas simplement passer les données que tu souhaites conserver entre deux recherches en champ hidden et les soumettre avec le formulaire ?

Sinon, plutôt que ta tonne de elseif pour le nombre de pièce, pourquoi ne pas faire un IN (...) en spécifiant les nombres de pièces sélectionnés ?
Genre nommer toutes tes cases "nb_piece[]", récupérer le tableau $_POST['nb_piece'] et s'il est défini (donc au moins une case de cochée) tu fais un implode(',', $_POST['nb_piece']) pour générer la liste des "nombres de pièces" séparés par des virgules, à utiliser directement dans le IN :)

Garder les valeurs des POST d'une page [edit du sujet]

par dread » 10 sept. 2007, 09:28

Bonjour à tout le monde!

Je reviens vers vous avec une demande d'aide concernant l'utilisation des sessions.

J'ai un formulaire de recherche multicritère type agence immobilière qui renvoit vers une page de résultat. Sur cette page de résultat, on retrouve le même formulaire de recherche pour que les internautes puissent éventuellement modifier certains paramètres de la recherche initiale. On retrouve aussi deux liens permettant de trier les résultats de la recherche par nom de ville ou par budget.

La recherche fonctionne très bien, tous mes critères peuvent être changé sans problème.

Le hic intervient suite à une recherche, lorsque l'on souhaite trier les résultats par ville ou budget. Toutes les données de la recherche et donc les valeurs des POST sont effacées et le tri s'effectue alors sur l'ensemble des résultats de ma bd et non plus sur ceux de la recherche.

Je sais que l'utilisation des sessions me permettrait de garder mes valeurs de POST mais j'avoue avoir un peu de mal à le mettre pratique dans mon exemple.

Voici le code de ma requête de recherche:
session_start();

// mise en session de la valeur du tri
if (isset($_GET['tri'])) {  
  $tri = $_GET['tri'];  
} elseif (isset($_SESSION['tri'])) { 
    $tri = $_SESSION['tri'];  
} else {
	$tri = 'id_bien';
}

$_SESSION['tri'] = $tri; 

//Prise en compte du type de biens
if ((isset($_POST['maison'])) && (isset($_POST['appart'])) && (isset($_POST['terrain']))) {
	$type = " AND type_bien <= 3 ";
} elseif ((isset($_POST['maison'])) && (isset($_POST['appart']))) {
	$type = " AND type_bien <= 2 ";
} elseif ((isset($_POST['maison'])) && (isset($_POST['terrain']))) {
	$type = " AND (type_bien = 1 OR type_bien = 3) ";
} elseif ((isset($_POST['appart'])) && (isset($_POST['terrain']))) {
	$type = " AND type_bien >= 2 ";
} elseif (isset($_POST['maison'])) {
	$type = " AND type_bien = 1 ";
} elseif (isset($_POST['appart'])) {
	$type = " AND type_bien = 2 ";
} elseif (isset($_POST['terrain'])) {
	$type = " AND type_bien = 3 ";
}


//Prise en compte du nombre de pièces
if ((isset($_POST['1p'])) && (isset($_POST['2p'])) && (isset($_POST['3p'])) && (isset($_POST['4p'])) && (isset($_POST['5p']))) {
	$piece = " AND nb_piece <= 1 ";
} elseif ((isset($_POST['1p'])) && (isset($_POST['2p'])) && (isset($_POST['3p'])) && (isset($_POST['4p']))) {
	$piece = " AND nb_piece <= 4 ";
} elseif ((isset($_POST['1p'])) && (isset($_POST['2p'])) && (isset($_POST['4p'])) && (isset($_POST['5p']))) {
	$piece = " AND (nb_piece <= 2 OR nb_piece >= 4) ";
} elseif ((isset($_POST['1p'])) && (isset($_POST['2p'])) && (isset($_POST['3p'])) && (isset($_POST['5p']))) {
	$piece = " AND (nb_piece <= 3 OR nb_piece >= 5) ";
} elseif ((isset($_POST['1p'])) && (isset($_POST['3p'])) && (isset($_POST['4p'])) && (isset($_POST['5p']))) {
	$piece = " AND (nb_piece = 1 OR nb_piece >= 3) ";
} elseif ((isset($_POST['2p'])) && (isset($_POST['3p'])) && (isset($_POST['4p'])) && (isset($_POST['5p']))) {
	$piece = " AND nb_piece >= 2 ";
} elseif ((isset($_POST['1p'])) && (isset($_POST['2p'])) && (isset($_POST['3p']))) {
	$piece = " AND nb_piece <= 3 ";
} elseif ((isset($_POST['1p'])) && (isset($_POST['2p'])) && (isset($_POST['4p']))) {
	$piece = " AND (nb_piece <= 2 OR nb_piece = 4) ";
} elseif ((isset($_POST['1p'])) && (isset($_POST['2p'])) && (isset($_POST['5p']))) {
	$piece = " AND (nb_piece <= 2 OR nb_piece >= 5) ";
} elseif ((isset($_POST['1p'])) && (isset($_POST['3p'])) && (isset($_POST['4p']))) {
	$piece = " AND (nb_piece = 1 OR nb_piece = 3 OR nb_piece = 4) ";
} elseif ((isset($_POST['1p'])) && (isset($_POST['3p'])) && (isset($_POST['5p']))) {
	$piece = " AND (nb_piece = 1 OR nb_piece = 3 OR nb_piece >= 5) ";	
} elseif ((isset($_POST['1p'])) && (isset($_POST['4p'])) && (isset($_POST['5p']))) {
	$piece = " AND (nb_piece = 1 OR nb_piece >= 4) ";	
} elseif ((isset($_POST['2p'])) && (isset($_POST['3p'])) && (isset($_POST['4p']))) {
	$piece = " AND (nb_piece = 2 OR nb_piece = 3 OR nb_piece = 4) ";	
} elseif ((isset($_POST['2p'])) && (isset($_POST['4p'])) && (isset($_POST['5p']))) {
	$piece = " AND (nb_piece = 2 OR nb_piece >= 4) ";	
} elseif ((isset($_POST['2p'])) && (isset($_POST['3p'])) && (isset($_POST['5p']))) {
	$piece = " AND (nb_piece = 2 OR nb_piece = 3 OR nb_piece >= 5) ";
} elseif ((isset($_POST['3p'])) && (isset($_POST['4p'])) && (isset($_POST['5p']))) {
	$piece = " AND nb_piece >= 3 ";
} elseif ((isset($_POST['1p'])) && (isset($_POST['2p']))) {
	$piece = " AND nb_piece <= 2 ";
} elseif ((isset($_POST['1p'])) && (isset($_POST['3p']))) {
	$piece = " AND (nb_piece = 1 OR nb_piece = 3) ";
} elseif ((isset($_POST['1p'])) && (isset($_POST['4p']))) {
	$piece = " AND (nb_piece = 1 OR nb_piece = 4) ";
} elseif ((isset($_POST['1p'])) && (isset($_POST['5p']))) {
	$piece = " AND (nb_piece = 1 OR nb_piece >= 5) ";
} elseif ((isset($_POST['2p'])) && (isset($_POST['3p']))) {
	$piece = " AND (nb_piece = 2 OR nb_piece = 3) ";
} elseif ((isset($_POST['2p'])) && (isset($_POST['4p']))) {
	$piece = " AND (nb_piece = 2 OR nb_piece = 4) ";
} elseif ((isset($_POST['2p'])) && (isset($_POST['5p']))) {
	$piece = " AND (nb_piece = 2 OR nb_piece >= 5) ";
} elseif ((isset($_POST['3p'])) && (isset($_POST['4p']))) {
	$piece = " AND (nb_piece = 3 OR nb_piece = 4) ";
} elseif ((isset($_POST['3p'])) && (isset($_POST['5p']))) {
	$piece = " AND (nb_piece = 3 OR nb_piece >= 5) ";
} elseif ((isset($_POST['4p'])) && (isset($_POST['5p']))) {
	$piece = " AND nb_piece >= 4 ";
} elseif (isset($_POST['1p'])) {
	$piece = " AND nb_piece = 1 ";
} elseif (isset($_POST['2p'])) {
	$piece = " AND nb_piece = 2 ";
} elseif (isset($_POST['3p'])) {
	$piece = " AND nb_piece = 3 ";
} elseif (isset($_POST['4p'])) {
	$piece = " AND nb_piece = 4 ";
} elseif (isset($_POST['5p'])) {
	$piece = " AND nb_piece >= 5 ";
}


// Prise en compte du budget
if (($_POST['maxi']) == '1000000+') {
	if (isset($_POST['mini'])) {
		$budget = " AND prix_bien >=".$_POST['mini'];
	}
} else {
	if ((isset($_POST['mini'])) && (isset($_POST['maxi']))) {
		$budget = " AND prix_bien >=".$_POST['mini']." AND prix_bien <=".$_POST['maxi'];
	} elseif (isset($_POST['mini'])) {
		$budget = " AND prix_bien >=".$_POST['mini'];
	} elseif (isset($_POST['maxi'])) {
		$budget = " AND prix_bien <=".$_POST['maxi'];
	}	
}	


// prise en compte de la ville
if (isset($_POST['ville_proche'])) {

	if ((isset($_POST['ville'])) && ($_POST['ville'] != 'toutes')) {
	
	// sélection des villes proches de la ville choisie
	$query_rs_ville_proche = "SELECT ville_bien, ville_proche1, ville_proche2, ville_proche3, ville_proche4, ville_proche5 FROM tbl_bien WHERE ville_bien='".$_POST['ville']."'";
	$rs_ville_proche = mysql_query($query_rs_ville_proche, $conn_rocher) or die(mysql_error());
	$row_rs_ville_proche = mysql_fetch_assoc($rs_ville_proche);

		$ville = " AND (ville_bien = ".$_POST['ville']." OR ville_bien = ".$row_rs_ville_proche['ville_proche1']." OR ville_bien = ".$row_rs_ville_proche['ville_proche2']." 
OR ville_bien = ".$row_rs_ville_proche['ville_proche3']." OR ville_bien = ".$row_rs_ville_proche['ville_proche4']." OR ville_bien = ".$row_rs_ville_proche['ville_proche5'].") ";
	}
} else {
	if ((isset($_POST['ville'])) && ($_POST['ville'] != 'toutes')) {
		$ville = " AND ville_bien = '".$_POST['ville']."'";
	}
}

//requête générant les résultats en fonction des critères de recherche
$query_rs_resultat = "SELECT * FROM tbl_bien, tbl_ville WHERE tbl_bien.ville_bien=tbl_ville.id_ville ".$type.$piece.$budget.$ville." ORDER BY ".$tri." ASC";
$rs_resultat = mysql_query($query_rs_resultat, $conn_rocher) or die(mysql_error()); 
Je ne sais pas si la solution serait de garder en session le résultat de ma recherche ou les valeurs des POST envoyées après la recherche.

Ce serait sympa de m'aiguiller un peu parce que là je patauge un peu.

Merci par avance.