Requête à partir de plusieurs listes déroulante

spirit
Invité n'ayant pas de compte PHPfrance

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

Eléphant du PHP | 224 Messages

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]

;)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

spirit
Invité n'ayant pas de compte PHPfrance

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:

Eléphant du PHP | 224 Messages

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... à+ :)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

spirit
Invité n'ayant pas de compte PHPfrance

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.