Filtrage Liste liées

stevenP
Invité n'ayant pas de compte PHPfrance

06 févr. 2012, 13:11

Bonjour,

Je viens à votre secours pour trouver la solution à mon problème !
J'ai utilisé au départ ce tutoriel :
http://blog.developpez.com/rawsrc/p1025 ... #more10256

J'ai donc adapté le tutoriel à ma problématique mais.. je pense pense que j'arrive au but mais je suis bloqué sur une erreur que je ne comprends pas...

Ma page se présente comme ça :

Image

Mais lorsque je sélectionne ma donnée dans la liste, cela ne remet pas à jour le tableau.. J'ai essayé de comprendre l'erreur avec la "Console Web" de Firefox 10, mais je suis bloqué.

Image

Voici mes 2 codes sources des 2 fichiers :

index.php
<?php

// Au démarrage, aucune sélection : on extrait toutes les données individuellement pour chaque liste
// Tu as 4 listes : Raison sociale | ROS | Code postal | Produit
mysql_connect('localhost', 'root', '');
mysql_select_db('xls_db');
 
// raison sociale
$sql = 'SELECT DISTINCT client FROM histo ORDER BY client';
$qry = mysql_query($sql);
while($row = mysql_fetch_assoc($qry)) {
   $dataClient[] = $row['client']; 
}
 
// ROS
$sql = 'SELECT DISTINCT ros FROM histo ORDER BY ros';
$qry = mysql_query($sql);
while($row = mysql_fetch_assoc($qry)) {
   $dataRos[] = $row['ros'];
}
 
// code postal
$sql = 'SELECT DISTINCT codepostal FROM histo ORDER BY codepostal';
$qry = mysql_query($sql);
while($row = mysql_fetch_assoc($qry)) {
   $dataCp[] = $row['codepostal'];
}
 
// produit
$sql = 'SELECT DISTINCT id_produit FROM histo ORDER BY id_produit';
$qry = mysql_query($sql);
while($row = mysql_fetch_assoc($qry)) {
   $dataProduit[] = $row['id_produit'];
}
 
// historique non filtré
// produit
$sql = 'SELECT * FROM histo';
$qry = mysql_query($sql);
while($row = mysql_fetch_assoc($qry)) {
   $dataHisto[] = $row;
}
 
$hsc = function($p) { return htmlspecialchars($p, ENT_QUOTES); }
 
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
		
		<!-- Titre
		************************************************************-->
		<title>PROJET AFFECTATION ROS</title>

		<!-- Feuille de style
		************************************************************-->
		<style type="text/css" media="screen">
			@import url(styles/style.css);
		</style>

		<script type="application/javascript" charset="ISO-8859-1" src="jquery-1.6.3.min.js"></script>
		
		<script type="application/javascript"> 
		function filterLists() { 
		// ici on récupère les valeurs sélectionnées pour chaque liste avec les sélecteurs de jQuery 
		var client = $('#clients option:selected').val(); 
		var ros = $('#ros option:selected').val(); 
		var cp = $('#cps option:selected').val(); 
		var produit = $('#produits option:selected').val(); 

		// on fait notre appel ajax paramétré (pas besoin de s'occuper de l'implémentation du XMLHttpRequest, jQuery le fait pour toi) 
		$.ajax({ 
		type: 'POST', // méthode de transmission des données 
		url: 'filterLists.php', // script à exécuter sur le serveur 
		data: 'client='+encodeURIComponent(client)+'&ros='+encodeURIComponent(ros)+'&cp='+encodeURIComponent(cp)+'&produit='+encodeURIComponent(produit), // données à passer au script via le tableau $_POST
		dataType: 'xml', // type des données attendues en retour : ici xml 
		cache: false, 
		success: function(response) { // traitement du résultat (= données reçues du serveur) une fois l'appel ajax réussi 
		var code; 
		// vu que la réponse est au format xml, on demande à jquery de trouver des noeuds spécifiques 
		// 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 
		// en clair : on remplace si nécessaire l'ensemble des lignes <option value=""></option> pour chaque liste qui n'a pas encore de sélection 
		if ((code = $(response).find('clients').text()).length) $('#clients').html(code); 
		if ((code = $(response).find('ros').text()).length) $('#ros').html(code); 
		if ((code = $(response).find('cps').text()).length) $('#cps').html(code); 
		if ((code = $(response).find('produits').text()).length) $('#produits').html(code); 
		if ((code = $(response).find('table').text()).length) $('#table').html(code); 
		} 
		}); 
		} 
		</script>

	</head>
	
	<body id="principal">

<?php

// ICI MODIFIEZ LE PARAMETRAGE 
// Connexion à la base de données 
$server = 'localhost'; 
$user = 'root'; 
$pwd = ''; 
$dbName = 'xls_db'; 
$cnx = mysql_connect($server, $user, $pwd); 
$db = mysql_select_db($dbName); 

// Au démarrage, aucune sélection : on extrait toutes les données individuellement pour chaque liste

// DONNES DE LA TABLE 
$sql = <<<SQL
SELECT histo.id_produit, histo.type_produit, histo.ros, histo.client, histo.adresse, histo.ville, histo.codepostal
FROM histo  
ORDER BY 
histo.codepostal ASC,
histo.id_produit ASC,  
histo.type_produit ASC,  
histo.ros ASC, 
histo.client ASC,
histo.adresse ASC,
histo.ville ASC
SQL;
$qry = mysql_query($sql); 
while($row = mysql_fetch_assoc($qry)) { 
$data[] = $row; 
} 

   // pour chaque liste il faut prévoir leur retrait du filtre
   // en insérant une ligne vide en début de liste : <option value=""></option>
?>

	<!-- Conteneur
	************************************************************-->
	<div id="conteneur">

		<!-- En-tete
		************************************************************-->
		<h1 id="header">
			<a href="./" title="PROJET AFFECTATION ROS"><span>PROJET AFFECTATION ROS</span></a>
		</h1>

		<!-- Barre verticale
		************************************************************-->
		<div id="navigation">
			<div id="styles">
			<h2>Menu</h2>
			<ul>
				<li><a href="index.php">Historique Prod</a></li>
				<li><a href="ajout.php">Nouvelle Prod</a></li>
				<li><a href="#">Pré-études</a></li>
			</ul>
			</div>
			
			<div id="informations">
			<h2>Informations</h2>
			
				<p>Mise à jour de la base 03 Fevrier 2011</p>		
				
				<p></p>

			</div>
		</div>

	<!-- Contenu
	************************************************************-->
	<div id="contenu">
		<div id="main">
		<div id="projet">
		<h2><span>Historique Production</span></h2>

			<p></p>
			
		</div>

		<div id="base">

		<h3><span>Base de Données</span></h3>
		
			<p>Sélectionnez de un à plusieurs critères de recherche.</p><br>
			
			<p>
				<form id="frmRecherche">
				<table>
					<tbody id="table2">
						<tr>
							<!-- Liste des clients -->
							<td>
								<label for="clients">Clients</label>
							</td>
							<td>
								<select id="clients" onchange="filterLists();">
								<option value=""></option>
								<?php foreach($dataClient as $client): ?>
								<option value="<?php echo $hsc($client); ?>"><?php echo $hsc($client); ?></option>
								<?php endforeach; ?>
								</select>
							</td>
						</tr>
						<tr>
							<!-- Liste des ROS-->
							<td>
								<label for="ros">ROS</label>
							</td>
							<td>
								<select id="ros" onchange="filterLists();">
								<option value=""></option>
								<?php foreach($dataRos as $ros): ?>
								<option value="<?php echo $hsc($ros); ?>"><?php echo $hsc($ros); ?></option>
								<?php endforeach; ?>
								</select>
							</td>
						</tr>
						<tr>
							<!-- Liste des codes postaux-->
							<td>
								<label for="cp">Code Postal</label>
							</td>
							<td>
								<select id="cp" onchange="filterLists();">
								<option value=""></option>
								<?php foreach($dataCp as $cp): ?>
								<option value="<?php echo $hsc($cp); ?>"><?php echo $hsc($cp); ?></option>
								<?php endforeach; ?>
								</select>
							</td>
						</tr>
						<tr>
							<!-- Liste des produits-->
							<td>
								<label for="produit">Produits</label>
							</td>
							<td>
								<select id="produit" onchange="filterLists();">
								<option value=""></option>
								<?php foreach($dataProduit as $produit): ?>
								<option value="<?php echo $hsc($produit); ?>"><?php echo $hsc($produit); ?></option>
								<?php endforeach; ?>
								</select>
							</td>
						</tr>
					</tbody>
				  </table>
				</form>
			</p>
			<br>
			<p>
			<!-- Données de la table -->
			<table>
			  <thead>
				 <tr>
					<th>Produit</th>
					<th>Type</th>
					<th>Client</th>
					<th>Adresse</th>
					<th>CP</th>
					<th>Ville</th>
					<th>ROS</th>
				 </tr>
			  </thead>
			  <tbody id="table">
				 <?php foreach($dataHisto as $row): ?>
				 <tr id="table">
					<td><?php echo $hsc($row['id_produit']); ?></td>
					<td><?php echo $hsc($row['type_produit']); ?></td>
					<td><?php echo $hsc($row['client']); ?></td>
					<td><?php echo $hsc($row['adresse']); ?></td>
					<td><?php echo $hsc($row['codepostal']); ?></td>
					<td><?php echo $hsc($row['ville']); ?></td>
					<td><?php echo $hsc($row['ros']); ?></td>
				 </tr>
				 <?php endforeach; ?>
			  </tbody>
			</table>	
			</p>

		</div>

		<!-- Bloc pour mettre des informations sur le design
		************************************************************-->
		<div id="infostyle"><span></span></div>

		<!-- /Contenu
		************************************************************-->
		</div>
	</div>

	<!-- Pied de page
	************************************************************-->
	<p id="footer"><span>
		2011-2011, Steven Pawlak &nbsp; &nbsp;
		<p class="flotte">
			<img src="styles/logo_indexed.gif" alt="Orange !" />
		</p>
	</span></p>

<!-- /Conteneur
************************************************************-->
</div>

<!-- Blocs supplémentaires pour ajouter des images
************************************************************-->
<div id="imgbloc1"><span></span></div>
<div id="imgbloc2"><span></span></div>
<div id="imgbloc3"><span></span></div>
<div id="imgbloc4"><span></span></div>
<div id="imgbloc5"><span></span></div>

<!-- Balises de fermeture
************************************************************-->
</body>
</html>[/code]

[b]filterLists.php[/b]

[code]<?php 
 
// Ce script est appelé à chaque sélection d'un élément d'une liste 
 
// suivi du critère 
$where = array(); 
$data = array(); 
 
// données sélectionnées => filtres 
$client = NULL; 
$ros = NULL; 
$cp = NULL; 
$produit = NULL;
 
/** 
 * CE SCRIPT ANALYSE LES SELECTIONS ET RENVOIE DES DONNEES AU FORMAT XML  
 * La structure correspond à ce que jQuery attend pour mettre à jour la page 
 * <?xml version="1.0" encoding="utf-8"?>  
 * <xml>  
 *  <clients></clients>  
 *  <ros></ros>  
 *  <cp></cp>  
 *  <produits></produits>  
 *  <table></table>  
 * </xml> 
 * 
 * @var SimpleXMLElement 
 */ 
$xml = simplexml_load_string('<?xml version="1.0" encoding="utf-8"?><xml></xml>'); 
 
// on parcourt le tableau $_POST et on vérifie quelles sont les listes qui ont une sélection 
 
// client 
if (isset($_POST['clients']) && (ctype_digit("{$_POST['clients']}"))) { 
  $client = $_POST['clients']; 
  $where[] = 'histo.client = ' . intval($client); 
} 
 
// ros 
if (isset($_POST['ros']) && (ctype_digit("{$_POST['ros']}"))) { 
  $ros = $_POST['ros']; 
  $where[] = 'histo.ros = ' . intval($ros); 
} 
 
// cp 
if (isset($_POST['cp']) && (ctype_digit("{$_POST['cp']}"))) { 
  $cp = $_POST['cp']; 
  $where[] = 'histo.codepostal = ' . intval($cp); 
} 
 
// produit 
if (isset($_POST['produit']) && (ctype_digit("{$_POST['produit']}"))) { 
  $produit = $_POST['produit']; 
  $where[] = 'histo.id_produit = ' . intval($produit); 
} 
 
### FILTRAGE DES DONNÉES DES LISTES (SSI RIEN N'A DÉJÀ ÉTÉ SÉLECTIONNÉ)  
$where = ( ! empty($where)) ? 'WHERE ' . implode(' AND ', $where) : NULL; 
 
// ICI MODIFIEZ LE PARAMETRAGE 
// Connexion à la base de données 
$server = 'localhost'; 
$user = 'root'; 
$pwd = ''; 
$dbName = 'xls_db'; 
$cnx = mysql_connect($server, $user, $pwd); 
$db = mysql_select_db($dbName); 
 
//////////////////// --> A partir d'ici je ne comprends plus <-- ///////////////////////
 
// on définit le code SQL commun à toutes les requêtes 
// voir la chaine SQL d'extraction des données de la table (plus bas) 
$fromAndWhere = <<<SQL 
histo
$where 
SQL; 
 
/** 
 * Crée le code HTML pour les listes 
 * @param mixed $sql 
 * @return string 
 */ 
function filtrage($sql) { 
  $data = array(); 
  $qry = mysql_query($sql); 
  $data[] = '<option value=""></option>'; // ligne vide 
  while($row = mysql_fetch_row($qry)) { 
  $data[] = '<option value="' . $row[0] . '">' . $row[1] . '</option>'; 
  } 
  return implode("\n", $data); 
} 
 
// si aucun where -> on repart sur l'extraction de toutes les données possibles (pareil qu'au 1er appel index.php) 
$fromDates = (NULL === $where) ? 'histo' : $fromAndWhere; 
 
// si le client n'a pas déjà été sélectionnée -> filtrage de la liste 
if (NULL === $client) { 
  // si aucun where -> on repart sur l'extraction de toutes les données possibles (pareil qu'au 1er appel index.php) 
  $from = (NULL === $where) ? 'histo' : $fromAndWhere; 
  $sql = "SELECT DISTINCT histo.client FROM $from ORDER BY histo.client;"; 
  $xml->addChild('clients', filtrage($sql));  
  $data = array(); 
} 
 
// si le ros n'a pas déjà été sélectionnée -> filtrage de la liste 
if (NULL === $ros) { 
  // si aucun where -> on repart sur l'extraction de toutes les données possibles (pareil qu'au 1er appel index.php) 
  $from = (NULL === $where) ? 'histo' : $fromAndWhere; 
  $sql = "SELECT DISTINCT histo.ros FROM $from ORDER BY histo.ros;"; 
  $xml->addChild('ros', filtrage($sql));  
  $data = array(); 
} 
 
// si le Code postal n'a pas déjà été sélectionnée -> filtrage de la liste 
if (NULL === $cp) { 
  // si aucun where -> on repart sur l'extraction de toutes les données possibles (pareil qu'au 1er appel index.php) 
  $from = (NULL === $where) ? 'histo' : $fromAndWhere; 
  $sql = "SELECT DISTINCT histo.codepostal FROM $from ORDER BY histo.codepostal;"; 
  $xml->addChild('cp', filtrage($sql));  
  $data = array(); 
} 
 
// si le type de produit n'a pas déjà été sélectionnée -> filtrage de la liste 
if (NULL === $produit) { 
  // si aucun where -> on repart sur l'extraction de toutes les données possibles (pareil qu'au 1er appel index.php) 
  $from = (NULL === $where) ? 'histo' : $fromAndWhere; 
  $sql = "SELECT DISTINCT histo.id_produit FROM $from ORDER BY histo.id_produit;"; 
  $xml->addChild('produits', filtrage($sql));  
  $data = array(); 
} 
 
// données de la table 
$sql = <<<SQL 
SELECT  
	histo.id_produit,
	histo.type_produit,
	histo.ros,
	histo.client,
	histo.adresse,
	histo.ville,
	histo.codepostal
FROM  
  $fromAndWhere 
ORDER BY 
  histo.id_produit ASC,  
  histo.type_produit ASC,  
  histo.ros ASC; 
  histo.client ASC;
  histo.adresse ASC;
  histo.ville ASC;
  histo.codepostal ASC;
SQL; 
 
 
$data = array(); 
$qry = mysql_query($sql); 
// mise en forme des données 
// ici on reconstruit les données de la table 
while($row = mysql_fetch_assoc($qry)) { 
  $data[] = <<<HTML 
<tr> 
  <td>{$row['id_produit']}</td> 
  <td>{$row['type_produit']}</td> 
  <td>{$row['ros']}</td> 
  <td>{$row['client']}</td>
  <td>{$row['adresse']}</td> 
  <td>{$row['ville']}</td> 
  <td>{$row['codepostal']}</td> 
</tr> 
HTML; 
} 
 
if (empty($data)) { // pas de données correspondant au filtre 
  $data[] = '<tr></tr>'; 
} 
 
$xml->addChild('table', implode("\n", $data)); # noeud attendu par jQuery dans filterLists() 
 
 
// Envoi du header et des données 
header('content-type: text/xml'); 
echo $xml->asXML(); 
 
?>
Et le code JS appelé (juste pour info car je sais qu'il est correct) :

http://code.jquery.com/jquery-1.6.3.min.js

Merci d'avance pour votre aide.. Je suis perdu !

:)