Listes de valeurs dependantes en PHP + MYSQL

Résolu/Fermé
Signaler
-
 Willy -
Salut les amis !
Je suis désespéré. Je voudrais faire une page web sur laquelle ya 2 listes:

"Direction" et "Departement"

Les listes prennent leur valeurs dans ue base de données. Avec PHP je regle ça tres bien.

Je veux rendre dépendantes les deux listes de telle sorte que par exemple:
si on choisit la Direction de la Compatbilité, on ait seulement les département appartenant à la comptabilité dans le select "Departement".
Cela suppose ke la table d'ou "departement " tire ses infos a un champ Direction. Pas de probleme coté BD!

je crois ke cela revient à ecrire un code ki peut renseigner les valeurs d'un select en tirant ses infos d'une BD sur evenement onchange avec pour parametre la valuer de select en cours ke l'on va aller concatener à un sql.

Et la je crois ke l'on doit mélanger PHP et Javascript. ( !!! ! )

Avez vous deja eu un problème similaire ? Si oui aidez moi à le résoudre SVP.

17 réponses

-------------------------------Code de la BD ---------------------


-- phpMyAdmin SQL Dump
-- version 2.6.1
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Lundi 17 Octobre 2005 à 18:46
-- Version du serveur: 4.1.11
-- Version de PHP: 4.3.10-16
--
-- Base de données: `marc`
--

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

--
-- Structure de la table `departement`
--

CREATE TABLE `departement` (
`CODEPARTEMENT` int(11) NOT NULL default '0',
`CODEDIRECTION` int(11) NOT NULL default '0',
`LIBELLEDEPARTEMENT` varchar(50) default NULL,
PRIMARY KEY (`CODEPARTEMENT`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Contenu de la table `departement`
--

INSERT INTO `departement` VALUES (6, 3, 'DRH');
INSERT INTO `departement` VALUES (5, 3, 'DAP');
INSERT INTO `departement` VALUES (4, 2, 'CCI');
INSERT INTO `departement` VALUES (3, 2, 'DE');
INSERT INTO `departement` VALUES (2, 2, 'DST');
INSERT INTO `departement` VALUES (1, 2, 'DED');
INSERT INTO `departement` VALUES (7, 3, 'DCB');
INSERT INTO `departement` VALUES (8, 1, 'DM');
INSERT INTO `departement` VALUES (9, 1, 'DECP');
INSERT INTO `departement` VALUES (10, 1, 'DT');
INSERT INTO `departement` VALUES (11, 1, 'DEMSP');

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

--
-- Structure de la table `direction`
--

CREATE TABLE `direction` (
`CODEDIRECTION` int(11) NOT NULL default '0',
`LIBELLEDIRECTION` varchar(50) default NULL,
PRIMARY KEY (`CODEDIRECTION`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Contenu de la table `direction`
--

INSERT INTO `direction` VALUES (6, 'DR ABENGOUROU');
INSERT INTO `direction` VALUES (5, 'DR BOUAKE');
INSERT INTO `direction` VALUES (4, 'DR ABIDJAN');
INSERT INTO `direction` VALUES (3, 'DAC');
INSERT INTO `direction` VALUES (2, 'DSI');
INSERT INTO `direction` VALUES (1, 'DO');
INSERT INTO `direction` VALUES (7, 'DR KORHOGO');



-------------------------------Extrait de la classe avec laquelle je fais les acces bd ---------------------

ClsBd.php:


/**********************************************************
**** classe de gestion de l'accès aux données ***
***********************************************************/
class ClsBd
{
var $dbHostName="10.1.50.244"; //Nom du serveur de données
var $dbName="marc"; //Nom de la base de données
var $dbUserName="marc"; //Nom de l'utilisateur légitime de la base de données
var $dbUserPass="marc"; //Mot de passe de l'utilisateur légitime
var $lastConID=0; // Etat de la dernière demande de connexion au serveur
var $lastQueryID=0;//Identificateur de la dernière requête exécutée
var $record=array(); //contient le dernier enregistrement récupéré

var $connectError=1;
var $closeConnectError=2;
var $openDBError=3;
var $selectError=4;


var $IDErreur=null;

//--------------- connexion au serveur de données


// Utilisation

function connect()
{
if ($this->lastConID==0) //La dernière connexion a échoué
{
$this->lastConID=mysql_connect($this->dbHostName, $this->dbUserName,$this->dbUserPass);
if (!$this->lastConID)
{
$this->IDErreur=$this->connectError;
return false;
}
return true;
}
return true;
}

//--------------- ferme la connexion a la base de donnees


// Utilisation

function closeConnection()
{
if (mysql_close($this->lastConID))
{
return true;
}
$this->IDErreur=$this->closeConnectError;
return false;
}


//----------- Active la base de données


// Utilisation

function openDB()
{
if (mysql_select_db($this->dbName,$this->lastConID))
{
return true;
}
$this->IDErreur=$this->openDBError;
$this->closeConnection();
return false;
}



// Utilisation

function executeQuery($strQuery)
{
$ok=false;
if ($this->connect()) //La connexion au serveur de données a reussi
{
if ($this->openDB()) // L'ouverture de la base de données a reussi
{
$this->lastQueryID=mysql_query($strQuery,$this->lastConID);
if ($this->lastQueryID) //La requete s'est execute avec succes
{
$ok=true;
}
}
}
return $ok;
}




//------------- Retourne le nombre d'enregistrements affectes par la derniere requete action


function recordsAffected()
{
return mysql_affected_rows($this->lastConID);
}

//-------------- Retourne le nombre d'enregistrements renvoyés par la dernière requête selection

function recordCount()
{
return mysql_num_rows($this->lastQueryID);
}

//---------------- Retourne l'enregistrement suivant

function nextRecord()
{
$this->record=mysql_fetch_array($this->lastQueryID);
if (!$this->record || !is_array($this->record))
{
return false;
}
else
{
return $this->record;
}
}


function selectRecords($strQuery)
{
if (!$this->executeQuery($strQuery))
{
$this->IDErreur=$this->selectError;
return false;
}
if ($this->recordCount()>0)
{
$returnArray=array();
while($line=$this->nextRecord())
{
$returnArray[]=$line;
}
return $returnArray;
}
return false;
}



}






------------------------------------la feuille html/php-----------------------

<html>
<head>
<title>FICHE DE DEMANDE</title>
<? require_once("ClsBd.php"); ?>


<script language="javascript">
function get_record(critere, form)
{

[code]
var maTable = Array(3);
var i=0;
// Creation d'une instance
$ObjVehicule = new ClsBd();
// initialisation de la requete (probleme car ne sais pas cmt faire passer le js ds le php)
$sql = "select CODEPARTEMENT, LIBELLEDEPARTEMENT from departement where CODEDIRECTION =".critere." order by LIBELLEDEPARTEMENT desc";
// echo $sql;
// mise en exécution
$liste = $ObjVehicule->selectRecords($sql);
if (is_array($liste))
foreach ($liste as $c => $record)
{ var p=new Option($record[1],$record[0]);
form.departement.options[i]=p;
i++;
}

/*maTable["Direction1"] = Array("Departement 1A", "Departement 1B");
maTable["Direction2"] = Array("Departement 2A", "Departement 2B");
maTable["Direction3"] = Array("Departement 3A", "Departement 3B");*/
[/code]

}
</script>

</head>
<body>




<form name="form1" method="post" action="">
<table width="100%" border="0" class="normal">
<tr>
<td colspan="7" align="center"><h4><U>DEMANDE</U></h4></td>
</tr>
<tr>
<td> </td>
<td> </td>
<td colspan="3"> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td width="1%"> </td>
<td width="16%"><strong>Direction</strong></td>
<td width="2%" colspan="2">
<?
// Creation d'une instance
$ObjVehicule = new ClsBd();
// initialisation de la requete
$sql = "select CODEDIRECTION, LIBELLEDIRECTION from direction order by LIBELLEDIRECTION desc";
// mise en exécution
$liste = $ObjVehicule->selectRecords($sql);
// echo $sql;
// exploitation des resultats
?>
<!-- je crois ke cest ici kil faut declencher la fonction javascript -->
<select name="direction" class="inputextst" id="dir" onChange="get_record(this.value, 'form1')" >
<? if (is_array($liste))
foreach ($liste as $c => $record)
echo "<option value=$record[0] >$record[1]</option>";
?>

</select> </td>
<td width="28%" align="right"> </td>
<td width="28%" align="left"> 
</td>
<td width="5%"> 

</td>
</tr>
<tr>
<td> </td>
<td><strong>Département</strong></td>
<td colspan="2">

<!-- ICI LA COMPOSITION DE LA LISTE "departement" -->
<!-- Pour l'utilisation de la classe voir les 2 autres select -->

 
</td>
<td align="right"><strong>Service  </strong></td>
<td align="left">
<?
// initialisation de la requete
$sql = "select CODESERVICE, LIBELLESERVICE from service order by LIBELLESERVICE desc";
// mise en exécution
$liste = $ObjVehicule->selectRecords($sql);
// exploitation des resultats
echo "<select name=service class=inputextst>";
if (is_array($liste))
foreach ($liste as $c => $record)
echo "<option value=$record[0] selected>$record[1]</option>";
echo "</select>";
?>
</td>
<td> 

</td>
</tr>
<tr>
<td> </td>
<td> </td>
<td width="20%" > </td>
<td colspan="2"> </td>
<td> </td>
<td> </td>
</tr>
</table>

</form>

</body></html>



Voila mon code! je suis perdu entre le PHP et javascript.
Si tu peux regarder et t'inspirer de cela pour m'en dire un peu plus.
La foncton " get_record(critere, form)" est sensée etre en javascript : je sais ke j'ai fait un peu n'importe quoi !!!.
Et c'est cette fonction la ki doit utiliser les fonctions de la classe PHP deja ecrite en PHP pour fournir les resultats
escomptés cad les departements en fonction des directions.

Si tu as des reference javascripts ke je peux consulter en ligne je suis preneur d'adresse
mais il faut ke ce script marche !!!

Merci de m'aider ou de me dire ou je peux trouver de l'aide
1
Merci

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

CCM 41989 internautes nous ont dit merci ce mois-ci


pourquoi ne pas mettre
$reponse = mysql_query("SELECT * FROM nom_table where service='direction"); et tu rajoute un champdans ta bdd, par exemple, service
Le champ ds la BD est deja prevu. Mais le PB c'est ke "direction" doit etre la valeur du controle nomme direction sur la feuille.

j'ai deux controles:
le premier

<select name="direction">
-----
</select>

et le second

<select name="ddepartement">
-----
</select>


et il faut ke chake fois ke je change la valeur de direction, celle de departement suive.
Tu vois le truc ?
N'hesiste pas si ta d'autres idees



$reponse = mysql_query("SELECT * FROM nom_table where service='direction");
Messages postés
2025
Date d'inscription
jeudi 22 septembre 2005
Statut
Membre
Dernière intervention
18 novembre 2015
203
oula j'ai un peu de mal a tout capter mais, tu peux pas faire ça en prenant par exemple :

dir=document.nomForm.direction.value;
puis tu mets ca dans l'uRL
document.location.href="http://www.tonsite.com/switch.php?dir="+dir;
(ca sur un Onchange comme tu l'as dits biensur ...)

et dans le switch.php c'est ta page dans laquelle tu es (celle qui contient les 2 select ) ,tu récup' la variable dir et du coup tu affiches dans le departement en fonction de la valeur que t'as dans $dir..
genre: $reponse = mysql_query("SELECT * FROM nom_table where service='$dir' ");

Je sais pas si j'ai tout saisie, mais j'espère que ca te fillera un coup de main ..

Zep3k!GnO
-->hi i hi o on va pa sau boulot :P
Messages postés
481
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
20 avril 2006
107
Il faut faire ça en javascript principalement.
Le javascript doit être lui généré par le PHP.


tu dois créer une table en javascript come suit grâce à php et aux résultats de ta requête :

[code]
var maTable = Array(3);
maTable["Direction1"] = Array("Departement 1A", "Departement 1B");
maTable["Direction2"] = Array("Departement 2A", "Departement 2B");
maTable["Direction3"] = Array("Departement 3A", "Departement 3B");
[/code]

ensuite, fait une fonction qui charge la partie de la table qui t'intéresses dans la liste de Département. tu déclenches la fonction sur un onchange par exemple.


Voilà, j'espère avoir été suffisamment clair :)
Mais vois tu c'est combiner le code PHP et Javascrit qui me pose probleme. Surtout quand les structures deviennent complikées.

exemple tableau, etc

Comment générer le code Js a partir de PHP ?

Dans tous les cas e tente le coup fort de tes suggestion et te fais le CR

Merci pour le coup de pouce
Messages postés
481
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
20 avril 2006
107
le js n'est pas différent du html dans ce sens ...
Ok vais tenter le coup
Messages postés
481
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
20 avril 2006
107
Si t'as un problème, pose ton code ici (n'oublie pas de le mettre entre les balise code), j'essaierais de le corriger.
Merci de m'aider ou de me dire ou je peux trouver de l'aide. Voir mon code ci-dessus

Je cherche un document montrant comment on peut allier PHP et Javascript.

En particulier un code Javascript ou l'on a fait appel à des fonctions écrites en PHP

Merci les gars de votre coopération
Messages postés
83
Date d'inscription
samedi 19 mars 2005
Statut
Membre
Dernière intervention
8 avril 2013
54
Php et javascript se completent mais ne peuvent pas "s'appeler" l'un l'autre!

car :
1)php s'éxecute sur le serveur avant l'envoi de la page au client :
il peut donc générer du code javascript sur condition avant d'envoyer la page mais ne peut pas accéder au variables javascript!
2)javascript s'execute sur le poste client : impossible d'executer du php à partir de javascript ce qui est apparement ton objectif :

lorsque tu selectionne la liste déroulante (select) tu veut que cela change le contenu de l'autre liste. Pour cela plusieurs solutions qui dépendent entre autre des navigateurs sur lesquels tu veut l'executer!
si tu est exclusivement en Internet Explorer alors tu peux utiliser :
innerhtml :
(edit maj meilleur lien)
http://fr.selfhtml.org/javascript/objets/all.htm#inner_html
ou/et
Xmlhttprequest :
http://www.toutjavascript.com/savoir/xmlhttprequest.php3#section_01

quel sont les navigateurs ciblés?
Tu as bien compris mon problème en effet

Ok je vais regarder les pages et je dirai si j'avance

Merci pr tt
Messages postés
83
Date d'inscription
samedi 19 mars 2005
Statut
Membre
Dernière intervention
8 avril 2013
54
L'exemple suivant illustre exactement ce que tu veux faire :
http://www.toutjavascript.com/savoir/xmlhttprequest.php3#section_05

Avec xmlhttprequest on peux faire tout un tas de truc qu'on ne pouvait pas faire avant sans recharger toute la page!
On obtient alors des interfaces beaucoup plus intéractives et rapides à répondre (cf gmail qui utilise cette techno à fond)

attention cependant : compatible IE et firefox seulement!
AH !!!!
Merci bcp. Je sens que c'est très intéressant !
Meme sil est compatible IE slmt, je le prendrai !

Salut et merci encore

Je te dirai qd j'aurai resolu mon PB
Salut !

J'ai pu a adapter le code à mes besoins
Merci bcp pour votre aide
Si vs voulez avoir copie, vs pouvez m'ecrire à

ixtobilly@yahoo.fr
Messages postés
481
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
20 avril 2006
107
ah bah, j'arrive trop tard. Ben tant pis :p ou plutôt tant mieux pour toi :o)

Messages postés
26
Date d'inscription
vendredi 15 décembre 2006
Statut
Membre
Dernière intervention
18 août 2013
7
J'ai le meme probleme gars, est ce que tu peux bien me passer le code qui a fonctionner ?

Merci d'avance