8791 sujets

Développement web côté serveur, CMS

Bonjour tout le monde,

J'ai une liste de sélection nommée select_Nom_annees, elle me permet de choisir des années (1ère, 2ème...)

<?php
session_start();

//Affiche le nom des années dans lequel le Professeur donne cours.

include('connexion.php');

//$_SESSION['Matricule'] est une variable de session créée dans la page authentifcation.php
$sql = "SELECT DISTINCT NOM_ANNEE, MNEMONIC FROM cours WHERE MNEMONIC IN (SELECT MNEMONIC FROM enseigner WHERE MATRICULE_PROF = " . $_SESSION['Matricule'] . ")";
//echo $sql;
$query = mysql_query($sql);
?>
<select name="select_Nom_annees" onchange="document.test.submit();"> 

	<option value="" selected="selected">(1) Choix d'une année</option>
	<?php 
	while($donnees = mysql_fetch_assoc($query)) { 
	?>
    <option value="
	<?php 
	echo $donnees['NOM_ANNEE']; 
	?>" 
	<?php 
	if (!(strcmp($donnees['NOM_ANNEE'], $_POST['Nom_annees']))) { echo "selected=\"selected\"";}
	?> 
	>
	<?php 
	echo $donnees['NOM_ANNEE']; 
	?>
	</option>
	<?php 
	} 
	?>
</select>


Une autre liste déroulante me permet de choisir le nom d'un cours et porte le nom select_Nom_mnemonics :

<!--Si la variable de type post à une information -->
<?php
session_start();
	
//cette chaine SQL permet de sélectionner le nom du cours où le nom de l'année (variable $_POST) a été choisie dans la liste déroulante et le matricule (variable de    session) est égal au matricule entré lors de l'authentification du Professeur.
$sql_Nom_Cours = "SELECT MNEMONIC FROM cours WHERE NOM_ANNEE = '" . $_POST['Nom_annees'] . "' AND MATRICULE_PROF = '" . $_SESSION['Matricule'] . "'"; 	
//echo $sql_Nom_Cours;
$query = mysql_query($sql_Nom_Cours);


if(!$query) echo('Attention, la requête ne fonctionne pas ! ');
/*else
{
	$nombre = mysql_num_rows($query);
	echo("le nombre de ligne est de $nombre"); 
}*/	

?>


<form name="frmMnemonic" method="post" action="">
<?php
//le fait de mettre "onchange="submit()" va déclencher l'action du form !!!
echo '<select name="select_Nom_mnemonics" size="1" onchange="document.frm_Listes_Deroulantes.submit();" id="Nom_cours"">';
echo '<option value="" selected="selected"><b>(2)</b> Choix d\'un cours</option>';

while ($row = mysql_fetch_row($query)) 
{
	$_SESSION['valeurSelectionne'] = '<option value="'.$row[0].'"';
	echo("$_SESSION[valeurSelectionne]");
	/*if (!(strcmp($row[0], $_POST['Nom_annees']))) 
		{
			echo "selected=\"selected\"";
		}*/
	//ucfirst met la première lettre du mot ou de la phrase en majuscule
	//ceci est une concaténation avec ce qui est ci-dessus.
	echo '>'.ucfirst($row[0]).'</option>';
}

echo '</select>';

?>
</form>


Le problème est le suivant :

Quand je choisis une valeur dans la liste déroulante select_Nom_mnemonics, la valeur qui était choisie dans la liste déroulante select_Nom_annees disparaît et revient à la valeur par défaut idem pour la liste déroulante nommée select_Nom_annees.

Est-il possible de garder les valeurs choisies et non revenir aux valeur par défaut après un choix dans la liste déroulante select_Nom_annees ?

Un tout grand merci d'avance.

beegees
Modérateur
beegees a écrit :


...

Est-il possible de garder les valeurs choisies et non revenir aux valeur par défaut après un choix dans la liste déroulante select_Nom_annees ?
...

beegees


Salut beegees,

En effet, tu peux garder une valeur. Là, je n'ai pas vraiment lu ton code, mais comme tu es dans une session, je peux te proposer d'initialiser une variable $_SESSION[] afin de garder ta valeur Smiley cligne .

++
Bonsoir

Il semble que ce soit une erreur toute bête : tu ne gardes pas, dans le php, le même nom que dans la balise select.

Essaye ceci :
<?php 

	if (!(strcmp($donnees['NOM_ANNEE'], $_POST['select_Nom_annees']))) { echo "selected=\"selected\"";}

	?>


Sinon, pour ce genre de choses, il est aussi très bien d'utiliser de l'Ajax. Le seul inconvénient, c'est que les utilisateurs doivent avoir Javascript activé sur leur navigateur.

Bonne soirée
MademoiselleL
MademoiselleL a écrit :
Bonsoir

Il semble que ce soit une erreur toute bête : tu ne gardes pas, dans le php, le même nom que dans la balise select.

Essaye ceci :
<?php 

	if (!(strcmp($donnees['NOM_ANNEE'], $_POST['select_Nom_annees']))) { echo "selected=\"selected\"";}

	?>


Sinon, pour ce genre de choses, il est aussi très bien d'utiliser de l'Ajax. Le seul inconvénient, c'est que les utilisateurs doivent avoir Javascript activé sur leur navigateur.

Bonne soirée
MademoiselleL


Bonjour,

Merci pour ta réponse.

En effet, cette erreur, je l'avais vu hier, je l'ai modifié dans la page année et cours mais le résultat est toujours le même.

Connais-tu un bon tuto qui explique AJAX car j'essaie depuis plusieurs jours à m'y mettre mais ça me semble vraiment difficile.

Merci encore.

beegees
Modifié par beegees (19 Nov 2008 - 09:29)
Nolem a écrit :


Salut beegees,

En effet, tu peux garder une valeur. Là, je n'ai pas vraiment lu ton code, mais comme tu es dans une session, je peux te proposer d'initialiser une variable $_SESSION[] afin de garder ta valeur Smiley cligne .

++


Salut Nolem,

Merci pour ta réponse.

J'ai pensé à la variable de session (ça fait 2 jours complets que je suis bloqué sur ce problème) mais si tu as le temps, saurais-tu me montrer un bout de code ?

Merci encore.
beegees
Salut,

je te conseille de garder Ajax pour plus tard : l'important est d'abord de bien saisir le fonctionnement de PHP. Smiley cligne

Pour ce qui est de ta question je ne pige pas trop pourquoi tu nous montre 2 codes distincts. Est-ce qu'ils sont inclus et si oui comment... Est-ce que le fonctionnement de la fonction include est clair pour toi ? A savoir qu'il s'agit en quelque sorte d'un simple copié / collé de code ? (Je te pose la question car les 2 commencent par session_start ce qui est étonnant à plus d'un titre : d'abord parce qu'1 seul suffit amplement pour une page et ensuite parce que cette fonction doit être placée avant tout code html ce qui ne semble pas être le cas ici.)

D'autre part, et pour être sûr que ce point soit clair, si tes 2 SELECT sont dans 2 formulaires différents c'est normal que tu ne récupères pas les 2 valeurs mais seulement celle du formulaire soumis.

Au passage je ne vois pas l'intérêt des variables de session ici : elles ne sont intéressantes que lorsque l'on veut garder des variables d'une page à l'autre. Est-ce bien le cas ?
Modifié par Heyoan (19 Nov 2008 - 17:47)
Heyoan a écrit :
Salut,

je te conseille de garder Ajax pour plus tard : l'important est d'abord de bien saisir le fonctionnement de PHP. Smiley cligne


Salut,

Un tout GRAND merci pour ta réponse.

J'ai travaillé toute la journée à (essayer d') apprendre AJAX, voilà ce que ça donne :

<?php 
			include('connexion.php');
			
$res = "SELECT * FROM cours WHERE MNEMONIC IN (SELECT MNEMONIC FROM enseigner WHERE MATRICULE_PROF = '" . $_SESSION['Matricule'] . "')";
//echo($res);
$query = mysql_query($res);


			$nbrow = mysql_num_rows($query);
			echo($nbrow);
	?>
		<script type='text/javascript'> 
				<script type='text/javascript'>
	 
			function getXhr(){
                                var xhr = null; 
				if(window.XMLHttpRequest) // Firefox et autres
				   xhr = new XMLHttpRequest(); 
				else if(window.ActiveXObject){ // Internet Explorer 
				   try {
			                xhr = new ActiveXObject("Msxml2.XMLHTTP");
			            } catch (e) {
			                xhr = new ActiveXObject("Microsoft.XMLHTTP");
			            }
				}
				else { // XMLHttpRequest non supporté par le navigateur 
				   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
				   xhr = false; 
				} 
                                return xhr;
			}
	
			
			/**
			* Méthode qui sera appelée sur le click du bouton
			*/
			function go(){
				var xhr = getXhr();
				// On défini ce qu'on va faire quand on aura la réponse
				xhr.onreadystatechange = function(){
					// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
					if(xhr.readyState == 4 && xhr.status == 200){
						leselect = xhr.responseText;
						// On se sert de innerHTML pour rajouter les options a la liste
						document.getElementById('Mnemonic').innerHTML = leselect;
					}
				}
 
				// Ici on va voir comment faire du post
				xhr.open("POST","ajaxLivre.php",true);
				// ne pas oublier ça pour le post
				xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
				// ne pas oublier de poster les arguments
				// ici, l'id de l'auteur
				sel = document.getElementById('annee');
				idauteur = sel.options[sel.selectedIndex].value;
				xhr.send("ID="+ID);
			}
		</script>


	
		<form>
				<select name='annee' id='annee' onchange='go()'>
					<option value='-1'>(1)Choisissez une année</option>
					<?php
						while($row = mysql_fetch_assoc($query)){
							echo "<option value='".$row["NOM_ANNEE"]."'>".$row["NOM_ANNEE"]."</option>";
						}
					?>
				</select>
				
			
		</form>


La première liste déroulante se remplie sans problème, mais je ne pense pas que AJAX en est la cause Smiley ravi

Heyoan a écrit :

Pour ce qui est de ta question je ne pige pas trop pourquoi tu nous montre 2 codes distincts. Est-ce qu'ils sont inclus et si oui comment... Est-ce que le fonctionnement de la fonction include est clair pour toi ? A savoir qu'il s'agit en quelque sorte d'un simple copié / collé de code ? (Je te pose la question car les 2 commencent par session_start ce qui est étonnant à plus d'un titre : d'abord parce qu'1 seul suffit amplement pour une page et ensuite parce que cette fonction doit être placée avant tout code html ce qui ne semble pas être le cas ici.)


Ta remarque est très intéressante et j'avoue que même si je savais que c'étais un copié/collé, je m'étais jamais dis qu'il ne fallait pas mettre un session_start() au début de chaque include, la preuve que je n'avais pas bien compris.

Heyoan a écrit :

D'autre part, et pour être sûr que ce point soit clair, si tes 2 SELECT sont dans 2 formulaires différents c'est normal que tu ne récupères pas les 2 valeurs mais seulement celle du formulaire soumis.


ok ça c'est clair, merci.

Heyoan a écrit :

Au passage je ne vois pas l'intérêt des variables de session ici : elles ne sont intéressantes que lorsque l'on veut garder des variables d'une page à l'autre. Est-ce bien le cas ?


Je pense que la variable de session pourrait être intéressante vue que dans une autre page, je dois créer une requête avec la valeur choisie de chaque liste déroulante.

Mais c'est vrai que je pourrais m'en passer.

Donc pour conclure, je me suis essayé à l'AJAX aujourd'hui (car plein de personnes me dit qu'il faut passer par là pour résoudre mon problème de 4 listes déroulantes liées en évitant les refresh et tous les problèmes qui s'en suivent).

Un tout grand merci à toi, pour ta patience, pour ton dévouement, j'apprécie énormément ton aide.

beegees
Modifié par beegees (19 Nov 2008 - 18:39)
beegees a écrit :

Donc pour conclure, je me suis essayé à l'AJAX aujourd'hui (car plein de personnes me dit qu'il faut passer par là pour résoudre mon problème de 4 listes déroulantes liées en évitant les refresh et tous les problèmes qui s'en suivent).
Ah... je n'avais pas compris que les contenus des SELECT était liés entre eux. Pour les questions purement Ajax il faut poster dans le salon Applications Web en ligne.

Pour une version sans Ajax il faut rajouter une foultitute de tests sur tes variables soumises : si le champ Select2 est vide est-ce que le champ Select 1 est rempli ? Si oui alimenter le contenu des OPTION du champ Select2, etc... le plus simple étant de rester sur la même page jusqu'à ce que tous les champs soient bien saisis.

Au passage, Ajax ou pas il faut impérativement renseigner l'attribut action de ton FORM (par exemple avec <?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>) et puisqu'à priori tu veux utiliser des variables POST il faut également indiquer method="post" car par défaut c'est du GET.