Récupération d'un select multiple

Résolu
nifa -  
 jojo -
Bonjour,
J'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>
A voir également:

27 réponses

jojo
 
Re,

Peux tu me redonner tout ton code stp. sans rien toucher.

Merci.
0
nifa
 
$_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>
0
nifa
 
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>
0
jojo
 
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)"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nifa
 
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.
0
jojo
 
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.
0
nifa
 
Ma dernière question, vu que c'est la première fois que j'utilise un forum. Je suppose qu'il faut mettre cette longue discussion en "résolu" ? Comment faut faire ?
Bonne journée.
0
jojo
 
Re,

En haut à droite du premier message : tu mets à statut "résolu".

Bonne soirée.
0