Inscription en BDD

PHP

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

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

Pour ton problème de sélection multiple je vois un espace après value avant le signe égal, ça créée donc un attribut value vide pour oui et non.

Il y a quoi sur cette fameuse ligne 38 ?

À l’enregistrement aussi il va falloir boucler sur les plats. Il faut donc donner un name différent pour chaque groupe de réponses (un groupe par plat). Tu peux utiliser un attribut du genre name="choix[{$plat->id}]" pour les différencier.

Au passage tu utilises la fonction header() au milieu d’une page : tu ne peux envoyer d’entêtes qu’avant d’avoir envoyé du contenu (les entêtes sont envoyés en un seul bloc au client, avant le contenu, pour qu’il puisse s’adapter à ces infos envoyées par le serveur).

Salut Viki53 !
Merci pour ta réponse ! Au bout de la nuit, j’ai réussi à régler le problème et j’ai fait comme tu as dit
Voici mon code :

<?php
require 'inc/request.php';
require 'inc/header.php'; 

$id_mademoiselle = '1';

?>                        
<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" >
    </aside>
    <article>
    <h2>Liste des entrées</h2>
    <form class="list-dishes" method="POST" action="">

        <?php foreach ($list_entrees as $entree):?>
            <div id="<?php echo $entree->id_dish ?> "class="dishes">
                <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" name="<?php echo $entree->dish_name?>" type="radio"  value= 'oui' <?php if (isset($entree->choix)=='oui'){ echo 'checked = "checked"';}?>>Oui
                    <label class="form-check-label" for=""></label>
                    <input class="form-check-input" name="<?php echo $entree->dish_name?>" type="radio"   value= 'non' <?php if (isset($entree->choix)=='non'){ echo 'checked = "checked"';}?>>Non
                    <label class="form-check-label" for=""></label>
                    <input class="form-check-input" name="<?php echo $entree->dish_name?>" type="radio"  value='ne_sais_pas' <?php if (isset($entree->choix)=='ne_sais_pas'){ echo 'checked = "checked"';}?>>Je ne sais pas
                    <label class="form-check-label" for=""></label>
                </div>
            <?php var_dump($entree->id_dish);?>
            </div>
        <?php endforeach; ?>
        <div class="col-12 submit">
            <button class="btn btn-primary" type="submit" name="<?php echo $entree->id_dish ?>">Enregistrer</button>
        </div>
    </form>    
 
        <?php if (!empty($_POST)){
            $req = $pdo->prepare('INSERT INTO dishes_found SET  choix = ? ,  dish_id = ?, celebrity_id = ?');
            foreach ($_POST['choix'] as $key=>$value){
                var_dump($key);
            $req->execute(array($value,  $key , $id_mademoiselle));
            };
            $_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";  
          
    };

    ?>

</article>
</section>





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

Le problème est que les enregistrements se font correctement, mais sur la page redirigée il met une erreur : Notice: Undefined index: choix in 41
Ce qui est logique et que je comprends vu qu’aucune données sont dans $_POST.

Cela doit venir de ma condition mais je ne vois pas comment je dois écrire cette condition

Problème résolu j’ai mis une page dans "action" du formulaire afin que les requêtes soient effectuées sur une page externe.

Maintenant comment afficher les boutons radios cochés correspondant au valeurs inscrites dans ma bdd?

Voici mon code :

        <?php foreach ($list_entrees as $entree):?>
            <div id="<?php echo $entree->id_dish ?> "class="dishes">
                <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" name="<?php echo $entree->dish_name?>" type="radio"  value= 'oui' <?php if (isset($entree->choix)=='oui'){ echo 'checked = "checked"';}?>>Oui
                    <label class="form-check-label" for=""></label>
                    <input class="form-check-input" name="<?php echo $entree->dish_name?>" type="radio"   value= 'non' <?php if (isset($entree->choix)=='non'){ echo 'checked = "checked"';}?>>Non
                    <label class="form-check-label" for=""></label>
                    <input class="form-check-input" name="<?php echo $entree->dish_name?>" type="radio"  value='ne_sais_pas' <?php if (isset($entree->choix)=='ne_sais_pas'){ echo 'checked = "checked"';}?>>Je ne sais pas
                    <label class="form-check-label" for=""></label>
                </div>

            <?php var_dump($entree->id_dish);?>
            </div>
        <?php endforeach; ?>

Par défaut, dans ma BDD, la valeur est "ne_sais_pas"

+0 -0

Encore une fois (cf. tes echo 'checked = "checked"'; et autres value= 'oui') : on ne met pas d’espaces autour du signe égal (=) d’un attribut HTML.

Les espaces servant à séparer les attributs, tu risques des comportements imprévisibles…

Pense à regarder le HTML généré (dans ton navigateur : clic droit > Code source de la page) pour t’assurer que tout est comme tu le souhaites.

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