Requête à partir de plusieurs listes déroulante

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 : Requête à partir de plusieurs listes déroulante

par spirit » 20 mai 2008, 07:08

Bonjour FredoMkb,
désolé de ne pas répondre plus tôt mais après avoir passé le we làdessus il fallait que je pose un peut !!!
j'ai bien repris ton code, et j'avais en fait deux erreur la session qui était ouverte au mauvais endroi je pense (je l'avais mis tout en début de code de ma page principal (pas dans la page include) et il me manqué name="choix" dans le bouton d'envoi :oops: . Peut être il y avais autre chose car j'ai repris le code le plus simple que j'ai compliqué étape pour étape.
j'y suis presque, il me reste encore une erreur quant j' envoi une valeur qui ne se trouve pas dans ma table ( par exemple id_budget=99 alors que dans "mtbl" cette valeur n'est pas présente) j'y regarde aujourd'hui.
PS: le fichier zip ma grandement aidé, merci.

par FredoMkb » 17 mai 2008, 12:05

Bonjour Spirit :)
Bonjour FredoMkb, pour le test j'ai simplifié au maximum le code de ma page:
Oui, c'est bien, mais, justement, du coup il est bien difficile de voir si le problème vient exactement du code que nous avons imaginé ensemble ou si, au contraire, il y a quelque chose quelque part ailleurs dans ta page qui produit ce dysfonctionnement...

Bon, je ne dis pas de publier ici la totalité du code de ta page (ça peut être bien long et pas tout n'est forcément pertinent pour la question qui nous occupe), mais au moins les parties directement concernées avec le traitement que nous tentons de réaliser...

Mais quant on revois url de la page: [...] la session reviens vide. :shock:
Bon, là c'est en effet bien bizarre car, normalement, même si aucune autre information n'est envoyée par le formulaire, au moins la session devrait, elle, avoir en mémoire les valeurs de la dernière requête... et elle devraient être récupérables même en rechargeant simplement la page...

Bon, tentons de voir tout ça depuis le début...

Voici donc un formulaire Html très basique, basé sur les infos que tu sembles utiliser :
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
	<fieldset><legend>Votre Choix</legend>
	<select name="id_budget" id="id_budget">
		<option value="0" selected="selected">Choisissez un Budget</option>
		<option value="budget01">Budget 01</option>
		<option value="budget02">Budget 02</option>
		<option value="budget03">Budget 03</option>
	</select>
	<span>&nbsp;</span>
	<select name="id_secteur" id="id_secteur">
		<option value="0" selected="selected">Choisissez un Secteur</option>
		<option value="secteur01">Secteur 01</option>
		<option value="secteur02">Secteur 02</option>
		<option value="secteur03">Secteur 03</option>
	</select>
	<span>&nbsp;</span>
	<select name="id_type" id="id_type">
		<option value="0" selected="selected">Choisissez un Type</option>
		<option value="type01">Type 01</option>
		<option value="type02">Type 02</option>
		<option value="type03">Type 03</option>
	</select>
	<span>&nbsp;</span>
	<input type="submit" name="choix" value="Valider" />
	</fieldset>
</form>
Bon, pas grand chose à dire, c'est assez simple et clair j'espère...

Voici maintenant le code Php que j'ai placé avant la toute première balise Html de la page, et qui fait tout le travail de récupération des valeurs du formulaire, la construction de la requête et la mémorisation de la session :
<?php
// On efface la session pour pouvoir recommencer
if (isset($_GET['reset']) && $_GET['reset']) { 
	session_start(); 
	session_unset();  
	session_destroy();
}

// Valeurs initiales
$budget = "0";
$secteur = "0";
$type = "0";
$query_text = ''; 

// On recupere les valeurs issues du formulaire
if (isset($_POST['choix']) && !empty($_POST['choix'])) {
	$budget = $_POST['id_budget'];
	$secteur = $_POST['id_secteur'];
	$type = $_POST['id_type'];
}

// On demarre la session
session_start(); 

// Si une session "query_text" existe et qu'elle n'est pas vide, on recupere sa valeur,  
if(isset($_SESSION['query_text']) && !empty($_SESSION['query_text'])) {   
	$query_text = $_SESSION['query_text'] ;   

} else {   
	// Sinon, construction de la liste des query valides  
	$query_list = array();   
	if ($budget != "0") {$query_list[] = "id_budget = '".$budget."'";}   
	if ($secteur != "0") {$query_list[] = "id_secteur = '".$secteur."'";}   
	if ($type != "0") {$query_list[] = "id_type = '".$type."'";}   

	// Si la liste n'est pas vide on utilise ses valeurs 
	 if (!empty($query_list)) { $query_text = implode(" AND ", $query_list); } 
}  

// Si la variable "$query_text" n'est pas vide, alors on lance la requete 
if (!empty($query_text)) { 
	$_SESSION['query_text'] = $query_text; 
	$sql_result = "SELECT * FROM matbl WHERE ".$query_text; 
	
	// ... la suite du code ...
}

// ... le reste du code ...
?>
Bon, ce code, en l'état, n'a pas grande utilité, mais son fonctionnement correspond exactement à ce que tu cherches (il me semble du moins 8-) )... puisqu'il conserve en session les valeurs de la dernière requête construite, même lorsqu'on recharge simplement la page...

Voilà... si tu veux tester son fonctionnement, voici un formulaire de test, et si tu veux voir le code en entier, voici le même formulaire au format ".zip"...

J'espère que ceci pourra t'aider à y voir plus clair, et n'hésites pas à regarder attentivement le reste du code de ta page, le problème peut se trouver ailleurs que là où on test pour le moment...

Courage... à+ :)

par spirit » 17 mai 2008, 08:30

Bonjour FredoMkb, pour le test j'ai simplifié au maximum le code de ma page:
<?php
session_start();
$query_text = '';
// Si une session "query_text" existe et qu'elle n'est pas vide, on recupere sa valeur, 
if(isset($_SESSION['query_text']) && !empty($_SESSION['query_text'])) {  
    $query_text = $_SESSION['query_text'] ;  
} else {  
    // Sinon, construction de la liste des query valides 
    $query_list = array();  
    if ($budget != "0") {$query_list[] = "id_budget = '".$budget."'";}  
    if ($secteur != "0") {$query_list[] = "id_secteur = '".$secteur."'";}  
    if ($type != "0") {$query_list[] = "id_type = '".$type."'";}  

    // Si la liste n'est pas vide on utilise ses valeurs
    if (!empty($query_list)) { $query_text = implode(" AND ", $query_list); }
} 
// Si la variable "$query_text" n'est pas vide, alors on lance la requete
if (!empty($query_text)) {
    $_SESSION['query_text'] = $query_text;
    $sql_result = "SELECT * FROM matbl WHERE ".$query_text;  
} 
echo $query_text.'<br>' ;
echo $sql_result.'<br>' ;
if(isset($_SESSION['query_text']) && !empty($_SESSION['query_text'])) {  
echo 'La session existe et vaut: ' . $_SESSION['query_text'];

echo '<br>';
print_r($_SESSION['query_text']);
echo '<br>';
}
else { echo 'Pas de session' ; }
?>
le message d'erreur était celui de l'affichage page par page qui masqué la source réelle de l'erreur.
quant on envois les données l'affichage est bon dans tout les cas c'est à dire:
1/ on envoi rien : pas d'affichage et message: pas de session.
2/ on selectionne un choix, on affiche bien :

Code : Tout sélectionner

id_type = '1' SELECT * FROM matbl WHERE id_type = '1' La session existe et vaut: id_type = '1' id_type = '1'
par exemple.
Mais quant on revois url de la page:

Code : Tout sélectionner

id_budget = '' AND id_secteur = '' AND id_type = '' SELECT * FROM matbl WHERE id_budget = '' AND id_secteur = '' AND id_type = '' La session existe et vaut: id_budget = '' AND id_secteur = '' AND id_type = '' id_budget = '' AND id_secteur = '' AND id_type = ''
la session reviens vide.
:shock:

par FredoMkb » 16 mai 2008, 15:03

Bonjour Spirit :)
J'ai refait des tests avec les dernière solution de FredoMkb quant je sélectionne rien ou une sélection par exemple j'ai un résultat qui s'affiche, mais quant je la recharge je suis en erreur (le variable de session est nul) dans les deux cas.
Mmm... fausse manip ? :shock: ... j'ai l'impression que tu as reproduit deux fois le même code dans ton message...

La dernière version retouchée est la suivante :
<?php 
$query_text = '';
// Si une session "query_text" existe et qu'elle n'est pas vide, on recupere sa valeur, 
if(isset($_SESSION['query_text']) && !empty($_SESSION['query_text'])) {  
	$query_text = $_SESSION['query_text'] ;  

} else {  
	// Sinon, construction de la liste des query valides 
	$query_list = array();  
	if ($budget != "0") {$query_list[] = "id_budget = '".$budget."'";}  
	if ($secteur != "0") {$query_list[] = "id_secteur = '".$secteur."'";}  
	if ($type != "0") {$query_list[] = "id_type = '".$type."'";}  

	// Si la liste n'est pas vide on utilise ses valeurs
	if (!empty($query_list)) { 
		$query_text = implode(" AND ", $query_list); 
		$_SESSION['query_text'] = $query_text; 
	}
} 
// Si la variable "$query_text" n'est pas vide, alors on lance la requete
if (!empty($query_text)) {
	$sql_result = "SELECT * FROM matble WHERE ".$query_text;  
	/* La suite du code ... */ 
}
?>
J'avais édité mon message précédent pour ajouter cette proposition...

Maintenant, ce que je ne pige pas bien, c'est que tu dis que lorsque tu recharges la page web, tu obtiens un message d'erreur signalant que la variable de session "query_text" est nulle, c'est ça ? :shock:

Peux-tu publier ici le message d'erreur exact que tu obtiens, peut-être que le souci vient d'ailleurs... à voir... en tout cas, avec les infos que j'ai pour le moment, je ne vois pas pourquoi cette dernière proposition ne fonctionnerait pas... à moins que quelque chose d'évident m'échappe :? ... ce qui est aussi fort probable :(

Tiens-nous au courant Stp... à+ :)

[Edit]
Petite modif de dernière minute, la dernière proposition est donc la suivante :
<?php 
$query_text = '';
// Si une session "query_text" existe et qu'elle n'est pas vide, on recupere sa valeur, 
if(isset($_SESSION['query_text']) && !empty($_SESSION['query_text'])) {  
	$query_text = $_SESSION['query_text'] ;  

} else {  
	// Sinon, construction de la liste des query valides 
	$query_list = array();  
	if ($budget != "0") {$query_list[] = "id_budget = '".$budget."'";}  
	if ($secteur != "0") {$query_list[] = "id_secteur = '".$secteur."'";}  
	if ($type != "0") {$query_list[] = "id_type = '".$type."'";}  

	// Si la liste n'est pas vide on utilise ses valeurs
	if (!empty($query_list)) { $query_text = implode(" AND ", $query_list); }
} 
// Si la variable "$query_text" n'est pas vide, alors on lance la requete
if (!empty($query_text)) {
	$_SESSION['query_text'] = $query_text;
	$sql_result = "SELECT * FROM matble WHERE ".$query_text;  
	/* La suite du code ... */ 
}
?>
[/Edit]

;)

par spirit » 16 mai 2008, 14:30

J'ai refait des tests avec les dernière solution de FredoMkb quant je sélectionne rien ou une sélection par exemple j'ai un résultat qui s'affiche, mais quant je la recharge je suis en erreur (le variable de session est nul) dans les deux cas.
<?php
// Construction de la liste des query valides
$query_list = array(); 
if ($budget != "0") {$query_list[] = "id_budget = '".$budget."'";} 
if ($secteur != "0") {$query_list[] = "id_secteur = '".$secteur."'";} 
if ($type != "0") {$query_list[] = "id_type = '".$type."'";} 

// Si la liste n'est pas vide :
if (!empty($query_list)) { 

    // Si une session "query_text" existe, on recupere sa valeur,
    // sinon on utilise celle issue de la variable "$query_list"
    if(isset($_SESSION['query_text'])) { 
        $query_text = $_SESSION['query_text'] ; 
    } else { 
        $query_text = implode(" AND ", $query_list); 
        $_SESSION['query_text'] = $query_text ; 
    } 

    $sql_result = "SELECT * FROM matble WHERE ".$query_text ; 
    /* La suite du code ... */ 
}
/* Le reste du code... */
?>
Par contre quant je test l'ancien code:
// Construction de la liste des query valides
$query_list = array(); 
if ($budget != "0") {$query_list[] = "id_budget = '".$budget."'";} 
if ($secteur != "0") {$query_list[] = "id_secteur = '".$secteur."'";} 
if ($type != "0") {$query_list[] = "id_type = '".$type."'";} 

// Si la liste n'est pas vide :
if (!empty($query_list)) { 

    // Si une session "query_text" existe, on recupere sa valeur,
    // sinon on utilise celle issue de la variable "$query_list"
    if(isset($_SESSION['query_text'])) { 
        $query_text = $_SESSION['query_text'] ; 
    } else { 
        $query_text = implode(" AND ", $query_list); 
        $_SESSION['query_text'] = $query_text ; 
    } 

    $sql_result = "SELECT * FROM matble WHERE ".$query_text ; 
    /* La suite du code ... */ 
} 
l'erreur se produit uniquement quant je sélectionne rien.

:shock: :?:

par spirit » 15 mai 2008, 06:43

:oops:
aprés ça marche plus ?? pourtant quant j'avais tester avant hier c'était ok, p en tout cas ça donne ça:
Warning: Variable passed to each() is not an array or object in...
:cry:

par spirit » 14 mai 2008, 06:45

je viens de tester ça marche :D
en fait en page d'appel j'ai 3 menu déroulant qui me renvois sur la page de résultat ou je tri "matable" selon 3 critères.
Juste en 1er page j'ai rajouter
unset($_SESSION['query_text'] );  
car la 1ere fois c'était ok mais aprés on pouvais plus changer le tri une fois que la session était créer.
Je continu a tester ce soir, merci encore pour l'aide.

par FredoMkb » 14 mai 2008, 06:03

Salut Spirit :)

Code : Tout sélectionner

$query_list = array(); if ($budget != "0") {$query_list[] = "id_budget = '".$budget."'";} if ($secteur != "0") {$query_list[] = "id_secteur = '".$secteur."'";} if ($type != "0") {$query_list[] = "id_type = '".$type."'";} if (!empty($query_list)) { if(isset($_SESSION['query_text'])) { $query_text = $_SESSION['query_text'] ; echo 'session existe'; } else { $_SESSION['query_text'] = $query_text ; $query_text = implode(" AND ", $query_list); echo 'pas de session'; } $sql_result = "SELECT * FROM matble WHERE ".$query_text ; /* La suite du code ... */ ?>
ça marche mais pas ma tentative de session !!! peut être à cause de la valeur de $query_text ? :? :!: :?:
Au fait, je ne sais pas trop, mais là, à première vue, je dirais que tu tentes de mémoriser des données dans une session alors qu'elles n'ont pas été encore déclarées :shock:

Au fait, il faudrait que la variable "$query_text" soit affectée avant de tenter de la mémoriser dans la session, du coup, voici ce que je ferais :
<?php
// Construction de la liste des query valides
$query_list = array(); 
if ($budget != "0") {$query_list[] = "id_budget = '".$budget."'";} 
if ($secteur != "0") {$query_list[] = "id_secteur = '".$secteur."'";} 
if ($type != "0") {$query_list[] = "id_type = '".$type."'";} 

// Si la liste n'est pas vide :
if (!empty($query_list)) { 

	// Si une session "query_text" existe, on recupere sa valeur,
	// sinon on utilise celle issue de la variable "$query_list"
	if(isset($_SESSION['query_text'])) { 
		$query_text = $_SESSION['query_text'] ; 
	} else { 
		$query_text = implode(" AND ", $query_list); 
		$_SESSION['query_text'] = $query_text ; 
	} 

	$sql_result = "SELECT * FROM matble WHERE ".$query_text ; 
	/* La suite du code ... */ 
}
/* Le reste du code... */
?>
Bon, je pense que là ça devrait fonctionner, mais comme je ne sais pas ce qu'il y a avant, ni ce qui se passe après, je ne peux rien assurer... :?

Sinon, n'hésites pas à indenter ton code pour y voir plus clair...

Tiens-nous au courant Stp... à+ :)

[Edit]
En y réfléchissant, je pense qu'il faut tester la présence de la variable "query_text" de la session avant de construire la liste des query... si la session ne contient aucune valeur, alors on génère la liste... bref, voici ce que ça rendrait :
<?php 
$query_text = '';
// Si une session "query_text" existe et qu'elle n'est pas vide, on recupere sa valeur, 
if(isset($_SESSION['query_text']) && !empty($_SESSION['query_text'])) {  
	$query_text = $_SESSION['query_text'] ;  

} else {  
	// Construction de la liste des query valides 
	$query_list = array();  
	if ($budget != "0") {$query_list[] = "id_budget = '".$budget."'";}  
	if ($secteur != "0") {$query_list[] = "id_secteur = '".$secteur."'";}  
	if ($type != "0") {$query_list[] = "id_type = '".$type."'";}  

	// Si la liste n'est pas vide on utilise ses valeurs
	if (!empty($query_list)) { 
		$query_text = implode(" AND ", $query_list); 
		$_SESSION['query_text'] = $query_text; 
	}
} 
// Si la variable "$query_text" n'est pa vide, alors on lance la requete
if (!empty($query_text)) {
	$sql_result = "SELECT * FROM matble WHERE ".$query_text;  
	/* La suite du code ... */ 
}
?>
Test les deux pistes et dis-nous celle qui a le comportement le plus adapté à ce que tu cherches à faire...

Voilô... ;)
[/Edit]

par spirit » 13 mai 2008, 21:38

:oops: help !!! quant je test :

Code : Tout sélectionner

<?php include ("config.inc.php"); /* Construction du query pour chaque option */ /* l' * à été changer en 0 car lors des tests ça marcher pas */ $filtre=array(); if ($budget = "0") {$budget_query ="";} else {$filtre[] = "budget = '".$budget."'";} if ($secteur = "0") {$secteur_query ="";} else {$filtre[] = "secteur = '".$secteur."'";} if ($type = "0") {$type_query ="";} else {$filtre[] = "type = '".$type."'";} /* Construction de la requête */ $sql_result = "SELECT * FROM matable WHERE ".implode (' AND ',$filtre); /* La suite du code ... */ ?>
$filtre est vide ?? j'ai donc remis:

Code : Tout sélectionner

$query_list = array(); if ($budget != "0") {$query_list[] = "id_budget = '".$budget."'";} if ($secteur != "0") {$query_list[] = "id_secteur = '".$secteur."'";} if ($type != "0") {$query_list[] = "id_type = '".$type."'";} if (!empty($query_list)) { if(isset($_SESSION['query_text'])) { $query_text = $_SESSION['query_text'] ; echo 'session existe'; } else { $_SESSION['query_text'] = $query_text ; $query_text = implode(" AND ", $query_list); echo 'pas de session'; } $sql_result = "SELECT * FROM matble WHERE ".$query_text ; /* La suite du code ... */ ?>
ça marche mais pas ma tentative de session !!! peut être à cause de la valeur de $query_text ? :? :!: :?:

par FredoMkb » 13 mai 2008, 17:46

Re...
PS: pour ta deuxieme soluce, rassure moi tu as edite ton post?
Bein... non :!: pas depuis le 6 mai, date à laquelle je posté ce message... mais, si mes souvenirs sont bons, il me semble en effet que j'ai bien édité ce post une ou deux fois ce jour là... mais pas depuis... :roll:

Tu as dû afficher la page juste au moment de mon tout premier post et tu n'a pas mise à jour la page depuis, c'est peut être ça, non ? :shock:

Bref, peu importe au final, ce qui compte c'est qu'on soit arrivé à peut près à la même idée d'optimisation, et que ça puisse rendre service à Spirit (ou à d'autres)...

à+ :)

par steph29 » 13 mai 2008, 16:58

oui oui bien sur! desolé de l'oubli :oops:

PS: pour ta deuxieme soluce, rassure moi tu as edite ton post?

par FredoMkb » 13 mai 2008, 16:08

Bonjour :)
optimisation possible:

Code : Tout sélectionner

<?php include ("config.inc.php"); /* Construction du query pour chaque option */ $filtre=array(); if ($budget = "*") {$budget_query ="";} else {$filtre[] = "budget = '".$budget."'";} if ($secteur = "*") {$secteur_query ="";} else {$filtre[] = "secteur = '".$secteur."'";} if ($type = "*") {$type_query ="";} else {$filtre[] = "type = '".$type."'";} /* Construction de la requête */ $sql_result = "SELECT * FROM matable WHERE ".implode (' AND ',$filtre); /* La suite du code ... */ ?>
Bein oui steph29, nous sommes bien d'accord sur le principe d'optimisation (voir ma seconde proposition), mais je ne pense pas que ce soit prudent de faire le "implode()" directement sur la requête sans s'assurer au préalable que l'array contient bien des valeurs...

D'accord, je chipote un peu, mais ce genre de petit oubli peut parfois avoir des conséquences importantes, bref, un petit test ne coûte rien et ça peut éviter des dysfonctionnements (ou pire)...

à+ :)

par steph29 » 13 mai 2008, 14:55

Code : Tout sélectionner

<?php include ("config.inc.php"); /* Construction du query pour chaque option */ if ($budget = "*") {$budget_query ="";} else {$budget_query = "budget = '".$budget."'";} if ($secteur = "*") {$secteur_query ="";} else {$secteur_query = "secteur = '".$secteur."'";} if ($type = "*") {$type_query ="";} else {$type_query = "type = '".$type."'";} /* Construction des conditions AND */ if (!empty($budget_query) && !empty($secteur_query)) {$and1 = " AND ";} else {$and1 = "";} if (!empty($secteur_query) && !empty($type_query)) {$and2 = " AND ";} else {$and2 = "";} if (!empty($budget_query) && !empty($type_query)) {$and1 = " AND ";} /* Construction de la requête */ $sql_result = "SELECT * FROM matable WHERE ".$budget_query.$and1.$secteur_query.$and2.$type_query; /* La suite du code ... */ ?>
optimisation possible:

Code : Tout sélectionner

<?php include ("config.inc.php"); /* Construction du query pour chaque option */ $filtre=array(); if ($budget = "*") {$budget_query ="";} else {$filtre[] = "budget = '".$budget."'";} if ($secteur = "*") {$secteur_query ="";} else {$filtre[] = "secteur = '".$secteur."'";} if ($type = "*") {$type_query ="";} else {$filtre[] = "type = '".$type."'";} /* Construction de la requête */ $sql_result = "SELECT * FROM matable WHERE ".implode (' AND ',$filtre); /* La suite du code ... */ ?>
sinon pour garder les parametres passer en GET ou garder les valeurs en session, et j'ai tendance a preconiser la premiere...

par d0m » 13 mai 2008, 12:35

garder les résultats en session?

par spirit » 13 mai 2008, 07:17

Bonjour,
je viens de m' appercevoir une petite chose :( tout fonctionne bien mais sur la page de résultat quant je fait un refresh de la page c'est ok mais pas quant on la recharge, ce qui est logique après réfflection, pouvez vous me dire quelle est la démarche a suivre pour que je garde les "résultats" et pas me retrouver avec une page vide de résultat. merci.