IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Filtrage/Tri] Filtrer et ordonner les données issues d'une BDD


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut [Filtrage/Tri] Filtrer et ordonner les données issues d'une BDD
    Bonjour,

    J'ai repris l'administration d'un site que je n'ai pas conçu (je ne suis pas développeur à la base non plus..)
    J'ai comme projet actuel de refondre une page (et le code PHP associé) qui permet d'afficher une liste de personnes inscrites à un évènement.

    Pour présenter un peu l'existant :
    On passe comme argument, au formulaire "evenement.php", un ID (unique) de l'évènement que l'on souhaite consulter.
    Ceci nous affiche alors une page, comprenant les détails de l'évènement, ainsi qu'une liste d'inscrits à l'évènement.

    #### Infos techniques ####
    La liste des inscrits est récupérée via une requête SQL, sur une base MariaDB, dans la table "inscription", en filtrant sur l'id de l'évènement, de manière à ne récupérer que les inscrits de l'évènement consulté.
    Cette table contient plusieurs_colonnes, dont celles qui suivent : id_inscription, id_evenement, id_user, licence, mail, timestamp, type
    id_inscription : numéro unique d'une inscription dans la table
    id_eveènement : id_de l'évènement auquel l'inscription correspond
    id_user : identifiant de l'utilisateur qui s'est inscrit (si existant dans la table "user", j'y reviendrai plus tard), sinon "0".
    licence : numéro de licence de l'utilisateur (c'est un club sportif, chaque inscrit possède une numéro de licence national unique);
    mail: l'adresse mail donnée lors de l'inscription
    timestamp : le date et l'heure de l'inscription
    type : le type d'utilisateur (parmi 3 : encadrant, encadré, autonome), choisi lors de l'inscription

    l'id_user est "recherché" au moment de l'inscription, dans la table des adhérents, à partir du numéro de licence, demandé de le formulaire d'inscription.
    Si aucun numéro de licence en base ne correspond, alors l'id_user attribué est 0.
    ####

    #### Contexte ####
    A ce jour, la liste des inscrits est affichée dans un vulgaire tableau unique, dans l'ordre des inscriptions (timestamp en base), avec un affichage différencié à partir de la N-ième inscription, pour simuler une liste d'attente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     Liste des inscrits :
    1- Alice
    2- José
    3- Bob
    4- Nicolas (exerne)
    5- Jacques (externe)
    6- Alex
    7- Jérome
    8- Martine
    ---- Liste d'attente ----
    9- Léo (externe)
    10- Raymond
    11-Lucie (externe)
    Il n'y a pas non plus de différenciation entre le type d'utilisateur (encadré, encadrant, autonome), ni sur le caractère adhérent ou non (gestion des "externes")
    ####

    #### Objectif ####
    Ce que je souhaite faire c'est :
    - Créer un affichage de 3 listes séparées, selon le type d'utilisateur (pas compliqué en soi, il suffit éventuellement de faire 3 requêtes SQL séparées avec une condition WHERE sur le type d'utilisateur)
    - Gérer l'ordre des inscrits dans chaque liste, selon les deux critères suivants : caractère adhérent/externe, puis ordre d'inscription ==> Les adhérents sont automatiquement prioritaires devant les externes et on les affiche systématiquement en liste d'attente, puis c'est l'ordre d'inscription qui fait foi ensuite.


    Exemples de ce que je souhaite obtenir (imaginons ici que la liste "principale" n'aie que deux slots avant d'être mis en liste d'attente; en réalité, le nombre de slots disponibles pour chaque évènement et chaque type est indiqué en base)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Encadrants :
    1- Alice
    2- José
    ---- Liste d'attente ----
    3- Alex
    4- Nicolas (exerne)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Encadrés :
    1- Jérôme
    2- Martine
    ---- Liste d'attente ----
    3- Raymond
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Autonomes :
    1- Bob
    ---- Liste d'attente ----
    2- Léo (externe)
    3- Jacques (externe)
    4- Lucie (externe)
    ####

    A ce jour, la liste des inscrits est mise dans un array suite à la requête SQL de récupération des inscriptions.

    Je n'ai aucune idée de la façon de procéder pour atteindre ce que je souhaite.
    Dois-je créer des tables temporaires en fonction du type d'utilisateur de façon à pouvoir gérer la différenciation et l'ordonnancement des inscriptions ensuite ?
    Est-il possible (et souhaitable) de créer des array à plusieurs colonnes, en PHP, qui simuleraient des tables SQL, dans lesquelles il serait ensuite possible de manipuler les données ?
    Dois-je calculer le statut de l'adhésion avant de mettre les données dans l'array ou est-il préférable de le faire ensuite, en passant une fonction PHP sur chaque élément du tableau ?

    Est-il préférable d'utiliser une librairie PHP (et si oui avez-vous des exemples) qui permettent de manipuler des données issues de requêtes SQL ?

    Pour la partie codage, je pense pouvoir me débrouiller, mais je sèche déjà sur la partie algorithmique, ne sachant pas trop les possibilités offertes par PHP, et donc les choix qui en découlent.

    Merci pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    A ce jour, la liste des inscrits est mise dans un array suite à la requête SQL de récupération des inscriptions.
    Heu tu n'as pas moyen de faire le tri dans la requête ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    Heu tu n'as pas moyen de faire le tri dans la requête ?
    Si, c'est une des pistes, au moins pour la partie séparation des 3 listes comme proposé.
    Mais quid ensuite de la gestion des externes et de l'ordonnancement (mise en liste d'attente systématique) ?
    Car autant je peux faire un ORDER BY sur deux colonnes (si je fais une jointure SQL au préalable des deux tables 'user' et 'inscription' sur la clé "id_user"), je ne vois pas trop ensuite comment gérer la liste d'attente.

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    Il n'y a pas non plus de différenciation entre le type d'utilisateur (encadré, encadrant, autonome)
    Et du coup comment tu espère les différentier ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 757
    Points : 2 992
    Points
    2 992
    Par défaut
    Je réfléchi rapido : tu dis que créer trois listes serait simple et donc obtenir une seule liste avec SELECT... UNION... Tu peux donc ne retourner qu'une seule liste.
    Imaginons que la première liste aurait un ROW_NUMBER entre 1 et 900, la deuxième liste à partir de 1. 000 et la troisième liste à partir de 10.000
    https://www.mysqltutorial.org/mysql-...mber-function/.

    Tu aurais donc une liste unique avec cette colonne sur laquelle tu fais un tri ascendant.

    Cela me semble jouable et donc zéro php, tout en SQL ce qui est, en fair, son job.

    Juste une piste théorique je pense...
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    Et du coup comment tu espère les différentier ?
    Désolé, je me suis mal exprimé.
    A ce jour, je ne différencie pas mes listes en fonction du type d'inscrit.
    En revanche, la différenciation est bien présente dans la table inscription de la BDD (colonne "type")

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par cavo789 Voir le message
    Je réfléchi rapido...
    Merci pour cette piste, je suis justement preneur de différentes idées pour arriver au résultat escompté, c'est le but de mon message initial, orienter ma réflexion vers des idées que je n'ai pas, faute de connaissances.

  8. #8
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    dans le développement d'une application de gestion de données, on peut regrouper votre travail en 3 étapes :
    • 1re étape : étude des fonctionnalité et création de la structure de la BDD
    • 2e étape : code php qui va générer l'affichage des différentes pages
    • 3e étape : optimisation


    en ce qui concerne la 1re étape, j'ai l'impression que la structure est correcte, qu'elle respecte les règles de création donc je pense que vous n'avez pas besoin d'y toucher. ce qui est une bonne nouvelle parce qu'une modification de la structure demanderai d'aller étudier tous les fichiers existants pour trouver les modifications à faire.
    vous êtes donc maintenant à la 2e étape. d'après la théorie des langages de programmation, un algorithme faisable avec un langage est faisable avec n'importe lequel. donc le fait d'utiliser php ne devrait pas vous empêcher de réaliser le résultat souhaité. puisque vous avez l'air d'indiquer que vous manquez de connaissances, vous n'aurez peut-être pas l'expérience nécessaire pour trouver les boucles à utiliser. si c'est cette étape qui vous bloque, je vous conseille de commencer par faire le code html d'une page d'exemple avec quelques noms. cela vous aidera à mieux vous représenter le code html à générer et d'un autre coté vous pourrez nous montrer des capture d'écrans parce que j'ai du mal à comprendre comment vous voulez présenter les 3 listes (sur la même page ? sur 3 pages différentes ?)

    et pour la 3e étape, cela se fera à la fin. une fois que vous aurez le résultat souhaitez, ça sera le moment de réfléchir à une optimisation si jamais la page mets beaucoup trop de temps à se générer. ça sera à cette étape que vous allez réfléchir à l'utilisation d'un cache dans la base de données (les tables temporaire dont vous parlez) ou d'un cache coté php.

Discussions similaires

  1. Réponses: 17
    Dernier message: 21/07/2015, 11h32
  2. [MySQL] Filtrer les données issues d'une base pour les afficher
    Par fxzone dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/05/2012, 08h43
  3. Réponses: 0
    Dernier message: 02/12/2011, 09h10
  4. [MySQL] Les données issues d'une requête SQL sont erronées
    Par edenreal dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 21/08/2009, 00h41
  5. Exporter les données issues d'une requête vers un doc Word
    Par sebpreps dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/05/2008, 17h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo