Demande d'avis/conseil sur la façon de gérer les données issues d'une BDD

Petit nouveau ! | 7 Messages

17 juil. 2015, 09:40

Bonjour à tous!

Je suis débutant en développement Web et il y a une semaine j'ai débuté une petite application. Je me demendais donc si vous pouviez me dire si mon raisonnement est correct, vos avis, vos conseil ou comment il faudrait faire si ce n'est pas une façon correct de réaliser la chose.
Je vais essayer de rapidement vous décrire son fonctionnement en mettant une numérotation comme ça si vous voulez aborder un point en particulier ce sera plus simple :
Je possède une BDD avec beaucoup d'entrées que je souhaite afficher dans un tableau HTML.

1 - Comme il y a beaucoup de données, je pense mettre un système de pagination comme celui-ci : https://www.youtube.com/watch?v=dYMi89K1Bsg où à chaque page j'ai un tableau HTML avec un certain nombre d'entrées de ma BDD (20,50 ou 100).

2 - Pour chaque page, je créais le tableau directement depuis ma fonction php (avec quelques conditions/ boucles car il y a des rowspans à générer).

3 - Chaque ligne du tableau est sélectionnée en cliquant dessus pour ensuite effectuer des actions avec l'ensemble des lignes sélectionnées. Lorsqu'une ligne est sélectionnée, sa 1ere cellule de la ligne(qui correspond à la clé primaire de ma table dans la BDD) est mise dans un array qui est transmis à chaque changement de page de la pagination (pour ne pas perdre les données précédemment sélectionnées). (Est-ce réalisable? Je veux dire est-il possible, lors d'un clic sur le bouton pour aller sur la page suivante, d'envoyer l'array qui contient toutes les 1ere cellules des lignes sélectionnées (par un POST par exemple)?)

4 - Après la sélection, lors du choix d'une action (suppression / export vers excel), je fais une nouvelle requête SQL avec comme condition l'array des lignes sélectionnées pour montrer une dernière fois la sélection à l'utilisateur avant qu'il ne valide l'action.
(C'est la ma plus grosse question : est-ce correct de refaire une requête SQL avec comme condition l'array des selection où aurait-il mieux valu stocker entièrement les lignes sélectionnées dans des array d'array? Car pour moi refaire une requête est beaucoup plus simple que devoir gérer des array d'array mais je ne sais pas si c'est "correct" de faire comme cela...)

Désolé pour ce post assez long mais je pense que les éléments dépendent les uns des autres et qu'il est plus pratique d'avoir une vue d'ensemble pour pouvoir donner son avis.

Donc si vous pouviez me dire si ma façon de procéder est correct, mais aussi me donner votre avis, des conseils ou la façon dont vous auriez fait la chose. Car je suis débutant et j'ai tant de chose à apprendre=) !

Merci .

Mammouth du PHP | 688 Messages

17 juil. 2015, 10:05

c'est plus simple de faire la pagination en javascript, donc le php affiche toutes les entrées et tu n'as qu'un seul formulaire.

4. ok pour refaire une requete à partir des id

Petit nouveau ! | 7 Messages

17 juil. 2015, 10:51

merci pour votre réponse!

D'accord, si ça ne pose pas de problème de refaire une requête, ça me retire une sacrée épine du pied.

Par contre si je fais la pagination en javascript comme vous l'avez dis le php doit d'abord prendre toutes les données, mais le problème c'est que j'ai beaucoup d'entrées dans ma table (admettons que j'ai 4000 entrées), donc si je dois tout charger en une fois, ça risque de prendre beaucoup de temps à charger la page non?

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

17 juil. 2015, 11:54

Bonjour,

Effectivement, pour un nombre important de données il peut effectivement être préférable d'utiliser un système de pagination ou du moins de chargement progressif des données (type infinite scroll) pour ne pas aller lire 10.000 enregistrements quand finalement seul les 10 premiers pourraient être suffisant.

Pour le lien dans la pagination, tu peux effectivement à l'aide javascript, adapter celui-ci pour qu'il soumette un formulaire en post au lieu de juste ouvrir une page http. Tu pourrais ainsi récupérer tes ID avec php et les stocker dans un array que tu places en session pour conserver les données d'une page à l'autre.

Si tu as le temps et/ou l'envie, tu peux aussi regarder du côté des requêtes ajax qui te permettraient de faire appel au serveur sans avoir à recharge la page. Dès que ton utilisateur clique sur une ligne, tu ferais appel au serveur pour ajouter ou enlever l'id du tableau en session sans que l'utilisateur ne quitte la page sur laquelle il se trouve. Tu conserverais ainsi une pagination classique, sans avoir besoin de transmettre les données puisque celles-ci auraient été traitées au fur et à mesure des clics :)

Enfin tu peux utiliser ton tableau d'id en session pour proposer ta page de confirmation (avec par exemple un SELECT ... WHERE id IN (....) avec un implode() du tableau d'ids). Tu pourras du coup réutiliser cette liste d'id dans ta requête de suppression, export, etc. Tu peux également dans ta page de confirmation proposer des cases à cocher pour chaque id et traiter la confirmation comme un envoi de formulaire classique :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 7 Messages

17 juil. 2015, 12:09

Wow, merci pour cette réponse pleine de nouvelles choses pour moi.

Je venais de découvrir un peu avant ce qu'était AJAX et les possibilités que ça offrait, mais ça l'ai assez compliqué à mettre en place, il faudrait que je regarde plus attentivement.
Pour ce qui est des sessions, je ne connaissais pas non plus. C'est vrai que ça à l'air pratique, si j'ai bien compris c'est une sorte de variable "super-global"?
Dans toutes les solutions que vous m'avez proposé, il y en a-t-il une ou deux qui se détache des autres par sa simplicité à mettre en place ou son efficacité?

Mammouth du PHP | 688 Messages

17 juil. 2015, 13:55

un exemple avec un peu plus de 3000 entrées :
http://www.kikourou.net/resultats/resul ... -2015.html
une seule requête quoi qu'il arrive, alors qu'il faut 30 requetes si l'on scinde par paquet de 100 en php.

il faut aussi se poser la question de l'ergonomie d'un système où il faut sélectionner des lignes parmi 4000 entrées.

Petit nouveau ! | 7 Messages

17 juil. 2015, 15:13

un exemple avec un peu plus de 3000 entrées :
http://www.kikourou.net/resultats/resul ... -2015.html
une seule requête quoi qu'il arrive, alors qu'il faut 30 requetes si l'on scinde par paquet de 100 en php.
Ok, je pensais que charger toutes les données en une seule fois mettrais trop de temps (En fait c'est l'affichage des données qui met du temps et non pas leurs traitement? J'avoue ne plus trop comprendre). Dans ce cas comment faudrait-il procéder? Charger toute ma BDD dans un énorme array. Puis je gére l'affichage en pagination de cet array avec une fonction javascript?
il faut aussi se poser la question de l'ergonomie d'un système où il faut sélectionner des lignes parmi 4000 entrées.
Qu'entendez-vous par là ?