Liste déroulante php,bd MySQL,pb codification [Résolu/Fermé]

Signaler
-
 AlucardDante -
Bonjour,
Je débute en php et j'essaye de faire une petite page Web pour un service de mon entreprise.
Je dois faire 4 listes déroulantes dynamiques imbriquées avec possibilité d'ajouter un nouvel élément sans passer par une autre page.
J'y vais pas par pas, et pour l'instant j'en suis juste à faire 2 listes imbriquées. Cela fonctionne mais seulement si le champs qui filtre la seconde liste est en format numérique. Mon problème est que des codifications internes existent déjà (numérique + caractère) et je voudrais les récupérer. Si je ne peux pas les utiliser, je vais devoir créer 4 tables de correspondance, alors que sans ce pb, cela ne serait pas nécessaire.

Si quelqu'un a déjà eu ce pb?
Merci

66 réponses

Messages postés
140
Date d'inscription
mercredi 18 juin 2008
Statut
Membre
Dernière intervention
1 novembre 2009
220
Alors... Ca n'a pas d'importance, mais tu n'es pas obligé de remettre des tags <html> de partout, ainsi que l'appelle aux fichiers js.

Recopie le code tel quel :

- index.php
<HTML>
<HEAD>
</HEAD>


    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript" src="ajax.js"></script>



<BODY>
<table id='formulaire'>
  <tr id='tr_affaire'>
    <td class='title'><b>Selectionnez une affaire :</b></td><td><?php include('select_affaire.php')?></td>
  </tr>
  <tr id='tr_localisation'>
  </tr>
</table>

</BODY>
</HTML>



- select_affaire.php
<select id='select_affaire' name='select_affaire' onchange="ajax(this)">
  <option value='void_affaire'>Choisir une affaire</option>
  <?php
    include("connexion.php");
    
    $query = "SELECT DISTINCT affaire FROM analyses ORDER BY affaire ASC";
    $rq = mysql_query($query) or die(mysql_error());
    
    while ($row=mysql_fetch_array($rq, MYSQL_ASSOC))
    {
      $affaire = $row["affaire"];
      echo "<option value='$affaire'>$affaire</option>";
    }
    mysql_close();
  ?>
</select>



- select_localisation.php
<select id='select_localisation' name='select_localisation'>
  <option value='void_localisation'>Choisir une localisation</option>
  <?php
    include("connexion.php");
    
    $var=$_POST['var'];
    
    $query = "SELECT DISTINCT localisation FROM analyses WHERE affaire='$var' ORDER BY localisation ASC";
    $rq = mysql_query($query) or die(mysql_error());
    while ($row=mysql_fetch_array($rq, MYSQL_ASSOC))
    {
      $localisation = $row["localisation"];
      echo "<option value='$localisation'>$localisation</option>";
    }  
    mysql_close();
  ?>
</select>



- ajax.js
function ajax(strthis)
{
  var param = strthis.value;
  $.ajax
  (
    {
      type: "POST",
      url: "select_localisation.php",
      data: "var="+param,
      success: function(msg){alert( "Data Saved: "+msg );}
    }
  );
}
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
1017
Date d'inscription
mardi 30 octobre 2007
Statut
Membre
Dernière intervention
22 novembre 2013
169
salut,

heu oui ce que dis papymucho est très juste et plus intuitif!
C'est plus pratique de faire ça en ajax !

Alors, on se jète à l'eau ! ^^

Je te donne le code necessaire pour le faire en ajax !
Ceci est un code minimal !

Requiert :

index.html ou .php ==> Page contenant les listes déroulantes
ajax.js ==> Code/fonctions javascript qui permet d'établir un lien entre le client et le serveur et évite de raffraichir la page
ajax.php ==> Fichier php exécuter côté serveur et envoyant le résultat sur la page HTML sans rafraichissement

Contenu de la page index.html :

<html>
   <head>
      <script type="text/javascript" src="ajax.js"></script>
   </head>
   <body onload="Ajax(0, 'ajax', 'affaires', 0)">
       <select id="affaires" onchange="Ajax(this.value, 'ajax', 'localisations', 0)"></select>
       <select id="localisations" onchange="Ajax(this.value, 'ajax', 'info3', document.getElementById('affaires').value)"></select>  
       <select id="info3"></select>
   </body>
</html>


Contenu de la page ajax.js :

function Ajax(str, page, result, champ)//str est la chaine envoyé, page est la page php appellé (sans l'extension), result est l'id de l'élément ou sera afficher le résultat renvoyé par le serveur et str2 est une deuxième chaine d'envoyé
{ 
	xmlHttp=GetXmlHttpObject()
	if (xmlHttp==null)
	{
		alert ("Votre navigateur ne supporte pas le HTTP Request")
		return
	}
	var url="./inc/"+page+".php"
	url=url+"?q="+str+"&p="+str2
	url=url+"&sid="+Math.random()
	xmlHttp.onreadystatechange=getStateChanged(result);
	xmlHttp.open("GET",url,true)
	xmlHttp.send(null)
	
}

function getStateChanged(result)
{
	if (typeof(result) === 'string')
	{
		result = document.getElementById(result);
	}
	return function() 
	{
		if (xmlHttp.readyState==4)
		{
			result.innerHTML = xmlHttp.responseText;
		}
	}
}


function GetXmlHttpObject()
{
	var xmlHttp=null;
	try
	{
		// Firefox, Opera 8.0+, Safari
		xmlHttp=new XMLHttpRequest();
	}
	catch (e)
	{
		//Internet Explorer
		try
		{
			xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	return xmlHttp;
}


Contenu de la page ajax.php :

//Bon ben ici c'est ta page php, j'ai pas grand chose à mettre puisque c'est en quelque sorte ton code a quelques modifications près !
mysql_connect("localhost", "root" , "");
mysql_select_db("BASE");

$q = $_GET["q"];//Premiere chaine reçu
$p = $_GET["p"];//Deuxième chaine reçu (=0 si il y a qu'une chaine, dans le cas on est juste sur la première liste déroulante !)

if(!$q && !$p)// Si $p ET $q valent 0, c'est qu'on initialise la première select box
{
//CODE PHP MYSQL A INSERER
//ALLER DANS LA BASE DE DONNEES POUR VOIR TOUTES LES AFFAIRES ET LES AFFICHER VIA UNE BOUCLE while($tableau = mysql_fetch_array($requete)){}
//A CHAQUE TOUR DE BOUCLE ON DOIT CREER UNE ENTREE DANS LE SELECT DONC ONT METTRE UN TRUC DE CE GENRE :
// while($tableau = mysql_fetch_array($requete)){?><option><?php echo $tableau['affaire']; ?></option><?php} 
//ICI, $tableau['affaire'] CONTIENT L'AFFAIRE ET AFFICHERA TOUTES LES AFFAIRES DE TA BASES GRACE A TA REQUETE 
}
else if($q && !isset($p))//SI ON RECOIT QU'UNE SEUL VARIABLE, C'EST QUE L'ON A CHOISIS UNE AFFAIRE
{
//COMME POUR LA CONDITION PRECEDENTE, ON CONSTRUIT LE SELECT DE LA MEME MANIERE SAUF QUE LA REQUETE AURA UNE CONDITION, IL FAUDRA DIRE UN TRUC DU GENRE, AFFICHER TOUTES LES LOCALISATIONS QUI APPARTIENNENT A L'AFFAIRE $q
}
else if($q && $p)
{
//DERNIER SOLUTION, ON RECOIT $p ET $q DONC ONT VIENT DE CHOISIR LA LOCALISATION ET ON VEUT AFFICHER LES INFO3 EN FONCTION DE $p ET DE $q.
//TOUJOURS LE MEME PRINCIPE MAIS LA REQUETE DEVRA ICI COMPORTER 2 CONDITIONS $q = CONDITION CHOISIE ET $p = AFFAIRE CHOISIE
}
else
{
echo "ERREUR !";
}
mysql_close();
?>


Bon voila comme promis ce fameux code, j'espère que ça sera clair ! ^^

J'ai essayé de commenter au max ce que tu aura besoin de comprendre ! SI tu veux des explications sur le fichier JS ou HTML, demande moi ! :)

En espérant t'avoir aidé :)

A+

Gaerebut
Messages postés
140
Date d'inscription
mercredi 18 juin 2008
Statut
Membre
Dernière intervention
1 novembre 2009
220
De rien !

Pas de problèmes... Si tu codes bien, tu peux te servir de ta fonction ajax uniquement... mais je te conseilles de commencer par 2 fonctions différentes, qui appeleront chacune un fichier.... Moins pro, mais pour débuter c cool.

Ca ressemblera a un truc comme ça

- fichier select_affaire.php

<select id='select_affaire' name='select_affaire' onchange="ajax_1(this)">
[...]
</select>



- fichier select_localisation.php

<select id='select_localisation' name='select_localisation' onchange="ajax_2(this)">
[...]
</select>



- fichier ajax.js

function ajax_1(strthis)
{
[...]
}

function ajax_2(strthis)
{
[...]
}




Bien sur le nom des fonctions ça n'est pas très propre non plus, disons que nous pouvons rester sur ces standards pour le moment, tu modifieras tout cela quand tu l'auras bien appréhendé :)

Un bon week également.
Messages postés
140
Date d'inscription
mercredi 18 juin 2008
Statut
Membre
Dernière intervention
1 novembre 2009
220
Salut,

Quel dommage, si près du but ;-)


Le formulaire :
<table id='formulaire'>
	<tr id='tr_affaire'>
		<td class='title'><b>Selectionnez une affaire :</b></td><td><?php include('select_affaire.php')?></td>
	</tr>
	<tr id='tr_localisation'>
	</tr>
</table>



Le fichier select_affaire.php :
<select id='select_affaire' name='select_affaire' onchange="ajax(this)">
	<option value='void_affaire'>Choisir une affaire</option>
	<?php
		include("connexion.php");
		
		$query = "SELECT DISTINCT affaire FROM analyses ORDER BY affaire ASC";
		$rq = mysql_query($query) or die(mysql_error());
		
		while ($row=mysql_fetch_array($rq, MYSQL_ASSOC))
		{
			$affaire = $row["affaire"];
			echo "<option value='$affaire'>$affaire</option>";
		}
		mysql_close();
	?>
</select>




Le fichier select_localisation.php :
<select id='select_localisation' name='select_localisation'>
	<option value='void_localisation'>Choisir une localisation</option>
	<?php
		include("connexion.php");
		
		$var=$_POST['var'];
		
		$query = "SELECT DISTINCT localisation FROM analyses WHERE affaire='$var' ORDER BY localisation ASC";
		$rq = mysql_query($query) or die(mysql_error());
		while ($row=mysql_fetch_array($rq, MYSQL_ASSOC))
		{
			$localisation = $row["localisation"];
			echo "<option value='$localisation'>$localisation</option>";
		}	
		mysql_close();
	?>
</select>






Le fichier javascript :
function ajax(strthis)
{
	var param = strthis.value;//Je récupère un ID d'habitude et non une string. Si ça ne fonctionne pas, enlève le .value
	var selected_affaire = document.getElementById("select_affaire").options[document.getElementById("select_affaire").selectedIndex].value;
	
	$.ajax
	(
		{
			type: "POST",
			url: "select_localisation.php",
			data: "var="+param,
			success: 
			function(msg)
			{
				$("#tr_localisation").append("<td class='title'><b>Selectionnez une localisation :</b></td><td>"+ msg +"</td>");
			}
		}
		if(selected_affaire=="void_affaire") $("#tr_localisation").hide();//Si l'utilisateur n'a pas encore fait de choix dans le "select_affaire" alors "select_localisation" est caché.
		else $("#tr_localisation").show();//Sinon on l'affiche.
	);
}




Explication : Dans ton formulaire, soit un tableau pour l'exemple, 2 lignes.... La première est une include sur le fichier select_affaire.php... La seconde est vide, elle contiendra ton 2ème select lors d'un changement dans le 1er.

Quand tu fais un changement dans le premier select, tu appelles la fonction ajax(this) en lui envoyant en paramètre
le choix fait par l'utilisateur (en fait, a chaque fois que l'utilisateur fait un changement dans le select, ça appelle la fonction)

La fonction ajax récupère le paramètre qui lui a été envoyé; puis on l'envoie dans la variable "param" (la ligne var param = strthis.value);

Ensuite la fonction s'exécute, en appellant le fichier demandé (ligne url: "select_localisation.php") et en lui envoyant le param grâce a la méthode POST..... Il est récupéré a la ligne $var=$_POST['var']; et le second SELECT effectue donc a chaque changement du premier SELECT, une nouvelle requête;

Ensuite, la fonction affiche alors le second select dans le tableau(jusqu'alors caché).... En fait tant que l'utilisateur n'a pas fait de choix dans le premier select, elle reste toujours cachée

Voilà; le seul truc qu'il faut que tu fasses, c'est télécharger la librairie jquery ;-)

Si tu as des questions surtout n'hésites pas!! sinon, et bien bon courage et bonne continuation ;-)
Tout d'abord, merci beaucoup pour ta réponse.

Tu as raison, je ne suis pas très claire dans ce que je dis. En fait, je crois que le mot "imbriqué" est de trop, je veux faire des listes dépendantes du choix dans d'autres listes.

Les listes déroulantes cherchent les données dans la table "analyses".
- Numéro analyse
- Date analyse
- Identifiant analyste
- Code affaire: code alphanumérique + libellé
- localisation: adresse (sans CP ni ville)
- Code de l'analyse: code alphanumérique
- Type: code alphanumérique.

L'utilisateur doit sélectionner une affaire dans une liste déroulante, puis sélectionner une localisation parmi une liste filtrée en fonction de l'affaire choisie, puis choisir le code de l'analyse parmi une liste filtrée en fonction de l'affaire et de la localisation choisie, puis choisir un type parmi une liste filtrée en fonction de l'affaire, de la localisation et du code d'analyse choisis. Enfin, s'il fait une analyse sur de nouveaux éléments, il doit pouvoir l'ajouter en l'inscrivant dans une simple boîte de saisie.

Voici mon code, je me suis insiprée d'un code trouvé sur un tutoriel. Et il fonctionne seulement si mon champs "affaire" est en format numérique.

---------------------------------------------------------------------------------------------------------

<?php
echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n");

/* On récupère si elle existe la valeur de l'affaire envoyée par le formulaire */
$idr = isset($_POST['affaire'])?$_POST['affaire']:null;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
</head>


<body style="font-family: verdana, helvetica, sans-serif; font-size: 85%">

<?php
if(isset($_POST['ok']) && isset($_POST['localisation']) && $_POST['localisation'] != "")
{
$affaire_selectionnee = $_POST['affaire'];
$localisation_selectionnee = $_POST['localisation'];
?>
<p>Vous avez sélectionné la localisation <?php echo($localisation_selectionnee); ?> dans l'affaire <?php echo($affaire_selectionnee); ?></p>
<?php
}
?>
<h3>Trouver une localisation </h3>
<?php
/* On établit la connexion à MySQL avec mysql_pconnect() plutôt qu'avec mysql_connect()
* car on aura besoin de la connexion un peu plus loin dans le script */
$connexion = mysql_pconnect('localhost', 'root', '');
if($connexion != false)
{
$choixbase = mysql_select_db('essai', $connexion);
$sql1 = "SELECT distinct `affaire`".
" FROM `analyses`".
" ORDER BY `affaire`";
$rech_affaires = mysql_query($sql1);
$affaire = array();
/* On active un compteur pour les affaires */
$nb_affaires = 0;
if($rech_affaires != false)
{
while($ligne = mysql_fetch_assoc($rech_affaires))
{
array_push($affaire, $ligne['affaire']);

/* On incrémente le compteur */
$nb_affaires++;
}
}
?>
<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="chglocalisation">
<fieldset style="border: 3px double #333399">
<legend>Sélectionnez une affaire</legend>
<select name="affaire" id="affaire" onchange="document.forms['chglocalisation'].submit();">
<option value="-1">- - - Choisissez une affaire - - -</option>
<?php
for($i = 0; $i < $nb_affaires; $i++)
{
?>
<option value="<?php echo($affaire[$i]); ?>"
<?php echo((isset($idr) && $idr == $affaire[$i])?" selected=\"selected\"":null); ?>>
<?php echo($affaire[$i]); ?></option>

<?php
}
?>
</select>
<?php
mysql_free_result($rech_affaires);
/* On commence par vérifier si on a envoyé une affaire et le cas échéant s'il est différent de -1 */

if(isset($idr) && $idr != -1)
{
/* Création de la requête pour avoir les localisations de cette affaire */
$sql2 = "SELECT distinct `localisation`".
" FROM `analyses`".
" WHERE `affaire` = ". $idr ."".
" ORDER BY `localisation`;";
if($connexion != false)
{
$rech_localisation = mysql_query($sql2, $connexion);
/* Un petit compteur pour les localisations */
$nb_localisation = 0;
/* On crée un tableau pour les localisations */
$localisation = array();
/* On va mettre les localisations dans le tableau */
while($ligne_localisation = mysql_fetch_assoc($rech_localisation))
{
array_push($localisation, $ligne_localisation['localisation']);
$nb_localisation++;
}
/* Maintenant on peut construire la liste déroulante */
?>
<select name="localisation" id="localisation">
<?php
for($d = 0; $d<$nb_localisation; $d++)
{
?>
<option value="<?php echo($localisation[$d]); ?>"
<?php echo((isset($localisation_selectionnee) && $localisation_selectionnee == $localisation[$d])?" selected=\"selected\"":null); ?>>
<?php echo($localisation[$d]." (". $localisation[$d] .")"); ?></option>
<?php
}
?>
</select>
<?php
}
/* Un petit coup de balai */
mysql_free_result($rech_localisation);
}
?>
<br /><input type="submit" name="ok" id="ok" value="Envoyer" />
</fieldset>
</form>
<?php
/* Terminé, on ferme la connexion */
mysql_close($connexion);
}
else
{
/* Si on arrive là, c'est pas bon signe, il faut vérifier les
* paramètres de connexion, mot de passe, serveur pas démarré etc... */
?>
<p>Un incident s'est produit lors de la connexion à la base de données, veuiillez essayer à nouveau ultérieurement.</p>
<?php
}
?>
</body>
</html>
---------------------------------------------------------------------------------------------
Une gentille personne m'a trouvé la solution sur un autre site.
Pour ceux qui auraient le même problème, il manquait simplement des simples cotes!

$sql2 = "SELECT distinct `localisation`".
" FROM `analyses`".
" WHERE `affaire` = '". $idr ."' ".
" ORDER BY `localisation`;";

Moralité: comment perdre des heures bêtement... oubliez des cotes!
Bon développement!
Merci gaerebut!

J'ai modifié, ça fonctionne bien sûr sans problème.
Et en plus, c'est plus compréhensible!
Encore merci!
Je pense qu'on se recroisera dans ce forum car je vais me relancer dans la construction de ma page WEB, et je pense donc croiser de nouvelles difficultés!
à +
Bonjour messieurs!

Pour Gaerebut:
Merci pour ta réponse, et désolée pour ma réponse tardive! Pendant 2 jours, je ne peux pas beaucoup aller sur le net.
Malheurement, je ne peux pas t'envoyer de capture d'écran car tout est sur mon pc du travail.
Je le fais dès demain matin première heure (sachant que je ne suis pas une lève-tôt... lol).
En attendant, voici néanmoins le principe:
l'utilisateur saisit une AFFAIRE dans une liste déroulante d'"AFFAIRES".
S'affiche alors une liste déroulante des LOCALISATIONS, filtrée en fonction de l'AFFAIRE sélectionnée
l'utilisateur saisit une LOCALISATION dans la liste déroulante des LOCALISATIONS
S'affiche alors une liste déroulante du champs INFO3, filtrée en fonction de l'AFFAIRE et de la LOCALISATION sélectionnés.
l'utilisateur saisit une INFO3 dans la liste déroulante des INFO3.

Voili voilou. Et donc mon script fonctionne pour les listes déroulantes sur AFFAIRE et LOCALISATION. Mais je n'arrive pas à ajouter la liste sur INFO3.

A demain


Pour Nico:
Bonjour Nico, merci pour ta réponse, mais je ne comprends pas trop l'objectif. Je ne vois pas en quoi ce site répond à mon problème, en + il est bourré de fautes d'orthographes! lol
S'ils ne sont pas doués en orthographe, pour les scripts, j'ai des doutes!
à +
Bonsoir Papymucho.

Pour le mysql_pconnect() et mysql_close, je ne sais pas. Si tu me le dis, c'est que c'est vrai!

Malheureusement, je ne connais pas Ajax. (je ne suis pas développeur informatique) J'essaye de faire cette page Web pour donner un coup de main, alors j'aimerais rester dans un langage que je connais.
Effectivement, cela répond à ma problématique.
Si ce n'est pas trop compliqué pour une débutante, je suis partante!
Les deux solutions sont intéressantes.
Peut-être y en a t-il une que j'arriverais plus facilement à appréhender.
Messages postés
140
Date d'inscription
mercredi 18 juin 2008
Statut
Membre
Dernière intervention
1 novembre 2009
220
J'ai des petits problèmes avec les balises
..... le texte est coupé avant la fin de la phrase...

Du coup je suis obligé d'afficher la source pour voir le message en entier lorsque c'est nécessaire lol...
C'est pareil pour vous? désolé pour le HS...
Messages postés
1017
Date d'inscription
mardi 30 octobre 2007
Statut
Membre
Dernière intervention
22 novembre 2013
169
Je comprend pas !

Coupé ou ?
Dans quel fichier ?
Tu parle de QUOIII !????
lol

A+

Gaerebut
Messages postés
140
Date d'inscription
mercredi 18 juin 2008
Statut
Membre
Dernière intervention
1 novembre 2009
220
Lol Gaerebut désolé, je parle du forum..... J'ai les messages qui sont coupés des que du code a été indenté dedans....
J'ai pas les fins de phrase, juste le début, je dois afficher la source pour avoir la fin c'est lourd...
Wouahou! Merci les gars, vous cartonnez!

Je teste les 2 solutions ce soir ou demain (je ne pourrais pas aller à mon pc pour la journée... maheureusement car je meurs d'envie de tester!!!).

Merci encore!
Je vous tiens au courant de mon avancée. Avec vos éléments, je pense avancer vite.
Bonne journée
Messages postés
1017
Date d'inscription
mardi 30 octobre 2007
Statut
Membre
Dernière intervention
22 novembre 2013
169
De rien ^^

N'hésite pas si il y a le moindre problème ;)

A+

Gaerebut
Bonjour à vous deux,
j'ai posté un petit message à mon réveil pour vous remercier, mais il ne s'affiche pas.
J'ai du faire une mauvaise manip'. Ou alors il va s'afficher en retard.
Bref, tout ça pour vous remercier pour vos coups de main. Trop fort les gars! ;-)
Aujourd'hui, je ne peux pas trop aller sur mon pc, alors je retravaille sur mon script ce soir ou demain après-midi.
Je vous tiens au courant de mes avancées, et à mon avis, je vais bien avancer grâce à vous!
Merci
à +
Ah ok je l'ai retrouvé il est au dessus! J'ai du ouvrir une nouvelle discussion par erreur!
Si quelqu'un sait comment la supprimer...
Coucou les gars,
ok, ça fait 2 fois que j'essaye de poster ce message... Et il est posté mais pas sur la bonne page. :-( Un peu bizarre.
J'espère que cette fois, il ira au bon endroit.
Bref, je voulais vous remercier pour votre aide. Trop fort les gars!
Je ne peux pas accéder à mon pc aujourd'hui donc je retravaille sur mon script ce soir ou demain après-midi.
Je vous tient au courant de mes avancées, et je pense avancer vite.
Encore merci,
à +
Ok, en cliquant sur 2, ça fonctionne mieux!!!!
lol! MDR
C'est pas facile le matin!
Désolée