[RESOLU] tableau avec des filtres automatique (comme sous excel)

benzouz
Invité n'ayant pas de compte PHPfrance

12 juil. 2006, 10:17

Bonjour,

J'aimerais savoir si il est difficile de faire un tableau avec des filtres automatique (comme sous excel) sous php avec base sql.

Quelqu'un aurais t'il un tuto ou une aide.

Mon tableau comporte 10 colonnes ou j'aimerais avoir en tete de colonne une liste deroulante qui reprend les champs en double afin de n'afficher que cela.

J'ai deja reussi a creer ma base sql et afficher mon tableau sur mon site mais maintenant j'aimerais aller plus loin.

C'est la meme chose sous excel quand on applique filtre automatique.

Merci d'avance

Eléphant du PHP | 332 Messages

12 juil. 2006, 10:34

Je te donne le principe, après à toi de jouer ...

Par exemple, ton tableau a été affiché par cette requête
$sql= "select nom, prenom, codepostal, ville from utilisateur";
Pour trouver tes en-têtes de colonnes, il faut que tu fasses 4 requêtes de plus

Code : Tout sélectionner

select distinct nom from utilisateur order by nom select distinct prenom from utilisateur order by prenom select distinct codepostal from utilisateur order by codepostal select distinct ville from utilisateur order by ville
Ces 4 requêtes vont te permettre de construire les listes déroulantes en haut de chaque colonne.
<select>
<option name=nom value="*">Toutes les valeurs</option>
<?php
for ($i=0; $i<count(nom); $i++) {
  echo "<option name=nom value=\"$nom[$i]\">$nom[$i]</option>\n";
}
?>
</select>
Tu mets tout ça dans un formulaire qui réappelle la page en lui passant les paramètres en post. (note : il faut que tu trouves un petit bout de javascript qui fait le submit à chaque changement dans une liste).

En début de ta page, tu vas tester les paramètre $_POST["nom"], $_POST["prenom"], ... ce qui va te permettre de construire ta requête en dynamique
(if isNull($_POST['nom'])) {
  $wherenom = "1=1 ";
elseif ($_POST['nom'] = "*") {
  $wherenom = "1=1 ";
} else {
  $wherenom = "nom=$_POST['nom'] ";
}
Même chose pour les autres paramètres et au final
$sql= "select nom, prenom, codepostal, ville from utilisateur WHERE $wherenom $whereprenom $wherecode $whereville";
PS : Je suis presque sûr qu'il existe des solutions en javascript (ou Ajax ?) qui te permette de faire le filtrage sans être obligé de refaire une requête.

benzouz
Invité n'ayant pas de compte PHPfrance

12 juil. 2006, 11:18

Bonjour,

Merci beaucoup pour ta reponse si rapide !

je voulais te donner mon code d'affichage du tableau pour voir si je pouvais y appliquer ta solution.

car moi j'utilise echo avec un array

je t'avous que je suis un peu perdu

faut t'il que je revois mon code d'affichage du tableau
// Création du tableau d'affichage avec une couleur de fond bgcolor= la couleur est en EXA #WWYYZZ WW pour le Rouge, YY pour le vert, ZZ pour le bleu.
echo "<table border=1 width=700 height=500 bgcolor=#efefff>"; 

// Index du tableau 
// Création d'une ligne
echo "<tr>";
//création d'une colonne  sur la ligne <td> pou créer la cellule  </td> pour fermer
echo "<td>Numéro </td>";
echo "<td>Organime </td>";
echo "<td>Actions TH </td>";
echo "<td>reçu le </td>";
echo "<td>DF </td>";
echo "<td>intitulé de l'actions </td>";
echo "<td>Début </td>";
echo "<td>Fin </td>";
echo "<td>Info de positionnement </td>";
echo "<td>Liens </td>";
// Fermeture de la ligne
echo "</tr>";


// affichage avec un boucle while
 while($affichage = mysql_fetch_array($req))
 {
 	echo "<tr>";
 	echo "<td>".$affichage['numero']."</td>";
 	echo "<td>".$affichage['organisme']."</td>";
 	echo "<td>".$affichage['actionsth']."</td>";
	echo "<td>".$affichage['recule']."</td>";
	echo "<td>".$affichage['df']."</td>";
	echo "<td>".$affichage['intitule']."</td>";
	echo "<td>".$affichage['debut']."</td>";
	echo "<td>".$affichage['fin']."</td>";
	echo "<td>".$affichage['infopositionnement']."</td>";
 	// Affichage du lien qui ouvre dans un autre page avec "target="
 	echo "<td><a href=".$affichage['liens']." target=new_page'>".liens."</a></td>";
// Fermeture de la ligne
	echo "</tr>";
}
// Fermeture du tableau
echo "</table>";
 // fermeture de la connexion
 mysql_close($connect);
?>
Merci d'avance

benzouz
Invité n'ayant pas de compte PHPfrance

12 juil. 2006, 11:23

Bonjour,

J'avais oublier les premiere lignes :


//// Sélection de la table avec les infos à relever

$sql ='SELECT id, numero, organisme, actionsth, recule, df, intitule, debut, fin, infopositionnement, liens FROM formation';

$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());


Eléphant du PHP | 332 Messages

12 juil. 2006, 12:18

Oui, ce que je t'ai expliqué est appliquable.

Il faut
1) que tu fasses tous les select distinct pour chacune des colonnes.
2) que tu les stockes dans des variables
3) que tu écrives une fonction qui prenne en entrée un tableau de variables et qui fournisse en sortie une liste de sélection
4) que tu insères une ligne de tableau entre tes echo de colonne et ta boucle while
5) que tu fasses appel à la fonction ci-dessus pour chacune des colonnes
6) que tu modifies ta requête SQL pour prendre en compte les paramètres de filtrage quand il y en a

Bon courage et tiens nous au courant de ton avancement

Petit nouveau ! | 5 Messages

12 juil. 2006, 14:19

bonjour,

y a un petit truc que j'ai pas compris

j'ai commencer je te demande juste de me confirmer pour savoir si je m'ecarte ou pas.

bon il faut que je fasse des requette pour chacune de mes colonnes ex:
sa donne sa dans le debut de mon fichier tableau.php

Code : Tout sélectionner

<? include '/var/www/data/woo/M/L/H/D/MLHDA43K/prive/fonctions/fct.inc'; // Appel delà fonction connect sql. Connexion à la base SQL. $connect = connect_sql(); //// Sélection de la table avec les infos à relever $sql ='SELECT id, numero, organisme, actionsth, recule, df, intitule, debut, fin, infopositionnement, liens FROM formation'; $sql ='SELECT distinct id from formation order by id'; $sql ='SELECT distinct numero from formation order by numero'; $sql ='SELECT distinct organisme from formation order by organisme'; $sql ='SELECT distinct actionsth from formation order by actionsth'; $sql ='SELECT distinct recule form formation order by recule'; $sql ='SELECT distinct df from formation order by df'; $sql ='SELECT distinct intitule from formation order by intitule'; $sql ='SELECT distinct debut from formation order by debut'; $sql ='SELECT distinct fin from formation order by fin'; $sql ='SELECT distinct infopositionnement from formation order by infopositionnement'; $sql ='SELECT distinct liens from formation order by liens'; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
apres il faut que je stocke dans des variable

alors la je suis un peu perdu

j'ai besoin d'aide

Petit nouveau ! | 5 Messages

12 juil. 2006, 15:02

Bonjour,

Donc ma premiere variable se nommé :

Code : Tout sélectionner

$sql ='SELECT id, numero, organisme, actionsth, recule, df, intitule, debut, fin, infopositionnement, liens FROM formation';
mes autres je vais les nommé :

Code : Tout sélectionner

$sqlid ='SELECT distinct id from formation order by id'; $sqlnumero ='SELECT distinct numero from formation order by numero'; $sqlorganisme ='SELECT distinct organisme from formation order by organisme'; $sqlactionsth ='SELECT distinct actionsth from formation order by actionsth'; $sqlrecule ='SELECT distinct recule form formation order by recule'; $sqldf ='SELECT distinct df from formation order by df'; $sqlintitule ='SELECT distinct intitule from formation order by intitule'; $sqldebut ='SELECT distinct debut from formation order by debut'; $sqlfin ='SELECT distinct fin from formation order by fin'; $sqlinfopositionnement ='SELECT distinct infopositionnement from formation order by infopositionnement'; $sqlliens ='SELECT distinct liens from formation order by liens';
et donc mon fichier tableau.php donne pour l'instant

Code : Tout sélectionner

<? include '/var/www/data/woo/M/L/H/D/MLHDA43K/prive/fonctions/fct.inc'; // Appel delà fonction connect sql. Connexion à la base SQL. $connect = connect_sql(); //// Sélection de la table avec les infos à relever $sql ='SELECT id, numero, organisme, actionsth, recule, df, intitule, debut, fin, infopositionnement, liens FROM formation'; $sqlid ='SELECT distinct id from formation order by id'; $sqlnumero ='SELECT distinct numero from formation order by numero'; $sqlorganisme ='SELECT distinct organisme from formation order by organisme'; $sqlactionsth ='SELECT distinct actionsth from formation order by actionsth'; $sqlrecule ='SELECT distinct recule form formation order by recule'; $sqldf ='SELECT distinct df from formation order by df'; $sqlintitule ='SELECT distinct intitule from formation order by intitule'; $sqldebut ='SELECT distinct debut from formation order by debut'; $sqlfin ='SELECT distinct fin from formation order by fin'; $sqlinfopositionnement ='SELECT distinct infopositionnement from formation order by infopositionnement'; $sqlliens ='SELECT distinct liens from formation order by liens'; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
Donc c'est la que commence

- Ecrire une fonction qui prenne en entrée un tableau de variables et qui fournisse en sortie une liste de sélection

heu la je comprend pas si tu peux m'aidé

merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 juil. 2006, 15:17

En fait, maintenant que tu as toutes tes requête "distinct" il te faut toutes les récupérer, toutes les lires, et toutes les afficher sous la forme d'un <select>

Faire une fonction te permet de centraliser tout ça. Au lieu de faire tout ce code et de le répéter pour chaque requête sql, tu peux le mettre dans une fonction, et c'est seulement l'appel qu'il te faudra répéter en changeant les paramètres (en gros tu n'aurais que 15 lignes appelées 10 fois, au lieu de 10x15 lignes appelées 1 fois)

Petit nouveau ! | 5 Messages

12 juil. 2006, 16:22

Bonjour et merci a ceux qui m'aide

Alors si j'ai bien compris il faut que je fasse une fonction un peu comme la fonction que j'utilise pour me connecter a ma base sql :
Fichier fct.inc stocké dans un repertoire que j'appel dans mes page php afin de ne pas mettre mes info de connection dans les pages php (meme si j'ai bien compris que de toute façon théoriquement le code php n'est pas visible coté client) faudra que l'on m'explique le but (plus de sécurité peu etre)

Bon alors

dans mon fichier tableau.php au debut j'ai une commande qui fait appel a ma fonction de connection a ma base:

Code : Tout sélectionner

include '/var/www/data/woo/M/L/H/D/MLHDA43K/prive/fonctions/fct.inc';
donc je vais faire la meme chose pour :
écrire une fonction qui prenne en entrée un tableau de variables et qui fournisse en sortie une liste de sélection

sa donne dans un fichier fct2.inc

Code : Tout sélectionner

<? function arraytoselect ($array, $nom) { $select = "<select name=\"$nom\">\n"; for ($i=0; $i<count($array); $i++) { $select .= "<option value=\"$array[$i]\">$array[$i]</option>\n"; } $select .= "</select>"; return $select; } ?>
Merci Henri sois dit en passant

mais je vois pas le rapport avec mes dix colonnes dans cette fonction

Est ce que je dois remplacer la vriable $nom par mes entête de colonne

j'ai besoin d'aide s'il vous plais

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 juil. 2006, 16:37

Ca m'parait pas mal :)

Quelque remarques sinon, tu n'es pas obligé de faire un fichier par fonction que tu créer.. typiquement si un seul script utilise ta fonction autant la placer directement dans celui-ci sans avoir à aller chercher un autre fichier. Dès le moment où la fonction t'es utile dans plusieurs scripts, ca devient interessant de l'externaliser et d'inclure le fichier. A noter que tu peux mettre plusieurs fonction dans un même fichier pour n'en avoir qu'un à inclure.

Sur le même principe (plus que par réelle sécurité) on externalise les infos de connexion à la base pour ne les avoir qu'en un seul endroit. Si tu devais les mettre dans chaque fichier, le jour où tu changes de mot de passe, il faut aller modifier tous tes scripts. Là tu n'en a qu'un à modifier :)


Pour tes inclusions de fichiers, tu n'es pas obligé de préciser le chemin global (c'est à dire partant de la racine du disque) et il est recommandé d'utiliser des chemins relatifs (à partir du script qui inclu). Comme ça si jamais tu changes d'hébergeur ou de serveur, pas besoin de modifier les chemins puisque le script et sa fonction eux n'auront pas bougés :
// au lieu de 
include '/var/www/data/woo/M/L/H/D/MLHDA43K/prive/fonctions/fct.inc'; 

// tu aurais par exemple 
include '../fonctions/fct.inc'; 
// en supposant que ton script doive remonter d'un dossier puis descendre dans le dossier "fonctions" pour trouver le script à inclure.
Enfin, au lieu de changer l'extension des fichier inclus en .inc, utilises plutot l'extension .inc.php (le .inc est surtout informel pour dire que ce fichier ne fonctionne pas tout seul et doit être inclu par un autre). L'intérêt, c'est que la majorité des serveurs ne considèrent pas .inc comme une extension php et si tu tentes de l'ouvrir, il ne sera pas compilé et apparaitra donc en clair. Avec le .php en plus au bout il sera protégé :)

Désolé pour la tartine, mais bon, ça me semble interessant à savoir :)

Petit nouveau ! | 5 Messages

12 juil. 2006, 16:53

Bonjour

Alors merci pour la tartine c'etait tres enrichissant

voici mon fichier tableau.php

Code : Tout sélectionner

<? include '/var/www/data/woo/M/L/H/D/MLHDA43K/prive/fonctions/fct.inc.php'; include '/var/www/data/woo/M/L/H/D/MLHDA43K/prive/fonctions/fct2.inc.php'; // Appel delà fonction connect sql. Connexion à la base SQL. $connect = connect_sql(); //// Sélection de la table avec les infos à relever $sql ='SELECT id, numero, organisme, actionsth, recule, df, intitule, debut, fin, infopositionnement, liens FROM formation'; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); // Création du tableau d'affichage avec une couleur de fond bgcolor= la couleur est en EXA #WWYYZZ WW pour le Rouge, YY pour le vert, ZZ pour le bleu. echo "<table border=1 width=700 height=500 bgcolor=#efefff>"; // Index du tableau // Création d'une ligne echo "<tr>"; //création d'une colonne sur la ligne <td> pou créer la cellule </td> pour fermer //appel de la fonction arraytoselect echo "<td>Numéro </td>"; echo "<td>".arraytoselect ($resorganisme, "organisme")."</td>"; echo "<td>".arraytoselect ($resactionth, "actionsth")."</td>"; echo "<td>".arraytoselect ($resrecule, "reçu le")."</td>"; echo "<td>".arraytoselect ($redf, "DF")."</td>"; echo "<td>".arraytoselect ($reintitule, "intitulé de l'actions")."</td>"; echo "<td>Début </td>"; echo "<td>Fin </td>"; echo "<td>Info de positionnement </td>"; echo "<td>Liens </td>"; // Fermeture de la ligne echo "</tr>"; // affichage avec un boucle while while($affichage = mysql_fetch_array($req)) { echo "<tr>"; echo "<td>".$affichage['numero']."</td>"; echo "<td>".$affichage['organisme']."</td>"; echo "<td>".$affichage['actionsth']."</td>"; echo "<td>".$affichage['recule']."</td>"; echo "<td>".$affichage['df']."</td>"; echo "<td>".$affichage['intitule']."</td>"; echo "<td>".$affichage['debut']."</td>"; echo "<td>".$affichage['fin']."</td>"; echo "<td>".$affichage['infopositionnement']."</td>"; // Affichage du lien qui ouvre dans un autre page avec "target=" echo "<td><a href=".$affichage['liens']." target=new_page'>".liens."</a></td>"; // Fermeture de la ligne echo "</tr>"; } // Fermeture du tableau echo "</table>"; // fermeture de la connexion mysql_close($connect); ?>
Le probleme c'est qu'il faut comme le dit henri (il n'est plus la pour m'aider) :

il faut que les résultats des select soient mis dans des variables resorganisme, resactionth, ...

je fait comment pour mettre le resultat des select (suite a ma fonction fct2.inc.php) dans des variable ....

merci d'avance pour votre aide
Modifié en dernier par benzouz le 13 juil. 2006, 09:05, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 juil. 2006, 17:07

Il faut que tu exécutes les requêtes et que tu lises le résultat de la même manière que tu le fais pour afficher les résultats à l'écran :
$monTableau = array(); // on commence par déclarer un tableau

$resultSet = mysql_query($sql); // on exécute l'une des requêtes sql
while($row = mysql_fetch_array($resultSet))  { // on parcours chaque ligne de résultat
  $monTableau[] = $row['nomDuChamp']; // en mettant la valeur dans le tableau
}

$codeHtml = arraytoselect ($monTableau , "nomDuSelect"); // on passe le tableau en paramètre de la fonction

echo $codeHtml; // on affiche le résultat de la fonction

Petit nouveau ! | 5 Messages

13 juil. 2006, 10:11

bonjour,

je suis désolé mais je m'en sort pas

vous pouvez le voir ici http://www.premiumwanadoo.com/mlpmc/tableau.php

pouvez etre plus precis dans vos indications ex: quel fichier je dois modifier et prendre des exemples concret avec mes colonnes
genre me montrer pour la premiere colonne et moi je fait le reste

voici mon fichier tableau.php

Code : Tout sélectionner

<? include '/var/www/data/woo/M/L/H/D/MLHDA43K/prive/fonctions/fct.inc.php'; include '/var/www/data/woo/M/L/H/D/MLHDA43K/prive/fonctions/fct2.inc.php'; // Appel delà fonction connect_sql qui se trouve dans fct.inc.php. Connexion à la base SQL. $connect = connect_sql(); //// Sélection de la table avec les infos à relever $sql ='SELECT id, numero, organisme, actionsth, recule, df, intitule, debut, fin, infopositionnement, liens FROM formation'; $sqlid ='SELECT distinct id from formation order by id'; $sqlnumero ='SELECT distinct numero from formation order by numero'; $sqlorganisme ='SELECT distinct organisme from formation order by organisme'; $sqlactionsth ='SELECT distinct actionsth from formation order by actionsth'; $sqlrecule ='SELECT distinct recule form formation order by recule'; $sqldf ='SELECT distinct df from formation order by df'; $sqlintitule ='SELECT distinct intitule from formation order by intitule'; $sqldebut ='SELECT distinct debut from formation order by debut'; $sqlfin ='SELECT distinct fin from formation order by fin'; $sqlinfopositionnement ='SELECT distinct infopositionnement from formation order by infopositionnement'; $sqlliens ='SELECT distinct liens from formation order by liens'; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); // Création du tableau d'affichage avec une couleur de fond bgcolor= la couleur est en EXA #WWYYZZ WW pour le Rouge, YY pour le vert, ZZ pour le bleu. echo "<table border=1 width=700 height=500 bgcolor=#efefff>"; // Index du tableau // Création d'une ligne echo "<tr>"; //création d'une colonne sur la ligne <td> pou créer la cellule </td> pour fermer //appel de la fonction arraytoselect echo "<td>Numéro </td>"; echo "<td>".arraytoselect ($sqlorganisme, "organisme")."</td>"; echo "<td>".arraytoselect ($sqlactionsth, "actionsth")."</td>"; echo "<td>".arraytoselect ($sqlrecule, "reçu le")."</td>"; echo "<td>".arraytoselect ($sqldf, "DF")."</td>"; echo "<td>".arraytoselect ($sqlintitule, "intitulé de l'actions")."</td>"; echo "<td>Début </td>"; echo "<td>Fin </td>"; echo "<td>Info de positionnement </td>"; echo "<td>Liens </td>"; // Fermeture de la ligne echo "</tr>"; // affichage avec un boucle while while($affichage = mysql_fetch_array($req)) { echo "<tr>"; echo "<td>".$affichage['numero']."</td>"; echo "<td>".$affichage['organisme']."</td>"; echo "<td>".$affichage['actionsth']."</td>"; echo "<td>".$affichage['recule']."</td>"; echo "<td>".$affichage['df']."</td>"; echo "<td>".$affichage['intitule']."</td>"; echo "<td>".$affichage['debut']."</td>"; echo "<td>".$affichage['fin']."</td>"; echo "<td>".$affichage['infopositionnement']."</td>"; // Affichage du lien qui ouvre dans un autre page avec "target=" echo "<td><a href=".$affichage['liens']." target=new_page'>".liens."</a></td>"; // Fermeture de la ligne echo "</tr>"; } // Fermeture du tableau echo "</table>"; // fermeture de la connexion mysql_close($connect); ?>
et voici mon fichier ma fonction fct2.inc.php

Code : Tout sélectionner

<? function arraytoselect ($array, $nom) { $select = "<select name=\"$nom\">\n"; for ($i=0; $i<count($array); $i++) { $select .= "<option value=\"$array[$i]\">$array[$i]</option>\n"; } $select .= "</select>"; return $select; } ?>

vous pouvez le voir ici http://www.premiumwanadoo.com/mlpmc/tableau.php


Merci d'avance pour votre aide

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 juil. 2006, 19:09

Tu as quasiment tout le code dans mon message précédent... bon aller, le revoici avec un cas concret, la colonne intitule :
// on commence par déclarer un tableau dans lequel on va mettre les libellés que l'on veut afficher
$tabIntitule = array(); 

// puis la requête qui va ramener les différents intitulés présents en base pour le champ choisi
$sqlIntitule ='SELECT DISTINCT(intitule) FROM formation ORDER BY intitule'; 

// on exécute la requête sql et on récupère le résultat dans la variable $resultSet
$resultSet = mysql_query($sqlIntitule) or die (mysql_error()); 

while($row = mysql_fetch_array($resultSet))  { // on parcours chaque ligne de résultat 
  $tabIntitule[] = $row['intitule']; // en mettant la valeur du champ dans le tableau 
} 

// si on veut vérifier que le tableau s'est bien rempli
// print_r($tabIntitule);

// on passe le tableau en paramètre de la fonction avec le nom que l'on veut donner au select
$codeHtml = arraytoselect ($tabIntitule , "intitule"); 

echo $codeHtml; // on affiche le résultat de la fonction (c'est à dire le select) à l'endroit qui va bien 
A noter, ceci n'est à faire que pour les champs pour lesquels tu veux un menu déroulant en haut de la colonne. Comme ce n'est apparement pas le cas de Id ou Numero, ce n'est pas la peine de les faire :)

Invité
Invité n'ayant pas de compte PHPfrance

12 janv. 2013, 12:39

bonjour, j'ai besoins de créer un tableau avec interaction sql et j'aime bien avoir le tableau que vous avez créer bien sur si ça vous dérange pas.merci