Comment afficher données issues de la bdd (et les conserver selon critères util

Résolu
lolymeupy Messages postés 33 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 6 janvier 2009 - 19 mars 2008 à 13:36
lolymeupy Messages postés 33 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 6 janvier 2009 - 19 mars 2008 à 14:22
Bonjour,
j'essaye de créer un site mais j'ai une question en suspend que je
n'arrive pas à résoudre (malgré de nombreuses recherches en tutos et
autres) !
Je veux faire un site de consultation de données (selon 2 ou 3 critères
on dira)
Donc, ce que je voudrais savoir c'est quelle la meilleure solution :
- soit récupérer TOUTES les données consultables (qui viennent d'une
même table),(donc une connexion et une requête select à la base),
les "stocker" en mémoire centrale au lancement du site, et
lorsque l'utilisateur clique sur un critère on affiche les données
correspondantes...et ainsi de suite jusqu'à ce que l'utilisateur se
deconnecte et on "vide" alors les données de la mémoire centrale

-soit on crée une requete (avec une connexion et fermeture de la Bdd)
à CHAQUE critère choisi par l'utilisateur. C'est a dire qu'on ne charge
que les données dont l'utilisateur a besoin au moment précis.

Pb : pour la deuxième solution, les connexions et fermeture de Bdd, et
les requetes peuvent se multiplier selon l'envie de l'utilisateur.
Donc, peut-etre que la première solution est la meilleure ? et si oui,
comment stocker ces données le temps de la connexion de l'utilisateur?
Problème de persistance des données ?Connaissez-vous des tutos la
dessus ?

2 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
19 mars 2008 à 14:02
Salut,

Posons quelques bases. Un développement de site web se différencie d'un développement d'application "standard" du fait que, comme tu le soulignes, les données ne persistent (a priori) pas d'une page à l'autre.
Je dis a priori, parce qu'on peut conserver des données d'une page à l'autre, et d'une visite à l'autre d'un même visiteur. Seulement, il y a des contraintes :
- il faut conserver chez le client (le navigateur) une information qui permet à PHP de reconnaitre l'utilisateur à chaque visite
- la quantité de données que l'on peut conserver est relativement limitée.

Quand un script PHP est exécuté par le serveur, toutes les variables, ressources, connexions sont détruites à l'arrêt du script. Cela implique qu'on perd systématiquement les connexions aux bases de données, on perd les variables définies, etc.

On peut conserver ce qui est, je dirais, d'ordre statique : les variables notamment. On peut les linéariser (avec la fonction serialize() ), les stocker quelque part sur le serveur (typiquement un fichier avec les sessions, ou dans une base de données), et les réutiliser plus tard (après les avoir passées dans la fonction unserialize() ).

Concernant ton problème, tout dépend en fait de la quantité de données que tu vas récupérer à chaque critère.
Très sincèrement, stocker le résultat d'une recherche pour chaque utilisateur et le supprimer à sa déconnexion n'est pas une solution viable, pour deux raisons :
- tout d'abord, si la requête de l'utilisateur rappatrie tout le contenu de la base de données, et que chaque utilisateur fait pareil, tu vas te retrouver avec N+1 fois ta base de données stockée sur le disque dur de ton serveur. La base de données sert justement à centraliser...
- ensuite, parce que tu ne pourras JAMAIS savoir quand ton utilisateur se déconnecte, à moins qu'il ne clique spécifiquement sur un lien qui t'en informe. A défaut, sa session restera potentiellement ouverte une durée maximale fixée dans la configuration des sessions PHP (dans le fichier php.ini, valeur modifiable avec la fonction ini_set(). Pour peu que le visiteur n'accepte pas les cookies et recharge plusieurs fois ton site sans conserver l'identifiant de session, tu pourrais te retrouver avec 25 copies de la base de données pour un même utilisateur. Autant dire que c'est du suicide.

Ensuite, il faut savoir que les fonctions PHP sont optimisées pour un développement web (de fait...) et les SGBD(R) (qu'il s'agisse de MySQL, Oracle, PostgreSQL, MsSQL, etc) sont optimisés pour gérer des bases de données volumineuses (même si certains sont plus performants que d'autres).

Donc se connecter à chaque affichage de page, c'est vraiment, mais alors vraiment pas un problème en terme de performances : de toute façon, t'as pas trop le choix... Donc tu fais avec, mais vraiment, c'est insignifiant, à moins que ton hébergeur n'ai placé le serveur de bases de données à des millions de kilomètres du serveur HTTP et qu'ils soient reliés par modem RTC, ce qui ne devrait pas être le cas (bon j'exagère un peu le schéma, mais bon, c'est pour donner une idée).
Pour ce qui est des requêtes sur la base de données, les SGBD(R) utilisent des index (à toi de bien les définir) pour optimiser les recherches et d'une manière générale, toutes les requêtes avec critères.

Concernant la persistance des connexions, il est toutefois possible d'utiliser des connexions persistantes, ce qui n'est pas forcément recommandé, surtout en environnement web. Ces connexions ne sont pas refermées après l'exécution d'un script et peuvent être réutilisées à une prochaine exécution (peut importe le visiteur du site, c'est le problème de PHP de gérer ça).
L'inconvénient est que les connexions persistantes requièrent des ressources de manière permanente, puisqu'elles ne sont refermées que plus tard, après un certain temps d'inutilisation. Elles sont aussi limitées en nombre (du fait de la consommation des ressources). Si tu as beaucoup de visiteurs et si le serveur n'a pas assez de connexions et qu'il ne peut plus en ouvrir, ton site deviendra inaccessible.

Conclusion : n'aies pas peur d'ouvrir une connexion (non persistante) à chaque page, et de faire une requête chaque fois qu'un utilisateur change un critère : si ta base de données est bien pensée, que tu mets les bons index où il faut (bien lire la doc du SGBD(R) utilisé), il n'y a vraiment aucun problème à redouter particulièrement.

<hr size="2" width="100%" />Neige
3
lolymeupy Messages postés 33 Date d'inscription jeudi 19 avril 2007 Statut Membre Dernière intervention 6 janvier 2009
19 mars 2008 à 14:22
Merci beaucoup neige pour ces explications limpides.
Ca m'éclaire pas mal parce que par rapport à ce problème, j'avais
beau cherché, je trouvais pas du tout de tuto clair la dessus..
Maintenant, je sais ce qu'il faut faire et ne pas faire, et surtout
POURQUOI faire de telle manière...
Donc merci encore .
(et merci aussi pour l'autre post sur le "pb de syntaxe")
3
Rejoignez-nous