Page 1 sur 1

Afficher une table sql dans un tableau php

Posté : 28 déc. 2016, 01:01
par rick225
Depuis quelque jours je bloque sur l'affichage complet d'une table de ma base de données pour la gestion des droits d'accès.
Type d'utilisateur : EMPLOYES ADMIN SUPER-USER TECHNICIEN. par rapport au type d'utilisateur les droits d'accès aux pages sont assignés en cliquant sur un bouton (passe au rouge quand cet type d'utilisateur n'est pas autoriser au vert si c'est le contraire.
J'ai vu qu'il fallait utiliser "SHOW FULL COLUMNS FROM TABLE_NAME".
A cet niveau pas de probleme, mais ce n'est que la 1ere ligne de ma table qui s'affiche quand j'ajoute des conditions.
Voici mon code

Code : Tout sélectionner

<?php echo ' <table id="example2" class="table table-bordered table-hover"> <tr> <th>Nom</th> <th>Description</th> <th>Utilisateur</th> <th>Utilisateur avec pouvoir</th> <th>Superviseur</th> <th>Technicien</th> <th>Administrateur</th> </tr>'; $requete = mysql_query("show full columns FROM dem_rights") or die(mysql_error()); while($info = mysql_fetch_array($requete)) { if ($info[0]!='id_rights' && $info[0]!='profile') { //special char $info['Comment']=$info['Comment']; echo ' <tr id="'.$info['0'].'"> <td>'.$info['0'].'</td> <td>'.$info['Comment'].'</td> <td> <center>'; $requete = mysql_query("SELECT * FROM dem_rights where profile LIKE '2%'"); $rv = mysql_fetch_array($requete) or (mysql_error()); if($rv[$info[0]]!=0) { echo' <button onclick=\'window.location.href="./index.php?page=admin&subpage=profile&value=0&object='.$info[0].'&profile=2";\' class="btn btn-xs btn-success"> <i class="icon-ok bigger-120"></i> </button> '; } else { echo' <button onclick=\'window.location.href="./index.php?page=admin&subpage=profile&value=2&object='.$info[0].'&profile=2";\' class="btn btn-xs btn-danger"> <i class="icon-ban-circle bigger-120"></i> </button> '; } echo' </center> </td> <td> <center>'; //find value $requete = mysql_query("SELECT FROM dem_rights where profile LIKE '1%'"); $rv = mysql_fetch_array($requete) or (mysql_error()); if($rv[$info[0]]!=0) { echo' <button onclick=\'window.location.href="./index.php?page=admin&subpage=profile&value=0&object='.$info[0].'&profile=2";\' class="btn btn-xs btn-success"> <i class="icon-ok bigger-120"></i> </button> '; } else { echo' <button onclick=\'window.location.href="./index.php?page=admin&subpage=profile&value=2&object='.$info[0].'&profile=2";\' class="btn btn-xs btn-danger"> <i class="icon-ban-circle bigger-120"></i> </button> '; } echo' </center> </td> <td> <center>'; //find value $requete = mysql_query("SELECT * FROM dem_rights where profile LIKE '3%'"); $rv = mysql_fetch_array($requete) or (mysql_error()); if($rv[$info[0]]!=0) { echo' <button onclick=\'window.location.href="./index.php?page=admin&subpage=profile&value=0&object='.$info[0].'&profile=2";\' class="btn btn-xs btn-success"> <i class="icon-ok bigger-120"></i> </button> '; } else { echo' <button onclick=\'window.location.href="./index.php?page=admin&subpage=profile&value=2&object='.$info[0].'&profile=2";\' class="btn btn-xs btn-danger"> <i class="icon-ban-circle bigger-120"></i> </button> '; } echo' </center> </td> <td> <center>'; //find value $requete = mysql_query("SELECT * FROM dem_rights where profile LIKE '0%'"); $rv = mysql_fetch_array($requete) or (mysql_error()); if($rv[$info[0]]!=0) { echo' <button onclick=\'window.location.href="./index.php?page=admin&subpage=profile&value=0&object='.$info[0].'&profile=2";\' class="btn btn-xs btn-success"> <i class="icon-ok bigger-120"></i> </button> '; } else { echo' <button onclick=\'window.location.href="./index.php?page=admin&subpage=profile&value=2&object='.$info[0].'&profile=2";\' class="btn btn-xs btn-danger"> <i class="icon-ban-circle bigger-120"></i> </button> '; } echo' </center> </td> <td> <center>'; //find value $requete = mysql_query("SELECT * FROM dem_rights where profile LIKE '4%'"); $rv = mysql_fetch_array($requete) or (mysql_error()); if($rv[$info[0]]!=0) { echo' <button onclick=\'window.location.href="./index.php?page=admin&subpage=profile&value=0&object='.$info[0].'&profile=2";\' class="btn btn-xs btn-success"> <i class="icon-ok bigger-120"></i> </button> '; } else { echo' <button onclick=\'window.location.href="./index.php?page=admin&subpage=profile&value=2&object='.$info[0].'&profile=2";\' class="btn btn-xs btn-danger"> <i class="icon-ban-circle bigger-120"></i> </button> '; } echo' </center> </td> </tr>'; } } echo' </tbody> </table>'; ?>
Quelqu'un peut il m'aider ? SVP

Re: Afficher une table sql dans un tableau php

Posté : 28 déc. 2016, 09:04
par Spols
Je connais pas la syntaxe SHOW FULL COLUMNNS
mais comme tu utilise la même variable $requete pour ta requète primaire et tes sous requète, il doit y avoir un conflit.
dans un premier temps, change le nom de la variable $requete pour ta requète SHOW FULL COLUMNS ...

ensuite il doit y avoir moyen de ne faire que 2 requète en tout plutot que 4 fois le nombre de colonne. pourrais ton avoir la structure de ta table et un jeu de données cohérent (pas obligé de donner des vrai infos)

Re: Afficher une table sql dans un tableau php

Posté : 28 déc. 2016, 11:01
par moogli
salut,

alors "show full columns latable" retourne la description des tables (nom des champs, type, collation etc.) à quoi cela peux il bien servir pour afficher le contenu d'une table (en dehors d'application comme phpmyadmin ou heidisql)?

L'extension mysql étant supprimé de php7 (version courante) il est préférable de migrer vers mysqli (surtout si c'est du dev neuf, même en maintenance d'ailleurs c'est possible). Il y a un tuto la dessus : faq-tutoriels/passer-mysql-mysqli-pdo-t276282.html

les colonnes tu dois les connaitre, c'ets un minimum de connaitre son modèle de données.
La ce que je vois c'est que t'attends à avoir des données que tu peux sélectionner dès le départ, au pire avec des subselects.

il ne faut pas faire de select *. ce n'est pas parlant (bonjour le select puis $data[42] derrière) et anti-performant, la tu ramènes toute les colonnes pour en utiliser une seule ...

la pour chaque colonne de la table qui ne sont pas id_rights ou profile tu affiches le nom de la colonne et le commentaire (est tu certains d'avoir des commentaires de colonne dans le script de création de la table ?).
ensuite tu fait quatre fois le même traitement avec juste le prédicat de la requête qui change => on fait une fonction fait cela et retourne le html, en paramètre le contenu de $info[0] et le prédicat.
y a moyen de gagner 60 lignes de code ;)

$requete = mysql_query("SELECT * FROM dem_rights where profile LIKE '2%'");
$rv = mysql_fetch_array($requete) or (mysql_error());

if($rv[$info[0]]!=0)
{
récupération de toutes les lignes avec la colonne profile qui commence par 2 => plusieurs lignes possible mais on utilise que la première (utiliser la clause limit 1 de mysql semble une bonne idée ainsi qu'indiquer le nom de la colonne, ;) )
si le contenu de la colonne est !=0 on affiche d'un lien sinon un autre (au passage faudrait utiliser la même chose et juste changer le paramètre valeur et la classe css c'est réalisable de façon simple et lisible).

après avoir lu tous cela je pense que :
- tu as créé une table avec le nom des gens en nom de colonne
- que tu as mis des commentaires pour chaque personne parce que c'est pas claire d'avoir juste un nom ou un trigramme
- que la colonne profile correspond à un type de compte (admin ou autre)
- que tu dois avoir une ligne par type de profile
- que dans la colonne qui porte le nom de quelqu'un pour le profile qui va bien tu met 1 ou zéro en fonction du fait qu'il ai ou pas le droit
- que tu ne t'en sort pas parce que le modèle est foireux

cela implique que si tu as 400 utilisateurs tu as + de 400 colonnes, donc quand tu affiches la table des droits tu fais
- 1 requête pour les noms de colonnes
- 5 requêtes pour les cinq types de droit multiplié par le nombre de colonne => 2000
2001 requêtes pour afficher les données de 400 personnes

imagines avec phpfrance (21462 en ce moment) cela donne 107311 requêtes (oui je sais en vrai on affiche pas autant de données c'est inutile mais c'est pour l'exemple).

Bref ton modèle est foireux :-)
en règle général il y a trois tables
- une table avec les utilisateurs (nom, prénom, mot de passe, id e connexion etc)
- une table avec les types de droits (admin,, tech etc).
- une table qui fait la liaison des deux

voici le MCD (Modèle Conceptuel de Données) correspondant
mcd_user_right.png
Le MPD (Modèle Physique de Données)
mpd_user_right.png
Le script des créations des tables de l'exemple https://gist.github.com/anonymous/dfa98 ... 8747c5457e

avec un tel modèle il est possible de ne faire qu'une seule requête pour lister les droits utilisateurs.
suivant les cas d'usage
- il y a une hiérarchie des droits un seul est attribué et il inclus ceux du "dessous"
la requête est simple (j'ai ajouté des noms de colonne qui ne sont pas dans l'exemple de mcd minimal pour que cela soit parlant)
SELECT utilisateur_id,nom, prénom,droit_id, libelle_droit
FROM droits_utilisateurs
JOIN utilisateur USING(utilisateur_id)
JOIN droits USING(droits_id)
- pas de hiérarchie un utilisateur a plusieurs droits
la version n +1requête
select des utilisateur
pour chaque utilisateur on récupère ses droits
SELECT utilisateur_id, nom, droits_id,libelle_droit
FROM utilisateur
LEFT JOIN droits_utilisateurs USING(utilisateur_id)
LEFT JOIN droits USING(droits_id)
order by utilisateur_id asc, droits_id asc;
cela te donne tout les utilisateurs avec les lignes de droits qu'ils ont ou pas.
si un utilisateur n'as pas de droit avec les colonnes des droits sont null

pour l'affichage il faut changer de ligne de table html (</tr><tr>) quand l'utilisateur change dans le jeux de données.
donc garder l'id de l'utilisateur de la ligne précédente et comparer au courant. Il faut aussi savoir combien de colonne tu ajoutes à ta table pour afficher cela correctement.

la solution avec des subselect (possible si peux de droits)
SELECT utilisateur_id, nom, 
(select count(1) from droits_utilisateurs d where droits_id=1 and d.utilisateur_id=u.utilisateur_id) as is_admin,
(select count(1) from droits_utilisateurs d where droits_id=2 and d.utilisateur_id=u.utilisateur_id) as is_tech,
(select count(1) from droits_utilisateurs d where droits_id=3 and d.utilisateur_id=u.utilisateur_id) as is_autre
FROM utilisateur u
order by utilisateur_id
la pour chaque utilisateur tu as l'information sur chaque droit 1 = accordé, zéro = non accordé
l'affichage est alors simple.
on peux aussi imaginer une construction dynamique de cette requête en fonction des droits en base
- une requête pour les droits => le résultat dans un tableau
- construction de la requête en fonction de ce qu'il y a dans le tableau
- pour l'affichage il faut affiche les colonnes classique de l'utilisateur pour parcourir le tableau des droits pour afficher les colonnes associer.
c'est assez simple et efficace pour arriver au même rendu que toi en deux requêtes sql ;)


@+