Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3030 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Constructeur, base de données et session

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Constructeur, base de données et session

n°2308439
Tibar
Posté le 07-12-2017 à 06:38:47  profilanswer
 

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 :  

Code :
  1. $mysql_db_host = constant('DB_HOST');
  2. $mysql_db_user = constant('DB_USER');
  3. $mysql_db_pass = constant('DB_PASS');
  4. $mysql_db_name = constant('DB_NAME');
  5. $mysql_db_port = constant('DB_PORT');
  6. mysqli_report(MYSQLI_REPORT_STRICT);
  7. try {
  8.     $mysql_db_conn = new mysqli($mysql_db_host, $mysql_db_user, $mysql_db_pass, $mysql_db_name, $mysql_db_port);
  9.     //echo nl2br("\nConnection to database success" );
  10. } catch (Exception $e)
  11. {
  12.     echo nl2br("\nImpossible de se connecter à la base de données" );
  13.     if ($mysql_db_host = "localhost" )
  14.     {
  15.         echo " : " . $e->getMessage();
  16.     }
  17. }


 
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) :  
 

Code :
  1. class User
  2. {
  3.     private $user_id;
  4.     private $email;
  5.     private $first_name;
  6.     private $last_name;
  7.     private $is_member;
  8.     private $birthday;
  9.     public function __construct()
  10.     {}
  11.     public function __get($property)
  12.     {
  13.         if (property_exists($this, $property)) {
  14.             return $this->$property;
  15.         }
  16.     }
  17.     public function getUserDatas($user_id)
  18.     {
  19.         include 'MySQL/db_connect.php';
  20.         $sql = "SELECT USER_ID, EMAIL, FIRST_NAME, LAST_NAME, IS_MEMBER, BIRTHDAY " . "FROM USER " . "WHERE USER_ID = '$user_id'";
  21.         try {
  22.             $sql_result = mysqli_query($mysql_db_conn, $sql);
  23.             $data = mysqli_fetch_assoc($sql_result);
  24.            
  25.             $this->user_id = $data["USER_ID"];
  26.             $this->email = $data["EMAIL"];
  27.             $this->first_name = $data["FIRST_NAME"];
  28.             $this->last_name = $data["LAST_NAME"];
  29.             $this->is_member = $data["IS_MEMBER"];
  30.             $this->birthday = $data["BIRTHDAY"];
  31.         } catch (Exception $e) {
  32.             echo ("Erreur : " . $e);
  33.         }
  34.     }
  35. }


 
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
mood
Publicité
Posté le 07-12-2017 à 06:38:47  profilanswer
 

n°2308459
pluj
Posté le 07-12-2017 à 14:06:40  profilanswer
 

Tu as quand un même un "style" de codage particulier :

  • pourquoi écrire $mysql_db_host = constant('DB_HOST'); + $mysql_db_host au lieu de DB_HOST directement ?
  • " . "FROM USER " . " : autant tout coller ensemble directement dans une même chaîne au lieu de "quitter" la chaîne pour faire une concaténation, non ?
  • if ($mysql_db_host = "localhost" ) : ce n'est pas == qu'on devrait trouver par hasard ?
  • il y a potentiellement une injection SQL via $user_id


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.


Message édité par pluj le 07-12-2017 à 16:26:07
n°2308461
rufo
Pas me confondre avec Lycos!
Posté le 07-12-2017 à 14:47:33  profilanswer
 

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.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2308463
Tibar
Posté le 07-12-2017 à 15:24:23  profilanswer
 

Citation :

Tu as quand un même un "style" de codage particulier :

  • pourquoi écrire $mysql_db_host = constant('DB_HOST'); + $mysql_db_host au lieu de DB_HOST directement ?
  • " . "FROM USER " . " : autant tout coller ensemble directement dans une même chaîne au lieu de "quitter" la chaîne pour faire une concaténation, non ?
  • if ($mysql_db_host = "localhost" ) : ce n'est pas == qu'on devrait trouver par hasard ?
  • il y a potentiellement une injection SQL via $user_id


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 :


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.


 
Ok, c'est bien ce qu'il me semblait, je vais rapidement me retrouver avec beaucoup de connexions sur ma base.
 

Citation :


Certaines informations n'ont rien à faire en session (à commencer par le mot de passe, qu'il soit haché ou non). 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.


 
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'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.


 
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 !
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.


 
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 :


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.


 
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,
 
 
 
 
 

n°2308467
rufo
Pas me confondre avec Lycos!
Posté le 07-12-2017 à 16:16:02  profilanswer
 

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).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2308474
Tibar
Posté le 07-12-2017 à 17:20:28  profilanswer
 

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...
 
 
 

n°2308477
Tibar
Posté le 07-12-2017 à 18:54:15  profilanswer
 

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...

n°2308485
rufo
Pas me confondre avec Lycos!
Posté le 07-12-2017 à 20:31:44  profilanswer
 

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).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2308486
Tibar
Posté le 07-12-2017 à 20:44:10  profilanswer
 

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 ?

Message cité 1 fois
Message édité par Tibar le 07-12-2017 à 20:45:36
n°2308490
rufo
Pas me confondre avec Lycos!
Posté le 07-12-2017 à 22:33:01  profilanswer
 

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.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
mood
Publicité
Posté le 07-12-2017 à 22:33:01  profilanswer
 

n°2308498
Tibar
Posté le 08-12-2017 à 02:43:38  profilanswer
 

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.

n°2308502
rufo
Pas me confondre avec Lycos!
Posté le 08-12-2017 à 09:53:03  profilanswer
 

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 !


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2308520
Tibar
Posté le 08-12-2017 à 11:15:59  profilanswer
 

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).

n°2308522
rufo
Pas me confondre avec Lycos!
Posté le 08-12-2017 à 11:34:15  profilanswer
 

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 :)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2309160
tompouss
Petit chat
Posté le 19-12-2017 à 19:16:29  profilanswer
 

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.
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 ?


 
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


Message édité par tompouss le 19-12-2017 à 19:25:06

---------------
collectionneur de pâtes thermiques
n°2309162
Tibar
Posté le 19-12-2017 à 19:52:15  profilanswer
 

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.

n°2309176
tompouss
Petit chat
Posté le 20-12-2017 à 07:57:26  profilanswer
 

Tibar a écrit :

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.


 
 
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


Message édité par tompouss le 20-12-2017 à 08:04:31

---------------
collectionneur de pâtes thermiques

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Constructeur, base de données et session

 

Sujets relatifs
Probleme performance et structure de donnees avec MongoDBDonnées dans tableau après un fetchAll()
Editeur de base de données Remplacer le contenu d'une colonne dans ma base de donnée SQL
Importer base de données 1&1Connexion à la base impossible sur 1 PC
Connexion base access MDETransferer des données d’une table vers une autre table via checkbox
Plus de sujets relatifs à : Constructeur, base de données et session


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR