Page 1 sur 4
probleme de requete
Posté : 27 mai 2005, 10:37
par donny
salut,
Je souhaite creer des menu dynamique,c'est à dire quand je selectionne un element d un menu , le second menu se modifie en fonction de se qui a été choisi, j avais deja fait un truc dans ce genre mais pour afficher un tableau mais la je comprends pas pourquoi sa ne fonctionne pas.
Quand je lance ma feuille les deux menu sont bien crée et quand je choisi un element du premiere alors sa plante
<?php
include("connexion.inc.php");
$sql = 'SELECT distinct type FROM article order by type;';
$result = pg_query($sql) or die( 'Erreur' );
$nb = pg_num_rows($result);
echo '<h1> nombre '.$nb.'</h1>';
echo "<select name=\"famille\" onChange=\"location.href='" . $_SERVER['PHP_SELF'] . "?type_article=' + this.value\">";
if ( $nb==0 ) {
echo '<option>Aucune Famille</option>';
} else {
echo '<option>*</option>';
while ( $list = pg_fetch_array( $result ) ) {
echo '<option value="'.$list['type'].'">'.$list['type'].'</option>';
}
}
echo '</select> ';
$type_article=@$_GET['type_article'];
if($type_article!=""){
//affichage pour les marque
$sql1 = "SELECT distinct marque FROM article where type='".$type_article. "' order by type ;";
}else{
$sql1 = "select distinct marque from article order by marque";
}
$result1 = pg_query($sql1) or die( 'Erreur1' );
$nb = pg_num_rows($result1);
echo '<h1> nombre '.$nb.'</h1>';
echo "<select name=\"marque\" onChange=\"location.href='" . $_SERVER['PHP_SELF'] . "?marque=' + this.value\">";
if ( $nb==0 ) {
echo '<option>Aucune Marque</option>';
} else {
echo '<option>*</option>';
while ( $list1 = pg_fetch_array( $result1 ) ) {
echo '<option value="'.$list1['marque'].'">'.$list1['marque'].'</option>';
}
}
echo '</select> ';
$marque=@$_GET['marque'];
?>
Voila l erreur
Warning: pg_query(): Query failed: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list . in c:\program files\easyphp1-7\www\projet\\menu.php on line 36
Erreur
Posté : 27 mai 2005, 10:42
par donny
Je viens de piger c est order by marque
et pas par type comme ici
$sql1 = "SELECT distinct marque FROM article where type='".$type_article. "' order by type ;";
Posté : 27 mai 2005, 11:06
par donny
comment sa se fait que quand on selectionne un element dans la liste deroulante il ne reste pas afficher sur la liste ???
Posté : 27 mai 2005, 11:10
par mere-teresa
A quel moment tu voudrais qu'il reste selectionné ?
(et c'est <option selected="selected"> à mettre dans le HTML)
Posté : 27 mai 2005, 11:13
par Cyrano
Salut,
pour qu'un élément de liste déroulante reste sélectionné au rechargement de la page, il faut que cet élément ait un attribut [selected="selected"]. Il faut donc que tu récupères le chap sélectionné dans ta variable $_POST ou $_GET selon la méthode utilisée et que dans ton menu déroulant, chaque option générée ait un test qui vérifie si la valeur de l'option est la même que celle sélectionnée précédemment. Tu vas donc avoir quelque chose du style:
<option value="valeur_option" <?php echo($_POST['famille'] == "valeur_option"? "selected=\"selected\": \"\""); ?>>Valeur option</option>
Posté : 27 mai 2005, 11:35
par donny
parcequ en faite j ai mes 3 listes deroulantes, dans la premiere j ai le type, la seconde la marque et la 3eme le modele.
Et je voudrais que quand je selectionne le type bin le type reste visible dans la liste et quand je selectionne la marque alors le type reste toujours visible et la marque s affiche sur la liste et pareil pour le modele ??
Vu que j utilise des onchange est ce que sa peut marcher?
Posté : 27 mai 2005, 11:43
par donny
mon code est comme sa
et je vois pas trop comment integrer le selected la dedans et qu il garde toujours la meme valeur tant que je n ai pas modifier mon choix dans la liste .

?
echo "<select name=\"famille\" onChange=\"location.href='" . $_SERVER['PHP_SELF'] . "?type_article=' + this.value\">";
if ( $nb==0 ) {
echo '<option>Aucune Famille</option>';
} else {
echo '<option>*</option>';
while ( $list = pg_fetch_array( $result ) ) {
echo '<option value="'.$list['type'].'">'.$list['type'].'</option>';
}
}
echo '</select> ';
$type_article=@$_GET['type_article'];
Posté : 27 mai 2005, 13:11
par Cyrano
Le problème qui doit se poser, c'est que au lieu d'envoyer le formualire avec l'évènement onchange, tu redirige sur la page elle-même, mais ce faisant, tu perds les informations du formulaire qui se recharge par défaut. Il faudrait pour faire ça que tu alimentes un champ caché qui détermine si tu vas vers la validation ou simplement un rechargement avec des éléments présélectionnés
Est-ce que tu comprends le principe ?
Posté : 27 mai 2005, 14:02
par donny
pas trop,
comme a chaque fois qu on choisi un element dans une liste avec l evenement onchange on recharge la page et on perd les element des autre liste c est bien cela que tu veux me dire.
Mais le truc est que sans cette evenement bin je serai bloquer
tu compte faire comment pour que le champs caché ?
J ai pas trop saisi

Posté : 27 mai 2005, 14:13
par Cyrano
Je vais essayer de te ré-expliquer le principe, mais si tu ne le comprends pas, je ne sais pas vraiment comment tu vas arriver à coder ça
avec un évènement on change, tu pourrais faire deux choses:
-1- Attribuer une valeur à un champ caché (<input type="hidden" name="traitement" id="traitement" value="">), valeur par défaut vide que tu mets à "recharger" par exemple. Cette valeur va être disponible au rechargement de la page dans $_POST['traitement'].
-2- Lancer le rechargement;
Si la valeur est vide, tu valides ton formulaire, sinon, si la valeur est "recharger", tu récupères les autres valeurs envoyées par le formulaire pour utiliser la sélection automatique des éléments choisis. C'est là que tu va pouvoir utiliser le bout de code que j'ai mis plus haut dans les <option> avec une petite amélioration toute fois pour éviter les messages d'erreur:
<option value="valeur_option" <?php echo(isset($_POST['famille']) && $_POST['famille'] == "valeur_option"? "selected=\"selected\": \"\""); ?>>Valeur option</option>
Le champ caché doit être dans le formulaire bien sur, mais n'apparaîtra pas dans la page.
Donc, ton onchange devra ressembler à:
Code : Tout sélectionner
onchange="document.forms.elements['id_champ_cache'].value = 'recharger'; this.submit();"
Est-ce que c'est plus clair ?
Posté : 27 mai 2005, 14:19
par donny
si dans mon onchange je met cela
onchange="document.forms.elements['id_champ_cache'].value = 'recharger'; this.submit();"
comment je vais faire alors pour modifier le 2eme menu deroulant à partir du 1er ...?
Posté : 27 mai 2005, 14:32
par donny
tu pense que je peux le faire avec les sessions,
quand je choisi une valeur dans le menu deroulant alors je la stocke dans une variable $_SESSSION et vu que les sessions garde les valeur de page en page tout au long de la navigation bin tant je choisirai pas une autre valeur dans la liste deroulante alors sa ne changera pas .
Et comme sa j aurai les valeurs que j ai selectionner dans toute mes liste deroulante toujours stocker dans une variable de session .
T en pense quoi , c est faisable ?
Posté : 27 mai 2005, 14:54
par Cyrano
Techniquement oui, pourquoi pas, un peu sans intérêt, mais tout à fait faisable. Cette option me laisse à penser que tu n'as pas compris grand chose de mes explications et que tu cherches une alternative

Posté : 27 mai 2005, 14:57
par donny
sincerement j ai pas trop capter le truc avec le champs caché
et je pas comment tu veux faire pour alimenter la 2eme liste deroulante si tu utilise l evenement onchange pour faire quelquechose d autre ??
Posté : 27 mai 2005, 16:11
par donny
J ai essayer avec les sessions sa sauvegarde bien la valeur de l element choisi dans la liste et j ai essayer de faire le selected mais sa bogue
<html>
<head>
</head>
<body>
<?php
session_start();
include("connexionessai.inc.php");
//affichage pour la ville
$sql = 'SELECT distinct type_objet FROM objet order by type_objet;';
$result = pg_query($sql) or die( 'Erreur' );
$nb = pg_num_rows($result);
echo '<h1> nombre '.$nb.'</h1>';
?>
<select name="famille" onChange="location.href='<?php echo $_SERVER['PHP_SELF'] ;?>?type_objet=' + this.value">
<?
if ( $nb==0 ) {
?>
<option>Aucune Famille</option>
<?
} else {
?>
<option>*</option>
<?
$sel="selected"
while ( $list = pg_fetch_array( $result ) ) {
?>
<option value="<? echo $list['type_objet'] ;?>" selected="<?php if(isset($_SESSION['type_objet'])){ echo $sel;}" ?>><? echo $list['type_objet'] ;?></option>
//<option value="valeur_option" <?php echo(isset($_GET['famille']) && $_POST['famille'] == "valeur_option"? //"selected=\"selected\": \"\""); ?>>Valeur option</option>
<?
}
}
?>
</select>
<?
if(isset($_GET['type_objet'])){
$type_objet=@$_GET['type_objet'];
$_SESSION['type_objet'] = @$_GET['type_objet'];
}elseif(isset($_GET['marque'])){
$marque=@$_GET['marque'];
$_SESSION['marque'] = @$_GET['marque'];
}elseif(isset($_GET['modele'])){
$modele=@$_GET['modele'];
$_SESSION['modele'] = @$_GET['modele'];
}
//$_SESSION['type_objet'] = @$_GET['type_objet'];
echo @$_SESSION['type_objet'];
if(@$type_objet!=""){
//affichage pour les marque
$sql1 = "SELECT distinct marque FROM objet where type_objet='".$type_objet. "' order by marque;";
}else{
$sql1 = "select distinct marque from objet order by marque";
}
$result1 = pg_query($sql1) or die( 'Erreur1' );
$nb = pg_num_rows($result1);
echo '<h1> nombre '.$nb.'</h1>';
?>
<select name="marque" onChange="location.href='<?php echo $_SERVER['PHP_SELF'] ; ?>?marque=' + this.value">
<?
if ( $nb==0 ) {
?>
<option>Aucune Marque</option>
<?
} else {
?>
<option>*</option>
<?
while ( $list1 = pg_fetch_array( $result1 ) ) {
?>
<option value="<?php echo $list1['marque'] ;?>"><? echo $list1['marque'] ;?></option>
<?
}
}
?>
</select>
<?
//$marque=@$_GET['marque'];
//echo $marque;
echo @$_SESSION['marque'];
if(@$marque!=""){
//affichage par modele
$sql1 = "SELECT distinct modele FROM objet where marque='".$marque. "' order by modele;";
}else{
$sql1 = "select distinct modele from objet order by modele";
}
$result1 = pg_query($sql1) or die( 'Erreur1' );
$nb = pg_num_rows($result1);
echo '<h1> nombre '.$nb.'</h1>';
?>
<select name="modele" onChange="location.href='<?php echo $_SERVER['PHP_SELF'] ;?>?modele=' + this.value">
<?
if ( $nb==0 ) {
?>
<option>Aucun Modele</option>
<?
} else {
?>
<option>*</option>
<? while ( $list1 = pg_fetch_array( $result1 ) ) {
?>
<option value="<?php echo $list1['modele'] ;?>" ><?php echo $list1['modele']; ?></option>
<?
}
}
?>
</select>
<?
//$modele=@$_GET['modele'];
echo @$_SESSION['modele'];
?>
</body>
</html>
L erreur
Parse error: parse error, unexpected T_WHILE in c:\program files\easyphp1-7\www\projet\interface\recherche2.php on line 41