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 :

POO & BDD


Sujet :

Langage PHP

  1. #1
    Membre expert Avatar de Kearz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 856
    Points : 3 659
    Points
    3 659
    Par défaut POO & BDD
    Bon, je savais pas où poster mais comme mon problème actuel est en PHP, je pense que c'est le bonne endroit.

    J'ai un problème avec le concept de POO et BDD en PHP.

    Je m'explique, je comprends très bien le concept de POO, j'en fais beaucoup en JAVA. Cependant quand je fais ça je n'ai pas vraiment besoin de BDD. (Sauf à la limite pour stocker des résultats, des scores. En gros pour stocker une fois que l'application à "fini de tourner")
    De même, la notion de BDD pour stocker des données pour un site web, je comprends bien. Ça permet de sauvegarder, de vérifier, etc. (Bref, pas vraiment de problème en PHP4)

    Maintenant, le mélange des deux est un peu obscur. Je suis en train de créer deux sites, le premier étant un jeux (multijoueur).
    Pour faire simple, les joueurs auront leurs personnages et pourront faire divers actions. Le problème c'est que si je stocke le joueur en POO, exemple la vie du joueur, si le joueur perds de la vie (variable $_vie) les autres joueurs ne le verront pas...Et pire en encore, si je change des variables et que le joueur quitte, les données seront perdu.
    Mais si je stocke dans la BDD, j'ai du mal a voir l'intérêt d'utiliser la POO. Je stocke les données et puis c'est tout. (J'vois pas trop l’intérêt à par peut-être pour utiliser des méthodes? Après les méthodes il me suffit de les dispatcher dans divers fichier .php et basta)

    Donc la question qui se pose c'est: Quand stocker les données dans la BDD. Quand les stocker dans des variables POO.

    La seule solution que je vois pour utiliser la puissance (enfin, l'organisation plus propre, les méthodes, etc.) de la POO et une BDD, serait qu'à chaque modification j'actualise les deux: l'objet et la BDD.

    Hum..Bref, j'ai loupé un concept? Ou il faut vraiment faire comme ça?
    J'ai l'impression de passer à côté d'un truc gros comme une montagne. :/

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Citation Envoyé par Kearz Voir le message
    La seule solution que je vois pour utiliser la puissance (enfin, l'organisation plus propre, les méthodes, etc.) de la POO et une BDD, serait qu'à chaque modification j'actualise les deux: l'objet et la BDD.
    Tu ne rate rien c'est bien le cas.

    Dans ton cas tu vas avoir une table Joueur qui aura différentes colonnes. Très souvent à chaque table est associé une classe php.

    Donc tu aura une classe Joueur avec comme attributs les différents champs de ta table.

    On peut imaginer une méthode statique get() qui te permettra d'obtenir une instance de Joueur depuis la bdd et une methode (non statique cette fois) save() qui te permettra de mettre à jour la base.

    En JAVA la problématique aurait été identique. Tu aurais eu une classe Joueurs , sauf qu'au lieu d'une bdd tu aurais sans doute eu une communication vers ton serveur de jeu qui aurait propager les mise à jour à tous les clients.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier Avatar de Alcide_
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Points : 114
    Points
    114
    Par défaut
    T'es explications sont assez obscures... et je penses que tu rates certaines étapes.
    Je crois que certains concepts objet et surtout PHP te manquent vu le discours confus que tu as :

    des variables POO
    si je stocke le joueur en POO
    si je stocke dans la BDD, j'ai du mal a voir l'intérêt d'utiliser la POO
    j'actualise les deux: l'objet et la BDD
    si je change des variables et que le joueur quitte, les données seront perdu
    Faire du Java ne veut pas forcement dire maîtriser la POO.

    Alors, PHP c'est quoi... Un langage de scripts interprété par un serveur web à chaque requête HTTP.
    Donc il n'existe pas (je simplifie) de contexte d'exécution persistant en mémoire vive comme en JAVA, une requête http va déclencher l'exécution complète de ton appli ou de ton script php, du début à la fin.
    Après que le serveur web ai renvoyé une page html (ou autre) au navigateur, ton contexte d'exécution disparaît et on recommence à 0 à la prochaine requête. Tous tes objets ont une durée de vie au maximum égale au temps d’exécution de la requête (quelques secondes max ).
    Pour faire persister des objets ou, plus globalement, des données entre chaque exécution, plusieurs mécanismes existent, comme la session, le cache ou la BDD.

    Alors, la BDD, c'est quoi... c'est comme je viens de le dire, le moyen le plus courant pour stocker des données. Donc, en PHP, si tu dois enregistrer des données de l'utilisateur (et surtout pour un jeux en ligne) tu dois forcément sauvegarder les données en bdd après chaque action (requete http) de l'utilisateur.

    Alors le principe de base en php, que ce soit en POO ou en procédural, est le suivant :
    • j'initialise mon contexte (configuration, test de la connexion, etc)
    • je regarde la demande utilisateur
    • je récupère les données souhaitées (en BDD ou autre)
    • je modifie ou traite (si besoins) les données
    • j'enregistre (si besoins) les données modifiées
    • je formate (si besoins) les données
    • je renvoi une réponse (html ou autre) à l’utilisateur


    Maintenant, dans cette liste, où se situ réellement ton problème?
    Que l'on puisse t'aider plus facilement sur l'aspect "POO" et sur l'aspect "persistance".

  4. #4
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    l'exposé initial est biaisé par le pt de vue du développeur. Une app php passe 99% du temps au repos, l’exécution est instantanée (ou presque), apres l'execution on détruit tous les objets. Donc on a toujours besoin de la base de données pour faire la persistance des données... pour les 99% du temps restant.
    C'est vrai que la bd n'est pas le seul moyen de faire persister les données, il y a aussi la sérialisation. Mais sur une appli multijoueur, une bd toute faite c'est plus sur/performant qu'un fichier plat et 3 scripts maisons. c'est un avis.

    Notons qu'une session peut être configurée pour s'appuyer sur une vraie BD au lieu d'un systeme de fichiers plats. J'y vois quelques avantages dans le cas d'un jeu multijoueur.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  5. #5
    Membre expert Avatar de Kearz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 856
    Points : 3 659
    Points
    3 659
    Par défaut
    D'abord merci pour les réponses.

    Je dirais que le problème se situe plutôt la:
    je récupère les données souhaitées
    j'enregistre (si besoins) les données modifiées
    Prenons un exemple simple pour voir si j'ai -un peu- mieux compris:
    Un joueur décide de frapper un monstre. Il clic, change de page, exemple frappeMonstre.php.
    Cette page est donc un objet qui prend un joueur et un monstre. Au chargement de la page je vais donc avec la clé primaire du joueur et du monstre initialiser les variables de l’objet frappeMonstre. Si le joueur attaque, je vais donc prendre en compte une méthode du joueur (ex: attaque()) et faire perdre des point de vie au monstre.
    Une fois fait, je dois save les données par une méthode qui va mettre a jour la BDD.
    L'action a été faite, la page se réactualise. Donc je perds mes objets et qui vont se réinitialisé. (puisqu'on retombe sur frappeMonstre.php)


    L'idée est donc je chopper les données aux bons moments et de la sauvegarder aux bons moment, sachant que les objets ne sont pas persistant du tout?


    PS: Je pense que les concepts qui me manque sont plus dans l'association des concepts justement. (Quand on apprend a faire du JAVA pour faire de la POO sans BDD, puis faire du PHP(4) pour apprendre faire des applications pour avec SQL, etc. On associe jamais rien et voilà le résultat. La joie des cours différents qui ne s’entremêlent jamais.)

  6. #6
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 386
    Points : 3 531
    Points
    3 531
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Pour le web il y à plusieurs style de jeux et le développement n'est pas du tout le même suivant le cas.

    - Jeu solo type flash game : le joueur ouvre la page, le jeu se charge en mémoire et on y joue comme si c'était sur ça machine, le jeu est remis à zéro à chaque rechargement.

    - Jeu multijoueur non persistent, ça reprends les base du jeu solo, avec un connexion entre les différents joueur connecté à ce moment là, techniquement je ne serais pas dire comment c'est géré, ça dois se faire à base de tunel qui reste ouvert sur la page pour avoir un rafraîchissement en temps réèl, c'est équivalent à un chat pour ainsi dire, mais nettement plus complexe.

    - Jeu multijoueur persistent (type mmorpg, text based) : On entre dans le cas ou le jeu garde toutes les données du monde (ou de l'univers) en mémoire, donc en base de données, les joueurs se connecte à un compte et peuvent y faire évoluer des villages, des planètes.. ce type de jeu se joue avec un navigateur standard, la page est statique un fois ouverte et les actions sont fait avec des boutons sur la page (type formulaire html). Ce type de jeu nécessite de simuler le temps réel avec des algorithmes temporel, le serveur n'est pas constamment en train de faire évoluer le monde, ça serais trop coûteux en terme de performance.

    - Jeu multijoueur persistent et temps réel (type wow) : Le plus complexe des jeux, il dois persister les données et faire un rendu temps réèl du monde, le joueur à besoin le plus souvent d'un programme client sur la machine en plus du serveur. Surement très complexe à réaliser.

    Donc, la question c'est qu'est ce que tu développe comme jeu ?
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  7. #7
    Membre expert Avatar de Kearz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 856
    Points : 3 659
    Points
    3 659
    Par défaut
    Je suis dans ce cas là:
    Jeu multijoueur persistent (type mmorpg, text based) : [...]
    Après je suis déjà fixé niveau technologie, etc: PHP + JS + BDD.
    C'est juste qu'il me faut assimilé le PHP5. (ça serait bête de partir sur du PHP4 même si le PHP4 j'en ai déjà fait et donc serait un peu plus simple )

  8. #8
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    Citation Envoyé par Kearz Voir le message
    monstre initialiser les variables de l’objet frappeMonstre. Si le joueur attaque, je vais donc prendre en compte une méthode du joueur (ex: attaque()) et faire perdre des point de vie au monstre.
    mauvaise idée, une page par action dans un jeu, ça fait bcccppppppppp de pagesssssssss.
    Citation Envoyé par Kearz Voir le message
    Une fois fait, je dois save les données par une méthode qui va mettre a jour la BDD.
    L'action a été faite, la page se réactualise.
    en théorie oui, mais si tu utilise de l'ajax et l'objet XMLHttpRequest (pas directement, via prototype/Jquery hein ! ) tu peux discuter avec ton serveur en tache de fond.
    Citation Envoyé par Kearz Voir le message

    Donc je perds mes objets et qui vont se réinitialisé. (puisqu'on retombe sur frappeMonstre.php)
    OUI. il te faut des sessions pour te simplifier la vie.
    Citation Envoyé par Kearz Voir le message
    L'idée est donc je chopper les données aux bons moments et de la sauvegarder aux bons moment, sachant que les objets ne sont pas persistant du tout?
    il te faut des sessions. Ton monstre, tu peux le précharger dans une session utilisateur ainsi que l'identité de ton joueur. Et son pseudo et sa place sur la carte. Ce qu'il faut éviter de faire c'est que cette mise en cache via les sessions ne soit pas une faille qui permette de tricher (donc réfléchir à l'ordre de chargement).
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  9. #9
    Membre régulier Avatar de Alcide_
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Points : 114
    Points
    114
    Par défaut
    Le projet est ambitieux, peut-être trop vu le manque de pratique que tu semble avoir dans les techno. web...
    Comme le dit très justement gene69, le fait d'avoir une page par action est juste impensable pour ce type d'application.

    Tes réflexes et ta terminologie Objet sont encore très balbutiant, tu parles de page comme d'un objet, qui de plus prend des paramètres :
    Cette page est donc un objet qui prend un joueur et un monstre
    L'appel à un script est une chose, les paramètres d'une requête en son une autre et les objets que tu manipules dans ton script, c'est encore différent.

    mes objets [...] qui vont se réinitialiser
    Non non non, rien ne se "réinitialise", les objets que tu obtiendras à la prochaine action (requête http) seront de nouvelles instances de tes classes.

    Bon, si on part de ton petit exemple de joueur et de monstre, ça pourrait donner un truc comme çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    <?php
    //[...]
    // ne pas oublier l'importance de la gestion des erreurs
    if (!isset($_SESSION['player_id']) || !isset($_POST['monster_id'])) {
        throw InvalidArgumentException("your error message");
    }
    //on récupère nos paramètres en session ou à partir de la requête (ici POST)
    $playerId = $_SESSION['player_id'];
    $monsterId = $_POST['monster_id'];
     
    /*
     * Construction et initialisation des objets que l'on veut manipuler via les ID.
     * L'id permettant de faire une requête en BDD, de récupérer les données brutes
     * en vu de peupler l'objet désiré.
     */
    $player = new Player($playerId);
    $monster = new Monster($monsterId);
     
     // Juste pour encore appuyer sur l'importance de la gestion des erreurs
    if (!$player || !$monster) {
        throw InvalidArgumentException("your error message");
    }
    /*
     * Ici ce serait l'objet player qui mettrait à jour 
     * ses données et celles du monstre pour un combat
     */
    $player->fight($monster);
     
    //Sauvegarde des données en BDD
    $player->save();
    $monster->save();
     
    //ensuite... plein d'autres trucs comme la gestion des exceptions,etc
    //envoi d'une réponse à l'utilsateur ?
    //redirection ?
    Cet exemple est plus que grossier (je serais le premier à le critiquer vivement!) mais il a le mérite d'être très simple et d'imager ton propos. Peut-être éclaircira t-il certains points.

    Je ne peux que t'encourager à te documenter sur la POO, les design-patterns et sur les différents frameworks web comme ZendFramework ou Symfony.
    Un framework pourrait t'amener un cadre d'apprentissage et de développement intéressant.

    Bon courage à toi !

  10. #10
    Membre expert Avatar de Kearz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 856
    Points : 3 659
    Points
    3 659
    Par défaut
    Merci, j'crois que j'ai compris avec ton exemple.

    Oui, enfin c'est pas non plus super ambitieux. C'est vraiment histoire de s’entraîner parce que les technos webs à la fac on voit rien c'est du very light.

    Si j'me foire le projet j'aurais surement appris des trucs en route. C'est le plus important.

    Pour ce qui est framework j'y ai pensé mais pour un autre projet. Si je me met a faire de l'apprentissage de partout sur le même projet ça risque de capoter.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.4] POO et BDD, comment utiliser un manager dans un objet métier ?
    Par comode dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2014, 12h51
  2. [PHP 5.3] POO : Connexion BDD
    Par gwendoline-bricout dans le forum Langage
    Réponses: 7
    Dernier message: 05/02/2014, 21h31
  3. POO, BDD, ArrayList et fichier .txt
    Par nicaud dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 27/04/2011, 06h48
  4. Apport de la POO aux BDD
    Par Just-Soft dans le forum Langage
    Réponses: 13
    Dernier message: 27/08/2008, 07h35
  5. [POO] Objet et gestion de BDD
    Par hush dans le forum Langage
    Réponses: 9
    Dernier message: 16/06/2007, 11h12

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