Constructeur, base de données et session - PHP - Programmation
Marsh Posté le 07-12-2017 à 14:06:40
Tu as quand un même un "style" de codage particulier :
Citation : Quelle est la solution la plus répandue ? |
Franchement, je ne suis pas pour faire le mouton non plus mais ton code a une lacune : avec un include/require au lieu de leur variante en _once tu vas inutilement multiplier les connexions MySQL(i). De même avec des fonctions/méthodes, questions de portée, à moins d'un global bien crade, en l'état, tu es obligé de refaire un include (ou require) = une autre connexion à chacun de ses appels. Avec une approche type singleton, ça te garantirait une seule connexion.
Citation : Dans mes variables de session, je ne stocke que les identifiants plutôt que des objets entiers |
Certaines informations n'ont rien à faire en session (à commencer par le mot de passe, même haché). Ca dépend aussi comment on voit les choses : l'avantage de "revalider" le compte à chaque requête HTTP c'est que les informations de ce compte seront prises en compte immédiatement. Par exemple, si tu veux bannir un compte et que l'utilisateur en question est en ligne, ce sera effectif pour ainsi dire tout de suite. Bien évidemment, si tu te bases uniquement sur les informations en session, certes ça fait économiser une requête SQL par requête HTTP mais tant qu'il fera durer sa session, il pourra sévir puisque le ban ne sera pas pris en compte avant la fin de session.
Citation : J'ai ensuite lu qu'il valait mieux ne pas lier la classe et la requête SQL |
J'irais au plus simple en faisant en sorte de pouvoir "hydrater" directement un objet de la classe User (ie via mysqli_fetch_object). Après, ça dépend comment on voit les choses.
Marsh Posté le 07-12-2017 à 14:47:33
Ligne 23 : à ne surtout pas faire !
On initialise la connexion à la BD en début de script et on la ferme à la fin du script. Le temps de création d'une connexion est bien trop long.
Par ailleurs, si tu fais de l'objet, je te recommande vivement de regarder le design pattern MVC. En particulier, il faut passer par un objet BD qui va se charger d'effectuer toutes les requêtes SQL à la BD et renvoyer les résultats aux objets demandeurs. Comme ça, t'as pas du SQL partout.
Marsh Posté le 07-12-2017 à 15:24:23
Citation : Tu as quand un même un "style" de codage particulier :
|
En fait je passe par des constantes parce que j'ai un fichier de paramétrage que je vais lire, et suivant si je suis en local ou sur mon serveur, j'initialise ces valeurs différemment, et je ne voulais pas que les infos de connexion se trouvent directement dans le fichier php.
Citation : |
Ok, c'est bien ce qu'il me semblait, je vais rapidement me retrouver avec beaucoup de connexions sur ma base.
Citation : |
Ok, donc suivant si les objets manipulés peuvent être modifiés "à la volée" ou sont plutôt statiques sur la durée d'une session, je peux utiliser l'une ou l'autre des solutions ?
Citation : |
J'ai lu des documents sur l' "hydratation", après j'ai lu des messages sur un système de wrapper, mais je n'ai pas trouvé d'exemple complet qui me permettent de lier tout ça...
Citation : Ligne 23 : à ne surtout pas faire ! |
Ok, mais la durée du script c'est quoi ? La session utilisateur ? J'ai vraiment l'impression qu'il me manque une notion pour manipuler ces concepts. Est-ce que cela signifie qu'il faudrait que je crée une classe db_connect que j' "include_once" au chargement de ma page "index.php" et que j'instancie ensuite à chaque fois que j'ai besoin d'aller en base ? Si non, il me faut une connexion persistente ?
Citation : |
Le concept MVC je l'avais manipulé de très loin avec GWT, mais dans mes souvenirs le framework faisait pas mal de choses tout seul, là j'ai envie de comprendre toute la logique, et donc de recréer ce dont j'ai besoin. Je vais aller me documenter là dessus.
Merci,
Marsh Posté le 07-12-2017 à 16:16:02
As-tu compris que lorsque tu appelles une page web (en .php a priori) via ton navigateur web, apache appelle l'interpréteur php qui va analyser ton fichier php et l'exécuter. Du coup, la durée de vie des variables créées dans ton script php (et les éventuels autres scripts php appelé via des includes) est le temps mis par php pour exécuter le script. Seules les variables de session persistent dans un fichier temporaire qui dure la durée de la session.
Donc, dans tous les scripts php qui ont besoin de faire des requêtes sql, il faut faire un include du script qui lance la connexion à la BD et faire un autre include pour clore la connexion à la BD à la fin du script (ou faire cette clôture directement à la fin de chaque script php).
Marsh Posté le 07-12-2017 à 17:20:28
Du coup je ne comprends pas. Dans mon fichier user.php qui contient ma classe User, j'ai mis un include de ma classe db_connect.php qui lance la connexion.
Cet include devrait plutôt se trouver en dehors de la fonction, tout en haut du fichier de classe ?
Ou directement dans index.php ?
J'ai lu pas mal de tutos :
https://www.phpflow.com/php/simple- [...] le-in-php/ : pas clair du tout, on ne sait même pas dans quel fichier il met son code
http://requiremind.com/a-most-simp [...] -tutorial/ : la manipulation de 'routes.php' me perturbe un peu, et dans les commentaires il est indiqué que ce n'est pas vraiment du MVC
https://fr.slideshare.net/KristenLe [...] cation-mvc : les sources sont un peu légères mais au moins on a tout sous la main, par contre sa classe Router.php me perd un peu.
https://www.supinfo.com/articles/si [...] controleur : il rajoute du javascript mais ça s'embrouille entre des fichiers .php qui se transforment en .js dans des captures d'écran, et c'est le seul endroit où j'ai vu du javascript
https://stackoverflow.com/questions [...] -practices : j'ai l'impression que c'est ce qui ressemble le plus à ce que je fais
https://www.codeproject.com/Article [...] rk-in-Hour : des commentaires qui vont de "AWESOME WORK!!!" à "You just did every possible mistake what you can."...
J'ai l'impression d'être dans une boite avec des dizaines de fenêtre, que chacune me montre un petit bout d'une plage de rêve, mais oublie de me préciser qu'elle est en plein milieu d'un banc de requins... A chaque fois que je pense avoir trouvé une piste claire, je lis des commentaires qui expliquent pourquoi il ne faut surtout pas faire ça, mais bien sûr qui n'expliquent pas ce qu'il faut faire...
Marsh Posté le 07-12-2017 à 18:54:15
Bon, finalement j'ai lu ça :
http://symfony.com/doc/current/int [...] fony2.html
et du coup je pense que c'est peut-être une solution plus simple que de réinventer la roue...
Marsh Posté le 07-12-2017 à 20:31:44
C'est peut-être pour ça que devenir développeur est un métier qui s'apprend en plusieurs années de formation et de pratique. Il n'y a pas une seule architecture qui soit bonne. Il y en a certes certaines qui sont vraiment mauvaises (typiquement, celle où tu fais un include de ta connexion à la BD avant chaque exécution de requête SQL car tu va créer plusieurs connexions et ces créations de connexions prennent du temps donc tu va avoir une appli très lente) mais d'autres bonnes, ont leurs avantages et inconvénients. Le tout est de bonne comprendre ce qu'on cherche à faire et trouver une bonne architecture qui va répondre au besoin. En effet, plusieurs designs patterns peuvent convenir à la résolutions d'un même pb mais certains seront plus adaptés que d'autres ou plus faciles à mettre en oeuvre.
Il faut également penser à l'aspect évolution du code de l'appli et à sa maintenabilité au cours du temps.
Parfois, un code peut être certes très optimisé (donc performant) mais ça sera tellement tordu et incompréhensible par ceux qui passeront derrière que ça ne sera pas maintenable, donc à éviter de faire des trucs trop "space" (ou alors, vraiment bien documenter).
Marsh Posté le 07-12-2017 à 20:44:10
Tout à fait d'accord, ça plusieurs années que je n'ai pas fait de developpement. Je fais un peu de R et de c# pour m'aider au quotidien mais je ne pensais pas être perdu à ce point sur PHP (enfin, surtout avec MVC). Je souhaite juste créer une interface assez simple, je pense que Symfony est trop complexe pour mon besoin, et même si je commence à comprendre le rôle des routers et de toutes les notions embarquées, j'ai un peu l'impression de partir dans la construction d'un char pour écraser une mouche. Je vais reprendre ça à tête reposée, je pense que vu mon besoin, je pourrais m'en sortir sans ce framework, il faut juste que je comprenne bien le role de chaque couche.
J'ai toujours eu un peu de mal avec la notion d'entités, j'aime bien écrire le SQL moi même, du coup je suis un peu entre le marteau et l'enclume.
De ton point de vue, tu penses qu'il est possible de construire quelque chose qui soit efficace et robuste en créant moi même tout ce dont j'ai besoin ou le passage par un framework est plus sûr ?
Marsh Posté le 07-12-2017 à 22:33:01
Pour ma part, je suis pas fan des frameworks. Pour un aspect MVC, tu peux regarder mon soft Icare (cf ma signature). Tu vas trouver aussi des objets qui chargent leurs données depuis une BD. Tout ça, sans framework ou ORM.
Marsh Posté le 08-12-2017 à 02:43:38
Merci pour tes réponses. Je ne suis pas fan des frameworks non plus, du coup je vais regarder ton projet. Ça devient un peu plus clair, je voudrais juste ne pas partir dans un projet perso qui dépasserait le temps que j'ai à y consacrer.
Marsh Posté le 08-12-2017 à 09:53:03
Le dév, ça prend beaucoup de temps, encore plus quand on débute où qu'on n'en fait pas régulièrement. On peut très vite être largué vu à quelle vitesse les technos évoluent !
Marsh Posté le 08-12-2017 à 11:15:59
C'est clair qu'entre mes premières lignes de code en Turbo Pascal et ce que je lis aujourd'hui, ça a bien évolué. J'ai toujours gardé un oeil sur les technologies en codant un peu en c++, en vb.net, plus récemment en c# ou en R, et je ne m'étais jamais senti aussi loin de comprendre un tuto qu'en me documentant sur php et surtout mvc.
Les concepts deviennent plus clairs en poursuivant mes lectures, je vais regarder attentivement ton code (merci pour le partage).
Marsh Posté le 08-12-2017 à 11:34:15
Avec des applis web codées dans un langage dynamique type PHP, ASP... il faut surtout bien comprendre ce qui est exécuté côté serveur et ce qui l'est côté client (navigateur interne). Et si tu rajoutes du Ajax, ça commence à bien se compliquer si t'as pas correctement structuré ton code
Marsh Posté le 19-12-2017 à 19:16:29
Tibar a écrit : Tout à fait d'accord, ça plusieurs années que je n'ai pas fait de developpement. Je fais un peu de R et de c# pour m'aider au quotidien mais je ne pensais pas être perdu à ce point sur PHP (enfin, surtout avec MVC). Je souhaite juste créer une interface assez simple, je pense que Symfony est trop complexe pour mon besoin, et même si je commence à comprendre le rôle des routers et de toutes les notions embarquées, j'ai un peu l'impression de partir dans la construction d'un char pour écraser une mouche. Je vais reprendre ça à tête reposée, je pense que vu mon besoin, je pourrais m'en sortir sans ce framework, il faut juste que je comprenne bien le role de chaque couche. |
Je t'encourage à te mettre à MVC: c'est un des pattern POO les plus utilisé pour structurer une App, il est donc incontournable.
Ca aide bcp quand on débute et quand on a des hésitations sur la structure d'une app
Jette un oeil aussi sur php composer (gestion des dépendances): une fois qu'on y a gouté, on peut plus s'en passer.
un lien incontournable:
http://www.phptherightway.com/
Il ya aussi le Bouquin ModernPHP qui est intéressant
https://github.com/codeguy/modern-p [...] /README.md
et effectivement oublie Symfony si tu débutes: il est connu pour sa complexité et son côté usine à gaz.
Il est bien pour des gros projets, mais pour des petites app il est clairement overkill et tu risques de te perdre plus qu'autre chose.
Pour les débutants il ya CakePHP et CodeIgniter qui sont biens
Marsh Posté le 19-12-2017 à 19:52:15
Salut,
Merci pour ta réponse. Là j'ai juste créé 3 pages et 2 classes en PHP basique (c'est à dire en mélangeant html, sql, php), puis j'ai commencé à séparer les éléments.
J'ai, pour chaque page, un fichier php qui gère la validation des saisies et la construction / validation des objets.
Ensuite j'ai plusieurs templates html que je paramètre avec PHP et des fichiers de traduction
Les deux parties qui me gênent sont :
Le routeur, j'ai essayé plusieurs tutoriels mais il y a un concept qui me manque
La partie séparation sql PHP dans mes classes, pour le moment j'ai des variables privées dans mes objets, et des fonctions publiques qui contiennent soit du code objet, soit des appels en base pour lire ou écrire.
Marsh Posté le 20-12-2017 à 07:57:26
Tibar a écrit : Salut, |
de nos jours pour le routing on a tendance à utiliser des closures (introduite avec php 5.3), notion assez difficile à appréhender et que je pourrais difficilement t'expliquer étant donné que je ne la maitrise pas moi même (ca vient de javascript il me semble) ^^
http://www.thedarksideofthewebblog [...] re-en-php/
Et les bonnes pratiques encouragent à travailler la programmation modulaire grâce à composer et au suivi des standards PHP-FIG et ses recommandations (ex: PSR-4: pour loader ses classes), pour éviter de réinventer la roue.
Un autre lien utile:
https://www.grafikart.fr/formations/php
Marsh Posté le 07-12-2017 à 06:38:47
Bonjour,
Je débute en PHP, j'ai lu beaucoup de tutoriels, de messages sur des forums etc., mais je ne trouve pas de consensus...
Voici mes questions :
1) J'ai créé un fichier db_connect.php qui contient mon connecteur à la base de données, sous la forme :
J' "include" ce fichier à chaque fois que je vais exécuter une requête.
J'ai trouvé des développeurs qui utilisent plutôt une classe pour faire cette connexion. Quelle est la solution la plus répandue ?
2) Dans mes variables de session, je ne stocke que les identifiants plutôt que des objets entiers, je suis donc obligé de recréer mes données par un appel en bdd à chaque fois que j'ai besoin de données sur un objet.
Vaut-il mieux :
- tout mettre en variable de session ? (je trouve la syntaxe lourde)
- utiliser des variables globales ? (je n'aime pas trop a priori)
- utiliser une autre solution ?
3) J'en suis à mes débuts, du coup j'ai passé du temps sur la création d'une classe, et j'en suis là (dans un fichier User.php) :
J'ai ensuite lu qu'il valait mieux ne pas lier la classe et la requête SQL, en passant par un wrapper, mais je n'ai pas trouvé d'exemple concret.
Comment améliorer mon code pour qu'il soit fiable et souple ?
Merci,
Message édité par Tibar le 07-12-2017 à 06:39:57