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 :
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é.
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
<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 !