Récupération d'un select multiple
RésoluJ'ai 3 tables Mysql : une table "liste des cours", une table "liste des instructeurs en charge des cours", et une table pour faire la relation (chaque cours est associé à plusieurs instructeurs). Pour la mettre à jour mes tables, j'ai dans une page php un select multiple qui affiche pour un cours X, la liste des 6 instructeurs possibles. J'aimerais en plus que les instructeurs qui sont déjà associés à ce cours soient affichés en surbrillance. Exemple, le cours X est déjà associé aux instructeurs n° 2 et n° 4. Le select doit donc afficher les noms des 6 instructeurs, et les instructeurs 2 et 4 doivent être mis en surbrillance. Mon code est le suivant, malheureusement tous les instructeurs se mettent en surbrillance. Merci pour votre aide :
$_POST['test']=trim($_POST['test']);
if(empty($_POST['test'])) {
die("Erreur : aucun cours n'a été sélectionné. Si le problème persiste, veuillez contacter l'administrateur.");
} else {
$id_cours=$_POST['test'];
}
<select name="selecMajInstr[]" multiple="true" size="4">
<?php
$sqlInstr = " SELECT DISTINCTROW `instructeurs`.* "
. " FROM `instructeurs` "
. " LEFT JOIN `instr_de_cours`"
. " ON `instructeurs`.`id_instr` = `instr_de_cours`.`id_de_instr` "
. " ORDER BY `instructeurs`.`instructeur` ASC ";
$resultInstr = mysql_query($sqlInstr) or die('Erreur SQL : '.$sqlInstr.'<br>'.mysql_error());
while ($val = mysql_fetch_array($resultInstr)){
$instructeur=$val['instructeur'];
$id_de_cours=$val['id_de_cours'];
$select="";
if ($id_de_cours=$id_cours){
$selected="selected";
}
echo "<OPTION ".$selected." VALUE=".$id_instr.">".$instructeur."</option>";
}
?>
</select>
Configuration: Windows Vista Firefox 3.0.1
27 réponses
Un problème d'affichage dans un select multiple MySQL montre les instructeurs déjà associés à un cours X en surbrillance sur tous les éléments au lieu de limiter l'effet à ceux liés au cours. La meilleure réponse conseille de corriger le test PHP en utilisant l'égalité: remplacer if ($id_de_cours=$id_cours) par if ($id_de_cours==$id_cours). Des échanges complémentaires évoquent aussi éventuellement d'autres approches comme compter les liaisons ou revoir la jointure, mais l'essentiel reste d'assurer que la comparaison détermine correctement les instructeurs déjà liés. Dans les discussions, certains proposent aussi de retirer les options non liées ou d'utiliser une requête COUNT pour vérifier les associations avant l'affichage.
-
Re,
En haut à droite du premier message : tu mets à statut "résolu".
Bonne soirée. -
Re,
Ta solution est bien et elle se rapproche du COUNT(*) - j'ai seulement dit qu'elle est pas super esthétique pour moi - c'est tout - mais bon.
En effet on fait un SELECT sans utiliser les enregistrements remontés en testant juste si ce que l'on récupère est vide ou non - à ce seulement là le COUNT(*) est mieux je crois.
De tout façon - il n'y a pas logiquement de raison que ca fonctionne avec ta méthode et pas avec le COUNT(*) vu que :
1- Les algos. générés après compilation de ces deux ordres SQL sont presque STRICTEMENT les mêmes pour MySql.
2- Les "host variables" n'avaient pas été modifiées ainsi que tout le reste du programme.
Amusant non ... (:>) ??.
Je te souhaite une bonne journée.
jojo. -
Je trouve aussi que ma solution est un peu boiteuse.
Il m'a semblé qu'avec le Count(*) on fait une boucle à l'intérieure d'une boucle. J'ai cherché une solution soit pour interrompre le 2e effet de boucle, soit pour vraiment utiliser la comparaison des valeurs. De fil en aiguille, je suis partie du principe que $sqlInstrSelected = " SELECT * FROM `instr_de_cours` WHERE `instr_de_cours`.`id_de_instr` = $id_instr AND `instr_de_cours`.`id_de_cours` = $id_cours "; peut servir de test un seul enregistrement à la fois peut remplir la condition instr_de_cours`.`id_de_instr` = $id_instr AND `instr_de_cours`.`id_de_cours` = $id_cours. Si la condition est remplie, on peut récupérer un contenu quelqu'il soit ($valInstrSelected = mysql_fetch_array($resultInstrSelected)) et donc utiliser la notion de "quelque chose" ou "vide" pour tester si l'enregistrement doit être mis en surbrillance.
Je vais essayer de plancher sur ce Count(*). Mais basta pour ce soir... En tous cas je ne serais pas arrivée là sans toutes les précieuses info qui ont précédé. Entre-aide impeccable. -
Re,
OK - ca revient au même - c bien si ca marche mais c'est pas très élégant d'ouvrir un curseur pour récupérer un seul élément.
Le COUNT(*) dans mon code initial aurait du fonctionner sans problèmes -
essaye de faire marche le COUNT(*) si t'a le temps.
Bonne soirée.
jojo-from-neuneu-land.
_____________________________________________________________________________
"Ouais mec - après ma mort avant de r'joindre l'Ancien chuis allé faire comme ca
un chtit tour au "Parc Satanix"... c'est un gars qui gère ca et
il glande rien de la journée - ca fait pitié - chuis r'monté vite fait ben fait !! :> (Jésus Christ)" -
Incroyable, je crois que j'ai trouvé ! Jojo que penses-tu de ça, je vais encore vérifier mais pour le moment ça a l'air de marcher :
<select name="selecMajInstr[]" multiple="true" size="4">
<?php
$sqlInstrSQL = " SELECT `instructeurs`.* "
. " FROM `instructeurs` "
. " ORDER BY `instructeurs`.`instructeur` ASC ";
$resultInstrFetch = mysql_query($sqlInstrSQL)
or die('Erreur SQL : table Instructeur - procédure query : code erreur : <br>'.mysql_error());
while ($val = mysql_fetch_array($resultInstrFetch)
or die('Erreur SQL : table Instructeur - procédure fetch : code erreur : <br>'.mysql_error()))
{
$instructeur=$val['instructeur'];
$id_instr=$val['id_instr'];
$sqlInstrSelected = " SELECT * FROM `instr_de_cours` "
. " WHERE `instr_de_cours`.`id_de_instr` = $id_instr "
. " AND `instr_de_cours`.`id_de_cours` = $id_cours ";
$resultInstrSelected = mysql_query($sqlInstrSelected) or die('Erreur SQL : '.$sqlInstrSelected.'<br>'.mysql_error());
$valInstrSelected = mysql_fetch_array($resultInstrSelected);
$selected = "";
if ($valInstrSelected <> "")
{
$selected="selected";
}
echo "<OPTION ".$selected." VALUE=".$id_instr.">".$instructeur."</option>";
}
?>
</select> -
$_POST['selecMajCourstest']=trim($_POST['selecMajCourstest']);
if(empty($_POST['selecMajCourstest'])) {
die("Erreur : aucun cours n'a été sélectionné. Si le problème persiste, veuillez contacter l'administrateur.");
} else {
$id_cours=$_POST['selecMajCourstest'];
}
<select name="selecMajInstr[]" multiple="true" size="4">
<?php
$sqlInstrSQL = " SELECT `instructeurs`.* "
. " FROM `instructeurs` "
. " ORDER BY `instructeurs`.`instructeur` ASC ";
$resultInstrFetch = mysql_query($sqlInstrSQL)
or die('Erreur SQL : table Instructeur - procédure query : code erreur : <br>'.mysql_error());
while ($val = mysql_fetch_array($resultInstrFetch)
or die('Erreur SQL : table Instructeur - procédure fetch : code erreur : <br>'.mysql_error()))
{
$instructeur=$val['instructeur'];
$id_instr=$val['id_instr'];
$sqlCoursSQL = " SELECT COUNT(*) "
. " FROM `instr_de_cours` "
. " WHERE `instr_de_cours`.`id_de_instr` = $id_instr "
. " AND `instr_de_cours`.`id_de_cours` = $id_cours ";
$resultCoursCount = mysql_query($sqlCoursSQL)
or die('Erreur SQL : table instr_de_cours - procédure query : code erreur : <br>'.mysql_error());
$nbCours = mysql_fetch_assoc($resultCoursCount)
or die('Erreur SQL : table instr_de_cours - procédure fetch : code erreur : <br>'.mysql_error());
$selected = "";
if ($nbCours == 1)
{
$selected="selected";
}
echo "<OPTION ".$selected." VALUE=".$id_instr.">".$instructeur."</option>";
}
?>
</select> -
Re,
Peux tu me redonner tout ton code stp. sans rien toucher.
Merci. -
re-réponse .
1. Je n'ai que ça :
while ($val = mysql_fetch_array($resultInstrFetch)
or die('Erreur SQL : table Instructeur - procédure fetch : code erreur : <br>'.mysql_error()))
{
$instructeur=$val['instructeur'];
$id_instr=$val['id_instr'];
2. Oui, 1 pour tous -
Re,
"1. Pas sûre de bien comprendre, mais id_instr dans mysql est bien définit comme Integer et $id_instr affiche bien des entiers dans le select; iinstructeur dans mysql est bien définit comme varchar et $iinstructeur affiche bien des caractères dans le select."
--> donne moi juste la structure de $val stp telle que tu l'a défini dans ton code.
"3. $NbCours affiche 1. "
--> pour quels enregistrements de la table enregistrements ?... tous??.
___________________________________________________________________________________________
"Ouais mec - après ma mort avant de r'joindre l'Ancien chuis allé faire un chtit tour
au "Troquet des blaireaux"... c'est sale et le service est déplorable - ca fait pitié
- chuis r'monté vite fait :> (Jésus Christ)" -
1. Pas sûre de bien comprendre, mais id_instr dans mysql est bien définit comme Integer et $id_instr affiche bien des entiers dans le select; iinstructeur dans mysql est bien définit comme varchar et $iinstructeur affiche bien des caractères dans le select.
2. Vérifié et pas trouvé d'incohérences fonctionnelles dans les tables.
3. $NbCours affiche 1.
Merci pour ta patience. -
Renvoi parce que on va pas y arriver ce soir (:>)
Re,
- Ok pour le DISTINCTROW - erreur de ma part car ce n'est pas nécessaire puisque
les entrées sont uniques déjà sur la PK id_instr de la table Instructeurs.
Vérifie les point suivant :
1- Le tableau $val est-il bien structuré en deux champs (id_instr, instructeur)
avec les bonnes tailles et les bons formats pour le 'mapping' du fetch --> tableau ?.
OUI/NON ??
______________________________________________________________________________________________
Notes :
le COUNT(*) est OK - cherche pas au niveau des variantes - je connais bien cet ordre.
Le COUNT(*) doit normalement ramener 0 ou 1 et c'est tout.
Cas ou il ramène 0 :
- Si pas d'entrée dans la table instr_de_cours pour l'instructeur
de la table instructeur (instructeur sans cours).
- Si pas d'entrée dans la table instr_de_cours pour le id_cours choisi par l'utilisateur.
Cas ou il ramène 1 :
- Si l'instructeur existe dans cette table et qu'il a un id_cours de type choisi par l'utilisateur.
______________________________________________________________________________________________
Enfin....
2- vérifie bien que tu n'a pas d'incohérences fonctionnelles dans cette table
(par exemple : plusieurs id_cours de même valeur pour un même instructeur
mais je crois pas si tu a bien conçue ta PK sur cette table
avec PK sur le doublet ( id_de_instr - id_de_cours)).
==> incohérences fonctionnelles = cohérence des données de la table (et pas sa structure - m'en fous !!)
==> en clair, fais une visu. sur toute les données de ta table et regarde sit tous les enreg. sont OK.
OK/KO ??
3- $nbCours doit être un INT - OBLIGATOIREMENT car le COUNT(*) ramène un entier
- merci de le vérifier.
OUI/NON ??
_____________________________________________________________________________________________
Donc stp : peux répondre aux 3 question posée pour le moment.
Jojo. -
Pour tester la valeur de nbCours j'ai fait comme ça :
$resultat=print_r($nbCours);
echo "<OPTION ".$selected." VALUE=".$id_instr.">".$instructeur.$resultat."</option>";
et le select affiche 1 à côté de mes 6 instructeurs. -
Message pas passé, je renvoie :
Oui,oui je suis là, voilà quelques réponses :
Table instructeurs =>
id_instr : type INT(11), non null, auto-increment, INDEX, aucune cardinalité
instructeur : type varchar(50), non null
Table instr_de_cours =>
id_de_cours : type INT(11), non null,I NDEX, cardinalité 3
id_de_instr : type INT(11), cardinalité 3
Table courstest =>
id_cours : type INT(11), non null, auto-increment, PRIMARY, cardinalité 3
et d'autres champs de type date et varchar...
-----------------------------------
J'ai inversé le selected (renseigné au départ et vide si la condition est remplie), et tous les noms étaient en surbrillance :
$selected = "selected";
if ($nbCours == 1)
{
$selected="";
}
-------------------------------------------
J'ai essayé mis $nbCours dans le echo, et cela affiche "Array" :
echo "<OPTION ".$selected." VALUE=".$id_instr.">".$instructeur.$nbCours"</option>";
_________________
Pour la déclaration des variables, je croyais qu'on ne le fait que si une variable est réutilisée d'une fonction à l'autre... -
UP !
Moiselle - êtes vous là ?.. -
Renvoi à cause tronquage....
Re,
- Ok pour le DISTINCTROW - erreur de ma part car ce n'est pas nécessaire puisque
les entrées sont uniques déjà sur la PK id_instr de la table Instructeurs.
Vérifie les point suivant :
1- Le tableau $val est-il bien structuré en deux champs (id_instr, instructeur)
avec les bonnes tailles et les bons formats pour le 'mapping' du fetch --> tableau ?.
______________________________________________________________________________________________
Notes :
le COUNT(*) est OK - cherche pas au niveau des variantes - je connais bien cet ordre.
Le COUNT(*) doit normalement ramener 0 ou 1 et c'est tout.
Cas ou il ramène 0 :
- Si pas d'entrée dans la table instr_de_cours pour l'instructeur
de la table instructeur (instructeur sans cours).
- Si pas d'entrée dans la table instr_de_cours pour le id_cours choisi par l'utilisateur.
Cas ou il ramène 1 :
- Si l'instructeur existe dans cette table et qu'il a un id_cours de type choisi par l'utilisateur.
______________________________________________________________________________________________
Enfin....
2- vérifie bien que tu n'a pas d'incohérences fonctionnelles dans cette table
(par exemple : plusieurs id_cours de même valeur pour un même instructeur
mais je crois pas si tu a bien conçue ta PK sur cette table
avec PK sur le doublet ( id_de_instr - id_de_cours)).
3- $nbCours doit être un INT - OBLIGATOIREMENT car le COUNT(*) ramène un entier
- merci de le vérifier.
A ce sujet : j'ai une question : ou déclares toutes tes variables ??..
Ok - j'attends ta réponse - ca devrait marcher quand même !!....
Jojo.-
Oui,oui je suis là, voilà quelques réponses :
Table instructeurs =>
id_instr : type INT(11), non null, auto-increment, INDEX, aucune cardinalité
instructeur : type varchar(50), non null
Table instr_de_cours =>
id_de_cours : type INT(11), non null,I NDEX, cardinalité 3
id_de_instr : type INT(11), cardinalité 3
Table courstest =>
id_cours : type INT(11), non null, auto-increment, PRIMARY, cardinalité 3
et d'autres champs de type date et varchar...
-----------------------------------
J'ai inversé le selected (renseigné au départ et vide si la condition est remplie), et tous les noms étaient en surbrillance :
$selected = "selected";
if ($nbCours == 1)
{
$selected="";
}
-------------------------------------------
J'ai essayé mis $nbCours dans le echo, et cela affiche "Array" :
echo "<OPTION ".$selected." VALUE=".$id_instr.">".$instructeur.$nbCours"</option>";
_________________
Pour la déclaration des variables, je croyais qu'on ne le fait que si une variable est réutilisée d'une fonction à l'autre...
-
-
Re,
- Ok pour le DISTINCTROW - erreur de ma part car ce n'est pas nécessaire puisque
les entrées sont uniques déjà sur la PK id_instr de la table Instructeurs.
Vérifie les point suivant :
1- Le tableau $val est-il bien structuré en deux champs (id_instr, instructeur) avec les bonnes tailles et les bons formats pour le 'mapping' du fetch --> tableau ?.
______________________________________________________________________________________________
Notes :
le COUNT(*) est OK - cherche pas au niveau des variantes - je connais bien cet ordre.
Le COUNT(*) doit normalement ramener 0 ou 1 et c'est tout.
Cas ou il ramène 0 :
- Si pas d'entrée dans la table instr_de_cours pour l'instructeur de la table instructeur (instructeur sans cours).
- Si pas d'entrée dans la table instr_de_cours pour le id_cours choisi par l'utilisateur.
Cas ou il ramène 1 :
- Si l'instructeur existe dans cette table et qu'il a un id_cours de type choisi par l'utilisateur.
______________________________________________________________________________________________
Enfin....
2- vérifie bien que tu n'a pas d'incohérences fonctionnelles dans cette table
(par exemple : plusieurs id_cours de même valeur pour un même instructeur
mais je crois pas si tu a bien conçue ta PK sur cette table
avec PK sur le doublet ( id_de_instr - id_de_cours)).
3- $nbCours doit être un INT - OBLIGATOIREMENT car le COUNT(*) ramène un entier - merci de le vérifier.
A ce sujet : j'ai une question : ou déclares toutes tes variables ??..
Ok - j'attends ta réponse - ca devrait marcher quand même !!??....
Jojo. -
Problème d'édition du POST (tronqué) :
Je te remet le code :
$_POST['selecMajCourstest']=trim($_POST['selecMajCourstest']);
if(empty($_POST['selecMajCourstest'])) {
die("Erreur : aucun cours n'a été sélectionné.
Si le problème persiste, veuillez contacter l'administrateur.");
} else {
$id_cours=$_POST['selecMajCourstest'];
}
<select name="selecMajInstr[]" multiple="true" size="4">
<?php
$sqlInstrSQL = " SELECT DISTINTROW `instructeurs`.* "
. " FROM `instructeurs` "
. " ORDER BY `instructeurs`.`instructeur` ASC ";
$resultInstrFetch = mysql_query($sqlInstrSQL)
or die('Erreur SQL : table Instructeur - procédure query : code erreur : <br>'.mysql_error());
while ($val = mysql_fetch_array($resultInstrFetch)
or die('Erreur SQL : table Instructeur - procédure fetch : code erreur : <br>'.mysql_error()))
{
$instructeur=$val['instructeur'];
$id_instr=$val['id_instr'];
$sqlCoursSQL = " SELECT COUNT(*) "
. " FROM `instr_de_cours` "
. " WHERE `instr_de_cours`.`id_de_instr` = $id_instr "
. " AND `instr_de_cours`.`id_de_cours` = $id_cours ";
$resultCoursCount = mysql_query($sqlCoursSQL)
or die('Erreur SQL : table instr_de_cours - procédure query : code erreur : <br>'.mysql_error());
$nbCours = mysql_fetch_assoc($resultCoursCount)
or die('Erreur SQL : table instr_de_cours - procédure fetch : code erreur : <br>'.mysql_error());
$selected = "";
if ($nbCours == 1)
{
$selected="selected";
}
==> affichage del l'enregistrement
echo "<OPTION ".$selected." VALUE=".$id_instr.">".$instructeur."</option>";
}
?>
</select>-
Salut, merci de ne m'avoir pas abandonnée. J'ai supprimé le distinctrow, pour que les noms s'affichent dans le select. Hélas rien ne se met en surbrillance. Je vais essayer quelques tests pour dans l'espoir de voir ce qui ne passe pas, et me documenter un peu sur les select count (il y a peut-être des variantes?).
-
-
Hilou !!,
J'ai résolu notre petite affaire :
- Dans la boucle principale de fetch_array : on récupère tous les instructeurs sans jointure avec la table instr_de_cours pour éviter la "dégénérescence".
- Pour un instructeur donné : On effectue ensuite un comptage NBCOURS de tous les cours associés à cet instructeur en précisant dans le WHERE du SELECT le id_cours avec la valeur choisie par l'utilisateur.
- Si NBCOURS = 1 ==> surbrillance.
- Non-surbrillance sinon dans tous les cas.
- Enfin, on affiche l'entrée unique.
Note : redéfinir ton tableau $val ainsi - il comporte maintenant seulement 2 entrées:
| id_instr | instructeur |
voili...et ca ne peut que marcher à présent (:>)... enfin l'idée est là je crois et c'est propre.
A+.
Jojo.
__________________________________________________________________________________________________
$_POST['selecMajCourstest']=trim($_POST['selecMajCourstest']);
if(empty($_POST['selecMajCourstest'])) {
die("Erreur : aucun cours n'a été sélectionné. Si le problème persiste, veuillez contacter l'administrateur.");
} else {
$id_cours=$_POST['selecMajCourstest'];
}
<select name="selecMajInstr[]" multiple="true" size="4">
<?php
$sqlInstrSQL = " SELECT DISTINTROW `instructeurs`.* "
. " FROM `instructeurs` "
. " ORDER BY `instructeurs`.`instructeur` ASC ";
$resultInstrFetch = mysql_query($sqlInstrSQL) or die('Erreur SQL : table Instructeur - procédure query : code erreur : <br>'.mysql_error());
while ($val = mysql_fetch_array($resultInstrFetch) or die('Erreur SQL : table Instructeur - procédure fetch : code erreur : <br>'.mysql_error()))
{
$instructeur=$val['instructeur'];
$id_instr=$val['id_instr'];
$sqlCoursSQL = " SELECT COUNT(*) "
. " FROM `instr_de_cours` "
. " WHERE `instr_de_cours`.`id_de_instr` = $id_instr "
. " AND `instr_de_cours`.`id_de_cours` = $id_cours ";
$resultCoursCount = mysql_query($sqlCoursSQL) or die('Erreur SQL : table instr_de_cours - procédure query : code erreur : <br>'.mysql_error());
$nbCours = mysql_fetch_assoc($resultCoursCount) or die('Erreur SQL : table instr_de_cours - procédure fetch : code erreur : <br>'.mysql_error());
$selected = "";
if ($nbCours == 1)
{
$selected="selected";
}
==> affichage del l'enregistrement
echo "<OPTION ".$selected." VALUE=".$id_instr.">".$instructeur."</option>";
}
?>
</select> -
Re,
- Percuté soldat.
Tu a tout à fait compris le problème.
L'avant dernier POST : bug - pas bon.
Le dernier POST : surbrillance aléatoire car je ne me fie en fait qu'an premier enregistrement récupéré pour un institeur sans considérer les autres - surbrillance aléatoire blabla... t'a tout à fait compris.
Bah tu trouvera surement la soluce (:>).... j'en sui sure.
Merci pour tout.
Jojo. -
Re,
- Laisse tomber mes derniers POST - pas bon.
- Je comprends le problème mais il est po si simple à résoudre au vu de tes besoins.
Pour ma part - je te fournirai une solution demain matin à la premiere heure - no problemo - la nuit porte conseil.
(bonne nuit et à demain).
(| -) "Bzzzzzzzz....." (o |)
- 1
- 2