<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>{ rawsrc::code() } &#187; tutos</title>
	<atom:link href="https://blog.developpez.com/rawsrc/pcategory/php-5-3/tutos/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/rawsrc</link>
	<description></description>
	<lastBuildDate>Fri, 07 Sep 2012 20:16:17 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Listes liéee : PHP, mySql, jQuery (ajax)</title>
		<link>https://blog.developpez.com/rawsrc/p10256/php-5-3/tutos/listes_lieee_php_mysql_jquery_ajax</link>
		<comments>https://blog.developpez.com/rawsrc/p10256/php-5-3/tutos/listes_lieee_php_mysql_jquery_ajax#comments</comments>
		<pubDate>Wed, 21 Sep 2011 10:50:00 +0000</pubDate>
		<dc:creator><![CDATA[rawsrc]]></dc:creator>
				<category><![CDATA[tutos]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, Faisant suite à ma participation à une discussion concernant la gestion de listes liées en PHP, j&#8217;ai décidé de faire un exemple détaillé afin de faciliter la vie de certains. Je tiens à remericer CinePhil pour la problématique d&#8217;exemple. Environnement technique PHP 5.3+ jQuery 1.6.3 MySql 5.1.53 Community 1. Problématique On gère un planning de sessions d&#8217;examens ayant les règles suivantes : Une session est obligatoirement datée et localisée dans une ville Une session [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour,</p>
<p>Faisant suite à ma participation à une discussion concernant la gestion de listes liées en PHP, j&rsquo;ai décidé de faire un exemple détaillé afin de faciliter la vie de certains.<br />
Je tiens à remericer <a href="http://www.developpez.net/forums/u111343/cinephil/"><strong>CinePhil</strong></a> pour la problématique d&rsquo;exemple.<br />
<span id="more-3"></span></p>
<p><strong>Environnement technique</strong></p>
<p>PHP 5.3+<br />
jQuery 1.6.3<br />
MySql 5.1.53 Community</p>
<p><strong>1. Problématique</strong></p>
<p>On gère un planning de sessions d&rsquo;examens ayant les règles suivantes :</p>
<ul>
<li>Une session est obligatoirement datée et localisée dans une ville</li>
<li>Une session propose indépendammment une liste de matières</li>
<li>Pour chaque couple session/matiere, on suit un nombre d&rsquo;inscrits</li>
</ul>
<p>On souhaite permettre à un utilisateur d&rsquo;affiner une recherche par des sélections successives de critères dans des listes déroulantes.</p>
<p><strong>2. Concept et fonctionnalités</strong></p>
<p>L&rsquo;idée principale est de mettre à jour le contenu des listes de sélection <strong>non encore sélectionnées</strong> en fonction des critères des listes voisines déjà sélectionnées.<br />
Au démarrage chaque liste contient toutes les données possibles et le filtrage commence dès la première sélection.<br />
Il doit être possible de retirer un critère de filtrage en ne sélectionnant aucune donnée de la liste. Le retrait du critère est matérialisé par une ligne vide au début de chaque liste.<br />
A chaque sélection, les données répondant aux critères doivent être immédiatement affichées.</p>
<p><strong>3. Base de données</strong></p>
<p>On va élaborer une simple base de données mySql correspondant à l&rsquo;ennoncé et la remplir avec quelques données :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/mcd.png" alt="MCD" title="Schéma de la base de données" /></p>
<p><strong>Extrait de données des sessions :</strong></p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/data.png" alt="DATA" title="Extrait des données" /></p>
<p><a href="http://www.proside.fr/dvp/php/tutos/listesLiees/mysql.sql"><strong>SCRIPT SQL</strong></a></p>
<p><strong>4. Rendu et affichage</strong></p>
<p>Intéressons nous maintenant au code HTML.<br />
Une zone de liste est codée ainsi :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/zdlm.png" alt="select" title="Liste de sélection" /></p>
<p>Notre liste gère l&rsquo;évènement <code class="codecolorer text default"><span class="text">onchange</span></code> ce qui permet de lui rattacher une fonction javascript qui sera appelée à chaque changement de sélection.<br />
Concrètement, nous allons donc remplacer la totalité des <code class="codecolorer text default"><span class="text">&lt;option value=&quot;...&quot;&gt;...&lt;/option&gt;</span></code> des listes voisines par des valeurs filtrées et renvoyées par le serveur après un appel ajax.</p>
<p><strong>4.A Inventaire des zones de liste</strong></p>
<ol>
<li>Jours</li>
<li>Mois</li>
<li>Années</li>
<li>Villes</li>
<li>Matières</li>
</ol>
<p><strong>4.B Tableau des données</strong></p>
<p>On affiche les colonnes suivantes :</p>
<ol>
<li>Villes</li>
<li>Dates</li>
<li>Matières</li>
<li>NB inscrits</li>
</ol>
<p>Les données seront triées par : Ville ASC, Date DESC, Matière ASC<br />
Notre table de données est codée ainsi :</p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/table.png" alt="select" title="Table de données
" /></p>
<p><strong>5. Format d&rsquo;échange des données</strong></p>
<p>jQuery manipule parfaitement les formats XML et JSON.<br />
Par convention, toutes les données (code des listes et code du tableau des données) seront renvoyées par le serveur au format XML :</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; <br />
&lt;xml&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;jours&gt;&lt;/jours&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;mois&gt;&lt;/mois&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;annees&gt;&lt;/annees&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;villes&gt;&lt;/villes&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;matieres&gt;&lt;/matieres&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;table&gt;&lt;/table&gt; <br />
&lt;/xml&gt;</div></td></tr></tbody></table></div>
<p><strong>6. Code de la page de démarrage : appel initial</strong></p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot;&gt; <br />
&lt;html&gt; <br />
&lt;head&gt; <br />
&nbsp; &nbsp;&lt;meta http-equiv=&quot;Cache-Control&quot; content=&quot;no-cache&quot;&gt; <br />
&nbsp; &nbsp;&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt; <br />
&nbsp; &nbsp;&lt;title&gt;Listes liées&lt;/title&gt; <br />
&nbsp; &nbsp;&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;my.css&quot;&gt; <br />
&nbsp; &nbsp;&lt;script type=&quot;application/javascript&quot; charset=&quot;utf-8&quot; src=&quot;http://code.jquery.com/jquery-1.6.3.min.js&quot;&gt;&lt;/script&gt; <br />
&nbsp; &nbsp;&lt;script type=&quot;application/javascript&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; function filterLists() { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// ici on récupère les valeurs sélectionnées pour chaque liste avec les sélecteurs de jQuery <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var jour &nbsp; &nbsp;= $('#jours option:selected').val(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var mois &nbsp; &nbsp;= $('#mois option:selected').val(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var annee &nbsp; = $('#annees option:selected').val(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var ville &nbsp; = $('#villes option:selected').val(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var matiere = $('#matieres option:selected').val(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// on fait notre appel ajax paramétré (pas besoin de s'occuper de l'implémentation du XMLHttpRequest, jQuery le fait pour toi) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$.ajax({ <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type: 'POST', &nbsp; // méthode de transmission des données <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url: 'filterLists.php', &nbsp; // script à exécuter sur le serveur <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data: 'jour='+jour+'&amp;mois='+mois+'&amp;annee='+annee+'&amp;ville='+ville+'&amp;matiere='+matiere, &nbsp; // données à passer au script via le tableau $_POST <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dataType: 'xml', &nbsp; // type des données attendues en retour : ici xml <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cache: false, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; success: function(response) { &nbsp; // traitement du résultat (= données reçues du serveur) une fois l'appel ajax réussi <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var code; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// vu que la réponse est au format xml, on demande à jquery de trouver des noeuds spécifiques <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// et si ces noeuds contiennent des données alors on remplace les données des listes liées par celles renvoyées par le serveur <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// en clair : on remplace si nécessaire l'ensemble des lignes &lt;option value=&quot;&quot;&gt;&lt;/option&gt; pour chaque liste qui n'a pas encore de sélection <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((code = $(response).find('jours').text()).length) &nbsp; &nbsp;$('#jours').html(code); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((code = $(response).find('mois').text()).length) &nbsp; &nbsp; $('#mois').html(code); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((code = $(response).find('annees').text()).length) &nbsp; $('#annees').html(code); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((code = $(response).find('villes').text()).length) &nbsp; $('#villes').html(code); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((code = $(response).find('matieres').text()).length) $('#matieres').html(code); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((code = $(response).find('table').text()).length) &nbsp; &nbsp;$('#table').html(code); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}); <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp;&lt;/script&gt; <br />
&nbsp; &nbsp;&lt;style type=&quot;text/css&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; body { font-family: &quot;arial&quot;; } <br />
&nbsp; &nbsp; &nbsp; table { width: 600px;;} <br />
&nbsp; &nbsp; &nbsp; table, tr, th, td { border: 1px solid black; border-collapse: collapse; padding: 4px;} <br />
&nbsp; &nbsp; &nbsp; .alignr { text-align: right; } <br />
&nbsp; &nbsp; &nbsp; .alignc { text-align: center; } <br />
&nbsp; &nbsp;&lt;/style&gt; <br />
&lt;/head&gt; <br />
&lt;body&gt; <br />
&nbsp; &nbsp;&lt;?php <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // ICI MODIFIEZ LE PARAMETRAGE <br />
&nbsp; &nbsp; &nbsp; // Connexion à la base de données <br />
&nbsp; &nbsp; &nbsp; $server = 'localhost'; <br />
&nbsp; &nbsp; &nbsp; $user &nbsp; = 'root'; <br />
&nbsp; &nbsp; &nbsp; $pwd &nbsp; &nbsp;= 'root'; <br />
&nbsp; &nbsp; &nbsp; $dbName = 'test'; <br />
&nbsp; &nbsp; &nbsp; $cnx &nbsp; &nbsp;= mysql_connect($server, $user, $pwd); <br />
&nbsp; &nbsp; &nbsp; $db &nbsp; &nbsp; = mysql_select_db($dbName); <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // Au démarrage, aucune sélection : on extrait toutes les données individuellement pour chaque liste <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // JOURS <br />
&nbsp; &nbsp; &nbsp; $sql = 'SELECT DISTINCT DAY(t_session.date_) FROM t_session ORDER BY DAY(t_session.date_);'; <br />
&nbsp; &nbsp; &nbsp; $qry = mysql_query($sql); <br />
&nbsp; &nbsp; &nbsp; while($row = mysql_fetch_row($qry)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$jours[] = $row[0]; <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // MOIS <br />
&nbsp; &nbsp; &nbsp; $sql = 'SELECT DISTINCT MONTH(t_session.date_) FROM t_session ORDER BY MONTH(t_session.date_);'; <br />
&nbsp; &nbsp; &nbsp; $qry = mysql_query($sql); <br />
&nbsp; &nbsp; &nbsp; while($row = mysql_fetch_row($qry)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$mois[] = $row[0]; <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // ANNEES <br />
&nbsp; &nbsp; &nbsp; $sql = 'SELECT DISTINCT YEAR(t_session.date_) FROM t_session ORDER BY YEAR(t_session.date_);'; <br />
&nbsp; &nbsp; &nbsp; $qry = mysql_query($sql); <br />
&nbsp; &nbsp; &nbsp; while($row = mysql_fetch_row($qry)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$annees[] = $row[0]; <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // VILLES <br />
&nbsp; &nbsp; &nbsp; $sql = 'SELECT DISTINCT t_ville.idVille, t_ville.ville FROM t_ville ORDER BY t_ville.ville;'; <br />
&nbsp; &nbsp; &nbsp; $qry = mysql_query($sql); <br />
&nbsp; &nbsp; &nbsp; while($row = mysql_fetch_row($qry)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$villes[$row[0]] = $row[1]; <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // MATIERES <br />
&nbsp; &nbsp; &nbsp; $sql = 'SELECT DISTINCT t_matiere.idMatiere, t_matiere.matiere FROM t_matiere ORDER BY t_matiere.matiere;'; <br />
&nbsp; &nbsp; &nbsp; $qry = mysql_query($sql); <br />
&nbsp; &nbsp; &nbsp; while($row = mysql_fetch_row($qry)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$matieres[$row[0]] = $row[1]; <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // DONNES DE LA TABLE <br />
&nbsp; &nbsp; &nbsp; $sql = &lt;&lt;&lt;SQL <br />
SELECT t_ville.ville, t_session.date_, t_matiere.matiere, t_session_matiere.nbInscrit <br />
FROM t_session_matiere &nbsp;<br />
&nbsp; &nbsp;INNER JOIN t_matiere ON t_session_matiere.idMatiere = t_matiere.idMatiere <br />
&nbsp; &nbsp;INNER JOIN t_session ON t_session_matiere.idSession = t_session.idSession <br />
&nbsp; &nbsp;INNER JOIN t_ville &nbsp; ON t_session.idVille &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = t_ville.idVille <br />
ORDER BY <br />
&nbsp; &nbsp;t_ville.ville ASC, &nbsp;<br />
&nbsp; &nbsp;t_session.date_ DESC, &nbsp;<br />
&nbsp; &nbsp;t_matiere.matiere ASC; <br />
SQL; <br />
&nbsp; &nbsp; &nbsp; $qry = mysql_query($sql); <br />
&nbsp; &nbsp; &nbsp; while($row = mysql_fetch_assoc($qry)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$data[] = $row; <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; // pour chaque liste il faut prévoir leur retrait du filtre &nbsp;<br />
&nbsp; &nbsp; &nbsp; // en insérant une ligne vide en début de liste : &lt;option value=&quot;&quot;&gt;&lt;/option&gt; <br />
&nbsp; &nbsp;?&gt; <br />
&nbsp;<br />
&nbsp; &nbsp;&lt;p&gt;&lt;strong&gt;SESSIONS D'EXAMENS&lt;/strong&gt;&lt;/p&gt; <br />
&nbsp; &nbsp;&lt;p&gt;Sélectionnez de un à plusieurs critères de recherche.&lt;/p&gt; <br />
&nbsp; &nbsp;&lt;form id=&quot;frmRecherche&quot;&gt; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &lt;!-- Liste des jours --&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;label for=&quot;jours&quot;&gt;Jours&lt;/label&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;select id=&quot;jours&quot; onchange=&quot;filterLists();&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&quot;&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php foreach($jours as$jour): ?&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&lt;?php echo $jour; ?&gt;&quot;&gt;&lt;?php echo $jour; ?&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php endforeach; ?&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;/select&gt; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &lt;!-- Liste des mois --&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;label for=&quot;mois&quot;&gt;Mois&lt;/label&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;select id=&quot;mois&quot; onchange=&quot;filterLists();&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&quot;&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php foreach($mois as $unMois): ?&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&lt;?php echo $unMois; ?&gt;&quot;&gt;&lt;?php echo $unMois; ?&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php endforeach; ?&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;/select&gt; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &lt;!-- Liste des années --&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;label for=&quot;annees&quot;&gt;Années&lt;/label&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;select id=&quot;annees&quot; onchange=&quot;filterLists();&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&quot;&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php foreach($annees as $annee): ?&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&lt;?php echo $annee; ?&gt;&quot;&gt;&lt;?php echo $annee; ?&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php endforeach; ?&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;/select&gt; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &lt;!-- Liste des villes --&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;label for=&quot;villes&quot;&gt;Villes&lt;/label&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;select id=&quot;villes&quot; onchange=&quot;filterLists();&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&quot;&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php foreach($villes as $id =&gt; $ville): ?&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&lt;?php echo $id; ?&gt;&quot;&gt;&lt;?php echo $ville; ?&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php endforeach; ?&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;/select&gt; <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &lt;!-- Liste des matières --&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;label for=&quot;matieres&quot;&gt;Matières&lt;/label&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;select id=&quot;matieres&quot; onchange=&quot;filterLists();&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&quot;&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php foreach($matieres as $id =&gt; $matiere): ?&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;option value=&quot;&lt;?php echo $id; ?&gt;&quot;&gt;&lt;?php echo $matiere; ?&gt;&lt;/option&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;?php endforeach; ?&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;/select&gt; <br />
&nbsp; &nbsp;&lt;/form&gt; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&lt;!-- Données de la table --&gt; <br />
&nbsp; &nbsp;&lt;table&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;thead&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;tr&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;th&gt;VILLES&lt;/th&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;th&gt;DATES&lt;/th&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;th&gt;MATIERES&lt;/th&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;th&gt;NB Inscrits&lt;/th&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/tr&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;/thead&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &lt;tbody id=&quot;table&quot;&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;?php foreach($data as $row): ?&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;tr&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td&gt;&lt;?php echo $row['ville']; ?&gt;&lt;/td&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td class=&quot;alignc&quot;&gt;&lt;?php echo $row['date_']; ?&gt;&lt;/td&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td&gt;&lt;?php echo $row['matiere']; ?&gt;&lt;/td&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td class=&quot;alignr&quot;&gt;&lt;?php echo $row['nbInscrit']; ?&gt;&lt;/td&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/tr&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;?php endforeach; ?&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;/tbody&gt; <br />
&nbsp; &nbsp;&lt;/table&gt; <br />
&lt;/body&gt; <br />
&lt;/html&gt;</div></td></tr></tbody></table></div>
<p><strong>7. Code de la page de traitement à chaque séléction d&rsquo;un élément d&rsquo;une liste : filterLists.php</strong></p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;?php <br />
&nbsp;<br />
// Ce script est appelé à chaque sélection d'un élément d'une liste <br />
&nbsp;<br />
// suivi du critère <br />
$where &nbsp; = array(); <br />
$data &nbsp; &nbsp;= array(); <br />
&nbsp;<br />
// données sélectionnées =&gt; filtres <br />
$jour &nbsp; &nbsp;= NULL; <br />
$mois &nbsp; &nbsp;= NULL; <br />
$annee &nbsp; = NULL; <br />
$ville &nbsp; = NULL; <br />
$matiere = NULL; <br />
&nbsp;<br />
/** <br />
&nbsp;* CE SCRIPT ANALYSE LES SELECTIONS ET RENVOIE DES DONNEES AU FORMAT XML &nbsp;<br />
&nbsp;* La structure correspond à ce que jQuery attend pour mettre à jour la page <br />
&nbsp;* &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &nbsp;<br />
&nbsp;* &nbsp; &nbsp;&lt;xml&gt; &nbsp;<br />
&nbsp;* &nbsp; &nbsp;&lt;jours&gt;&lt;/jours&gt; &nbsp;<br />
&nbsp;* &nbsp; &nbsp;&lt;mois&gt;&lt;/mois&gt; &nbsp;<br />
&nbsp;* &nbsp; &nbsp;&lt;annees&gt;&lt;/annees&gt; &nbsp;<br />
&nbsp;* &nbsp; &nbsp;&lt;villes&gt;&lt;/villes&gt; &nbsp;<br />
&nbsp;* &nbsp; &nbsp;&lt;matieres&gt;&lt;/matieres&gt; &nbsp;<br />
&nbsp;* &nbsp; &nbsp;&lt;table&gt;&lt;/table&gt; &nbsp;<br />
&nbsp;* &lt;/xml&gt; &nbsp;<br />
&nbsp;* <br />
&nbsp;* @var SimpleXMLElement <br />
&nbsp;*/ <br />
$xml = simplexml_load_string('&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;&lt;xml&gt;&lt;/xml&gt;'); <br />
&nbsp;<br />
// on parcourt le tableau $_POST et on vérifie quelles sont les listes qui ont une sélection <br />
&nbsp;<br />
// jour <br />
if (isset($_POST['jour']) &amp;&amp; (ctype_digit(&quot;{$_POST['jour']}&quot;))) { <br />
&nbsp; &nbsp;$jour = $_POST['jour']; <br />
&nbsp; &nbsp;$where[] = 'DAY(t_session.date_) = ' . intval($jour); <br />
} <br />
&nbsp;<br />
//mois <br />
if (isset($_POST['mois']) &amp;&amp; (ctype_digit(&quot;{$_POST['mois']}&quot;))) { <br />
&nbsp; &nbsp;$mois = $_POST['mois']; <br />
&nbsp; &nbsp;$where[] = 'MONTH(t_session.date_) = ' . intval($mois); <br />
} <br />
&nbsp;<br />
// année <br />
if (isset($_POST['annee']) &amp;&amp; (ctype_digit(&quot;{$_POST['annee']}&quot;))) { <br />
&nbsp; &nbsp;$annee = $_POST['annee']; <br />
&nbsp; &nbsp;$where[] = 'YEAR(t_session.date_) = ' . intval($annee); <br />
} <br />
&nbsp;<br />
// villes <br />
if (isset($_POST['ville']) &amp;&amp; (ctype_digit(&quot;{$_POST['ville']}&quot;))) { <br />
&nbsp; &nbsp;$ville = $_POST['ville']; <br />
&nbsp; &nbsp;$where[] = 't_session.idVille = ' . intval($ville); <br />
} <br />
&nbsp;<br />
// matière <br />
if (isset($_POST['matiere']) &amp;&amp; (ctype_digit(&quot;{$_POST['matiere']}&quot;))) { <br />
&nbsp; &nbsp;$matiere = $_POST['matiere']; <br />
&nbsp; &nbsp;$where[] = 't_session_matiere.idMatiere = ' . intval($matiere); <br />
} <br />
&nbsp;<br />
### FILTRAGE DES DONNÉES DES LISTES (SSI RIEN N'A DÉJÀ ÉTÉ SÉLECTIONNÉ) &nbsp;<br />
$where = ( ! empty($where)) ? 'WHERE ' . implode(' AND ', $where) : NULL; <br />
&nbsp;<br />
// ICI MODIFIEZ LE PARAMETRAGE <br />
// Connexion à la base de données <br />
$server = 'localhost'; <br />
$user &nbsp; = 'root'; <br />
$pwd &nbsp; &nbsp;= 'root'; <br />
$dbName = 'test'; <br />
$cnx &nbsp; &nbsp;= mysql_connect($server, $user, $pwd); <br />
$db &nbsp; &nbsp; = mysql_select_db($dbName); <br />
&nbsp;<br />
&nbsp;<br />
// on définit le code SQL commun à toutes les requêtes <br />
// voir la chaine SQL d'extraction des données de la table (plus bas) <br />
$fromAndWhere = &lt;&lt;&lt;SQL <br />
t_session_matiere &nbsp;<br />
&nbsp; &nbsp;INNER JOIN t_matiere ON t_session_matiere.idMatiere = t_matiere.idMatiere <br />
&nbsp; &nbsp;INNER JOIN t_session ON t_session_matiere.idSession = t_session.idSession <br />
&nbsp; &nbsp;INNER JOIN t_ville &nbsp; ON t_session.idVille &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = t_ville.idVille <br />
$where <br />
SQL; <br />
&nbsp;<br />
/** <br />
&nbsp;* Crée le code HTML pour les liste relatives aux dates : Jours Mois Années <br />
&nbsp;* @param mixed $sql <br />
&nbsp;* @return string <br />
&nbsp;*/ <br />
function filtrageDates($sql) { <br />
&nbsp; &nbsp;$data = array(); <br />
&nbsp; &nbsp;$qry &nbsp;= mysql_query($sql); <br />
&nbsp; &nbsp;$data[] = '&lt;option value=&quot;&quot;&gt;&lt;/option&gt;'; // ligne vide <br />
&nbsp; &nbsp;while($row = mysql_fetch_row($qry)) { <br />
&nbsp; &nbsp; &nbsp; $data[] = '&lt;option value=&quot;' . $row[0] . '&quot;&gt;' . $row[0] . '&lt;/option&gt;'; <br />
&nbsp; &nbsp;} <br />
&nbsp; &nbsp;return implode(&quot;\n&quot;, $data); <br />
} <br />
&nbsp;<br />
/** <br />
&nbsp;* Crée le code HTML pour les liste relatives aux villes et matières <br />
&nbsp;* @param mixed $sql <br />
&nbsp;* @return string <br />
&nbsp;*/ <br />
function filtrageVillesMatieres($sql) { <br />
&nbsp; &nbsp;$data = array(); <br />
&nbsp; &nbsp;$qry = mysql_query($sql); <br />
&nbsp; &nbsp;$data[] = '&lt;option value=&quot;&quot;&gt;&lt;/option&gt;'; // ligne vide <br />
&nbsp; &nbsp;while($row = mysql_fetch_row($qry)) { <br />
&nbsp; &nbsp; &nbsp; $data[] = '&lt;option value=&quot;' . $row[0] . '&quot;&gt;' . $row[1] . '&lt;/option&gt;'; <br />
&nbsp; &nbsp;} <br />
&nbsp; &nbsp;return implode(&quot;\n&quot;, $data); <br />
} <br />
&nbsp;<br />
// si aucun where -&gt; on repart sur l'extraction de toutes les données possibles (pareil qu'au 1er appel index.php) <br />
$fromDates = (NULL === $where) ? 't_session' : $fromAndWhere; <br />
&nbsp;<br />
// si le jour n'a pas déjà été sélectionné -&gt; filtrage de la liste <br />
if (NULL === $jour) { <br />
&nbsp; &nbsp;$sql = &quot;SELECT DISTINCT DAY(t_session.date_) FROM $fromDates ORDER BY DAY(t_session.date_);&quot;; <br />
&nbsp; &nbsp;$xml-&gt;addChild('jours', filtrageDates($sql)); <br />
} <br />
&nbsp;<br />
// si le mois n'a pas déjà été sélectionné -&gt; filtrage de la liste <br />
if (NULL === $mois) { <br />
&nbsp; &nbsp;$sql = &quot;SELECT DISTINCT MONTH(t_session.date_) FROM $fromDates ORDER BY MONTH(t_session.date_);&quot;; <br />
&nbsp; &nbsp;$xml-&gt;addChild('mois', filtrageDates($sql)); <br />
} <br />
&nbsp;<br />
// si l'année n'a pas déjà été sélectionnée -&gt; filtrage de la liste <br />
if (NULL === $annee) { <br />
&nbsp; &nbsp;$sql = &quot;SELECT DISTINCT YEAR(t_session.date_) FROM $fromDates ORDER BY YEAR(t_session.date_);&quot;; <br />
&nbsp; &nbsp;$xml-&gt;addChild('annees', filtrageDates($sql)); <br />
&nbsp; &nbsp;$data = array(); <br />
} <br />
&nbsp;<br />
// si la ville n'a pas déjà été sélectionnée -&gt; filtrage de la liste <br />
if (NULL === $ville) { <br />
&nbsp; &nbsp;// si aucun where -&gt; on repart sur l'extraction de toutes les données possibles (pareil qu'au 1er appel index.php) <br />
&nbsp; &nbsp;$from = (NULL === $where) ? 't_ville' : $fromAndWhere; <br />
&nbsp; &nbsp;$sql = &quot;SELECT DISTINCT t_ville.idVille, t_ville.ville FROM $from ORDER BY t_ville.ville;&quot;; <br />
&nbsp; &nbsp;$xml-&gt;addChild('villes', filtrageVillesMatieres($sql)); &nbsp;<br />
&nbsp; &nbsp;$data = array(); <br />
} <br />
&nbsp;<br />
// si la matière n'a pas déjà été sélectionnée -&gt; filtrage de la liste <br />
if (NULL === $matiere) { <br />
&nbsp; &nbsp;// si aucun where -&gt; on repart sur l'extraction de toutes les données possibles (pareil qu'au 1er appel index.php) <br />
&nbsp; &nbsp;$from = (NULL === $where) ? 't_matiere' : $fromAndWhere; <br />
&nbsp; &nbsp;$sql = &quot;SELECT DISTINCT t_matiere.idMatiere, t_matiere.matiere FROM $from ORDER BY t_matiere.matiere;&quot;; <br />
&nbsp; &nbsp;$xml-&gt;addChild('matieres', filtrageVillesMatieres($sql)); <br />
&nbsp; &nbsp;$data = array(); <br />
} <br />
&nbsp;<br />
&nbsp;<br />
// données de la table <br />
$sql = &lt;&lt;&lt;SQL <br />
SELECT &nbsp;<br />
&nbsp; &nbsp;t_ville.ville, &nbsp;<br />
&nbsp; &nbsp;t_session.date_, &nbsp;<br />
&nbsp; &nbsp;t_matiere.matiere, &nbsp;<br />
&nbsp; &nbsp;t_session_matiere.nbInscrit &nbsp;<br />
FROM &nbsp;<br />
&nbsp; &nbsp;$fromAndWhere <br />
ORDER BY <br />
&nbsp; &nbsp;t_ville.ville ASC, &nbsp;<br />
&nbsp; &nbsp;t_session.date_ DESC, &nbsp;<br />
&nbsp; &nbsp;t_matiere.matiere ASC; <br />
SQL; <br />
&nbsp;<br />
$data = array(); <br />
$qry = mysql_query($sql); <br />
// mise en forme des données <br />
// ici on reconstruit les données de la table <br />
while($row = mysql_fetch_assoc($qry)) { <br />
&nbsp; &nbsp;$data[] = &lt;&lt;&lt;HTML <br />
&lt;tr&gt; <br />
&nbsp; &nbsp;&lt;td&gt;{$row['ville']}&lt;/td&gt; <br />
&nbsp; &nbsp;&lt;td class=&quot;alignc&quot;&gt;{$row['date_']}&lt;/td&gt; <br />
&nbsp; &nbsp;&lt;td&gt;{$row['matiere']}&lt;/td&gt; <br />
&nbsp; &nbsp;&lt;td class=&quot;alignr&quot;&gt;{$row['nbInscrit']}&lt;/td&gt; <br />
&lt;/tr&gt; <br />
HTML; <br />
} <br />
&nbsp;<br />
if (empty($data)) { // pas de données correspondant au filtre <br />
&nbsp; &nbsp;$data[] = '&lt;tr&gt;&lt;/tr&gt;'; <br />
} <br />
&nbsp;<br />
$xml-&gt;addChild('table', implode(&quot;\n&quot;, $data)); # noeud attendu par jQuery dans filterLists() <br />
&nbsp;<br />
&nbsp;<br />
// Envoi du header et des données <br />
header('content-type: text/xml'); <br />
echo $xml-&gt;asXML(); <br />
&nbsp;<br />
?&gt;</div></td></tr></tbody></table></div>
<p><strong>8. Captures</strong></p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/cap1.png" alt="capture" title="Capture" /></p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/cap2.png" alt="capture" title="Capture" /></p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/cap3.png" alt="capture" title="Capture" /></p>
<p><img src="http://www.proside.fr/dvp/php/tutos/listesLiees/img/cap4.png" alt="capture" title="Capture" /></p>
<p>Amusez-vous bien <img src="https://blog.developpez.com/rawsrc/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /><br />
Commentaires bienvenus<br />
@plus</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>
