Inscription en BDD

PHP

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous !
J’aimerai faire un site sur un jeux mobile qui s’appelle CaféLand.

Le projet serait de faire un site avec une connexion (ID, MDP) afin de sauvegarder les avancées de chaque joueur (il y a t-il un autre moyen? :D )
Ce site comprendrai une seule page.
J’explique le but de mon site et ce que j’aimerai faire. Si vous avez d’autres idées plus simples je suis preneur. ^^

Dans ce jeu, il y a des "célébrités" qui ont des plats favoris mais tant qu’on les a pas découvert, ils restent masqués.

Mon idée est de faire une base de données avec :

  • 1 table user
  • 1 table célébrité
  • 1 table pour chaque catégorie de nourriture Afficher tous les plats.

Dans le jeu, les joueurs mettent les plats a disposition des "célébrités" afin de trouver leur plats préférentiels. Mon but serait pour chaque "célébrités" afficher tous les plats. Et les plats qui ne font pas partis de leur plats favoris, j’aimerai que l’on puisse cliquer sur l’image afin de se rappeler que ce plat là ne fait pas parti des favoris. Ma problématique est : Comment enregistrer dans la BDD s’ils font partis des plats favoris et inversement? J’avais pensé a faire un bouton check, mais comment l’enregistrer dans la BDD?

Voilà mon petit projet. Si vous avez d’autres idées je suis preneur.

Merci d’avance

Salut,

Ton problème peut se résumer aux deux questions suivantes :

  • Quels plats aime une célébrité ?
  • Quelles célébrités aiment un plat ?

Tu as donc affaire à ce que l’on appelle une relation de type many-to-many, c’est-à-dire que chaque plat est lié à une ou plusieurs célébrités, et qu’une célébrité est liée également à un ou plusieurs plats.

Pour résoudre cette contrainte, il te faudra donc ajouter une table supplémentaire qui te permettra de stocker cette information en utilisant les ID que tu possèdes déjà. :)

+0 -0

Note que selon le framework que tu utilises, tu n’as pas forcément besoin de créer toi-même cette table. C’est le cas de Django, qui dans une relation many-to-many gère lui-même la table intermédiaire.

Edit : désolé, je sais pas comment j’ai envoyé sans terminer ma phrase.

+1 -0

Note que selon le framework que tu utilises, tu n’as pas forcément besoin de créer toi-même cette table. C’est le cas de Django, qui dans une relation many-to-many gère lui-m

Moté

Effectivement, tu fais bien de le préciser. La remarque est vraie également avec Doctrine en PHP, qui met à disposition l’annotation ManyToMany pour cela.

+0 -0

Waouh !! Merci pour toutes vos infos !

  • Il y a 40 célébrités
  • Il y a 8 catégories de plats
  • Il y a 250 plats

La question que je me pose pour structurer la BDD est :

  • une table user
  • Une table catégorie de plats
  • Une table par célébrités (donc 40 tables)
  • Une tables par plats de chaque célébrité

ou

  • une table user
  • Une table catégorie de plats
  • Une table célébrités
  • Une table plats

A noter que la table catégorie est la juste pour faire "joli" :)
Les célébrités peuvent aimer 1,2 ou 3 plats par niveau. Dès que la célébrité passe au niveau supérieur, les plats changent. Il faut donc réinitialiser les plats pour chaque célébrité qui change de niveau.

Pour répondre à Deuchnord
Je ne comprends pas ce que je dois mettre dans la nouvelle table o_O

Pour les autres personnes qui m’ont répondu, j’ai vraiment des bases moyennes donc j’aimerai faire au plus simple.

Pensez-vous qu’il est possible que j’utilise SQLite3 pour tout ça? quel hébergement devrais-je prendre pour mettre le site en ligne? et enfin, quel est le chemin d’accès des images, sachant quelles seront en ligne dans le répertoire img afin de les inscrire dans la BDD?

Merci encore pour tout

SQLite n’est pas adapté au déploiement en production de sites webs, de manière générale.

Quelle techno utilises-tu ? C’est ça la vraie question.

Le mieux serait que tu te fasses un schéma de tes relations entre tes tables. Également, renseigne-toi sur le fonctionnement des relations one-to-many / many-to-one / many-to-many, et globalement le fonctionnement des clefs etrangères dans une base de données.

+0 -0

Merci Motė !
Je regarde ça demain !
J’utilise Vs code et je pensais le faire avec SQLite. J’utiliserai SQL qui sera plus adapté. Pour le schéma j’étais parti sur la 2e option que j’ai écrit plus haut (4 tables au total) mais je bloque sur le fait qu’il y ait plusieurs célébrités qui peuvent avoir le même plat. En gros les 250 plats sont présentés au 40 célébrités. Même avec des clés étrangères je vois pas comment faire.
Après je suis pas fermé à l’idée de ne pas le faire avec une bdd. Même si c’est plus chiant si tu as une autre méthode je suis preneur (csv, json). Le plus important est que chaque user peut continuer sa progression donc sauvegarder les données.

Merci encore

+0 -0

SQlite, CSV et JSON ont le même désavantage pour une utilisation en production : ce sont des fichiers, c’est donc lent à traiter et facilement corrompu.

Une base de donnée sera indispensable si tu veux en faire un vrai site. Tu peux commencer par tester MariaDB si tu veux démarrer par un truc relativement simple (pour info c’est un fork de MySQL, tu trouveras donc beaucoup de documentation commune).

Pour répondre à Deuchnord
Je ne comprends pas ce que je dois mettre dans la nouvelle table o_O

VeGeTa

Il s’agit d’une table intermédiaire qui te permettra de mettre en relation deux données venant de deux tables différentes, donc tu peux y mettre tout ce que qui concerne à cette relation, au minimum les IDs des lignes à mettre en relation.

Voici un schéma qui devrait mieux te permettre de voir où je veux en venir (ici, pour un système d’articles rédigés par plusieurs membres d’un site, comme celui que l’on peut voir sur Zeste de Savoir) :

Représentation de la base de données : une table `MemberArticle` met en relation `Member` à `Article` par leur ID. Elle porte également des informations supplémentaires, comme le rôle du membre vis-à-vis de l'article.
Représentation de la base de données : une table `MemberArticle` met en relation `Member` à `Article` par leur ID. Elle porte également des informations supplémentaires, comme le rôle du membre vis-à-vis de l’article.

Les points verts représentent les clés primaires, les traits liant MemberArticle à Member et Article sont des contraintes de clé étrangère (FOREIGN KEY), ce sont elles qui te permettront de dire à ton système de base de données qu’il existe une contrainte forte entre ces tables, et donc de sécuriser tes données (et par conséquent ton appli).

+1 -0

Merci Motė Et Deutchnord.
J’ai compris ce que vous vouliez m’expliquer sur vos premiers message.
Voilà comment j’ai pensé mes tables:. Table1 : users Table2 : celebrities Table3 : dishes Table4 : dishes_found

Dishes_found aura en clé étrangère l’id celebrities et l’id dishes.

Ai-je bien suivi :D ?

En ce qui concerne la techno Motė juste PHP sans framework car il j’aurai pas besoin de lancer énormément de requêtes.

+0 -0

Bonjour à tous !
Petite question !

Les seuls mouvements que je fais dans la BDD lorsque l’utilisateur clique sur enregistrer c’est de mettre à jour la colonne "dish_found" dans la table "dishes_found".
Je dois mettre en valeur par exemple 0 pour "pas testé, 1 pour "oui" et 2 pour non?
Enfin dans cette fameuse table, je dois rajouter ces colonnes la non?
c’est pas bon je commence a me perdre :ninja:

Merci viki. En fait le concept est de faire venir les célébrités. Tu as des repose plat bien-sûr tu en as pas assez pour tous les plats. J’ai donc fait 3 bouton radio
A la question est ce le bon plat ?

  • oui
  • non
  • je sais pas

Afin d’enregistrer ça dans la bdd je mets une valeur dans "value" par exemple 0 - 1 - 2. Je peux mettre n’importe quoi. Je veux que quand l’utilisateur se reconnecte ça affiche les bouton radios qu’il a coché la fois d’avant.

J’espère t’avoir bien expliqué :)

Ok viki merci je vais regarder ça.
J’ai un autre souci… Comment est ce possible que sur mes 3 boutons radio je peux faire 2 choix alors que j’en veux qu’un ? Enfin je met "checked" sur tous les boutons radio "ne sais pas". Voilà pour la parti code HTML Pour le côté PHP, je fais un foreach pour afficher tous les plats. Serait ce plus judicieux de faire un submit pour chaque plat ou pour chaque catégorie de plats?

Bonjour à tous !

Je suis vraiment désolé de vous embeter encore avec ça, mais je me perds petit à petit. Voici ma page pour chaque célébrité. ( je dois faire 40 pages car 40 célébrités)
Je pense qu’il y a un moyen plus facile et de tout faire en 1 page. Mais chaque chose en son temps.

<?php
require 'inc/request.php';
?>                        
<section class="find-dishes">
    <aside>
        <img src="<?=$dir_img_celebrities.$mademoiselle->celebrity_root.$ext_img?>" alt="<?= $mademoiselle->celebrity_name?>">
        <img class="favorite-dishes1" src="<?=$dir_img_celebrities.$mademoiselle->favorite_dish1.$ext_img?>" alt="Plat Favori" >
        <img class="favorite-dishes2" src="<?=$dir_img_celebrities.$mademoiselle->favorite_dish2.$ext_img?>" alt="Plat Favori" >
        <img class="favorite-dishes3" src="<?=$dir_img_celebrities.$mademoiselle->favorite_dish3.$ext_img?>" alt="Plat Favori" >
        <input type="text" name="level" title = "Niveau" placeholder="A quel niveau est <?php echo $mademoiselle->celebrity_name?>">
    </aside>
    <form class="list-dishes" method="POST" action="">

    <article>
    <h2>Liste des entrées</h2>
        <?php foreach ($list_entrees as $entree):?>
                <div class="dishes">
                    <form method="POST" action="">
                    <h3><?php echo $entree->dish_name ?></h3>
                    <img src="<?php echo $dir_img_dishes.$list_category[0]->category_name.'/'.$entree->dish_root.$ext_img?>" alt="<?php echo $entree->dish_name?>" >
                    <div class="form-check">
                        <input class="form-check-input" type="radio" name="choix"  value= 'oui'>Oui
                        <label class="form-check-label" for=""></label>
                        <input class="form-check-input" type="radio"  name="choix" value= 'non'>Non
                        <label class="form-check-label" for=""></label>
                        <input class="form-check-input" type="radio" name="choix" value='ne_sais_pas' checked>Je ne sais pas
                        <label class="form-check-label" for=""></label>
                        <div class="col-12 submit">
                            <button class="btn btn-primary" type="submit">Enregistrer</button>
                        </div>
                    </div>
                    </form>    
                </div>
                <?php if (!empty($_POST)){
                var_dump($_POST['choix']);
                $req = $pdo->prepare('INSERT INTO dishes_found SET  choix = ? , dish_name = ? , dish_id = ?, celebrity_id = ?');
                $req->execute([$choix, $entree->dish_name, $entree->id_dish, $mademoiselle->id_celebrity]);
                $_SESSION['flash']['success'] = "L'enregistrement a bien été pris en compte";
                header('Location: mademoiselle.php');
                exit();
            } else {
                $errors['choix'] = "l'enregistrement n'a pas pu etre pris en compte";            
            };
            ?>
                <?php endforeach; ?>


        </form>    
    </article>
</section>

<?php require 'inc/footer.php';?>

et voici ma page request :

<?php
require 'inc/functions.php';
require 'inc/db.php';
logged_only();
require 'inc/header.php'; 
?>                        

<?php

//Données diverses
$dir_img_celebrities = 'img/celebrites/';
$dir_img_dishes = 'img/dishes/';
$ext_img = '.jpg';
$ext_page = '.php';

if(isset($_POST['choix'])){
    $choix = $_POST['choix'];
}
//Recherche liste des célébrités
$query = $pdo->query('SELECT * FROM cafeland_celebrities');
if($query === false){
    var_dump($pdo->errorInfo());
    die('Erreur SQL');
}
$list_celebrities = $query->fetchAll(PDO::FETCH_OBJ);
//var_dump($list_celebrities);

//Recherche données Mademoiselle[0]
$query = $pdo->query('SELECT * FROM cafeland_celebrities WHERE id_celebrity=1');
if($query === false){
    var_dump($pdo->errorInfo());
    die('Erreur SQL');
}
$mademoiselle = $query->fetch(PDO::FETCH_OBJ);
//var_dump($mademoiselle);




//Recherche liste des plats
$query = $pdo->query('SELECT * FROM cafeland_dishes');
if($query === false){
    var_dump($pdo->errorInfo());
    die('Erreur SQL');
}                     
$list_dishes = $query->fetchAll(PDO::FETCH_OBJ);
//var_dump($list_dishes);

//Recherche liste des catégories
$query = $pdo->query('SELECT * FROM cafeland_category');
if($query === false){
    var_dump($pdo->errorInfo());
    die('Erreur SQL');
}                     
$list_category = $query->fetchAll(PDO::FETCH_OBJ);
//var_dump($list_category);



//Recherche liste des entrées
$query = $pdo->query('SELECT * FROM cafeland_dishes WHERE category_id=1');
if($query === false){
    var_dump($pdo->errorInfo());
    die('Erreur SQL');
}                     
$list_entrees = $query->fetchAll(PDO::FETCH_OBJ);
//var_dump($list_entrees);


```
Je n'arrive pas à enregistrer le plat que je veux. Il me prend automatiquement le 1er.
Auriez-vous une idée?

Merci par avance
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte