Cases à cocher + enregistrement clés étrangères

Résolu/Fermé
Mira - 4 mai 2020 à 12:11
 Mira - 11 mai 2020 à 14:57
Bonjour,

Je travail sur un projet ou je souhaite mettre en ligne des vidéos, des articles et des solutions.
Il y'a un onglet vidéo, un onglet article et un onglet solution.
L'onglet solutions regroupent une sélection d'articles et de vidéos en fonction d'un thème.

Pour le sql, il y'a une table article (vidéo et solution trié par type).
Un table thème.
Et une table solutions avec pour clés étrangères id_article et id_theme.

Grâce à un précédent post, j'ai réussie à faire apparaitre les solutions grâce à un LEFT JOIN.

Maintenant je continue le projet avec le backoffice.
Je voudrais pourvoir sélectionner plusieurs articles pour lui assigner 1 même thème.

J'ai un formulaire html avec des cases à cocher.
Je souhaiterai faire un enregistrement des cases à cocher mais de manière séparé.
Un case à coché : un ID

De plus je voudrai j'ai du mal à visualiser comment enregistrer tout ça dans ma table solutions qui contient des clés étrangères.

Pourriez-vous m'aider svp ?

Merci pour votre aide :)

voici le code :

<!doctype html>
<html lang="fr">
<?php
require_once(__DIR__ . '/config/database.php');
// themes
$theme = $pdo->query("SELECT * FROM `theme`");
$rows_theme = $theme->fetchAll(PDO::FETCH_ASSOC);

// article
$article = $pdo->query("SELECT * FROM `article`");
$rows_article = $article->fetchAll(PDO::FETCH_ASSOC);


// btn
if (isset($_POST['btn_nouveau_theme'])) {
    $sql_nouveau_theme = "INSERT INTO theme(theme) VALUE (?)";
    $nouveau_commentaire = $pdo->prepare($sql_nouveau_theme)->execute([$_POST['nouveau_theme']]);
    header("location:interface_solutions_formulaire_nouveau.php");
} elseif (isset($_POST['theme'])) {
    # Save-button was clicked
}
?>

<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="css/styles_interface.css">

    <title>HPE</title>
</head>

<body>
    <nav aria-label="breadcrumb">
        <ol class="breadcrumb">
            <li class="breadcrumb-item"><a href="interface_entree.php">Acceuil</a></li>
            <li class="breadcrumb-item"><a href="interface_solutions.php">Solutions</a></li>
            <li class="breadcrumb-item active">Nouvelle solution</li>
        </ol>
    </nav>


    <div class="container">
        <h1> Solutions </h1>

        <form action="" method="post">
            <div class="row container_nouveau">
                <div class="col-sm-12">
                    <h2 class="h2_nouveau">Nouveau thème</h2>
                    <div class="form-group">
                        <input name="nouveau_theme" type="text" class="form-control" id="nouveau_theme" placeholder="Entrer votre nouveau thème">
                    </div>
                    <button name="btn_nouveau_theme" type="submit" class="btn btn-primary btn_nouveau">Nouveau thème</button>
                </div>
            </div>
        </form>


        <form action="" method="post">
            <h2>Sélectionner votre thème</h2>
            <div class="marge_theme">
                <?php foreach ($rows_theme as $row_theme) { ?>
                    <div class="form-check">
                        <input class="form-check-input" type="radio" name="exampleRadios" id="theme<?= $row_theme["id"] ?>" value="option2">
                        <label class="form-check-label label_theme" for="theme<?= $row_theme["id"] ?>">
                            <?= $row_theme["theme"] ?>
                        </label>
                    </div>
                <?php } ?>
            </div>

            <h2 class="h2_articles_theme">Articles à ajouter à solutions</h2>

            <div class="marge_theme">
                <?php foreach ($rows_article as $row_article) { ?>
                    <div class="form-check">
                        <input class="form-check-input" type="checkbox" value="" id="defaultCheck1">
                        <label class="label_theme" for="defaultCheck1">
                            <?= $row_article["titre"] ?> (<?= $row_article["type"] ?>)
                        </label>
                    </div>
                <?php } ?>
            </div>
        </form>
        <button name="theme" type="submit" class="btn btn-primary">Nouveau thème</button>
    </div>

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>



</body>

</html>
A voir également:

7 réponses

yg_be Messages postés 22726 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 476
4 mai 2020 à 12:53
bonjour, tu n'as pas expliqué les relations entre solutions, articles et thèmes.
ni décrit la structure de tes tables.
0
Bonjour,

Voici le complément d'informations.

Il y'a un onglet article. Un onglet vidéo et un onglet solution.
Parmi les articles et vidéos présents dans les 2 premiers onglets, solution permet d'en sélectionner quelques un et de les regrouper par thème.

articles :
- id > int
- titre > text
- chapeau > text
- url_image > varchar
- type > varchar (si vidéo ou article)
- url_article > varchar
- en ligne > int

theme
- id
- theme > varchar

article_theme
- id
- article_id
- theme_id
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
4 mai 2020 à 14:01
Bonjour,

Déjà, il te faut, soit un name différent pour chaque input, soit utiliser un name de type array
par exemple
<?php foreach ($rows_theme as $row_theme) { ?>
                    <div class="form-check">
                        <input class="form-check-input" type="radio" name="exampleRadios[<?= $row_theme["id"] ?>]" id="theme<?= $row_theme["id"] ?>" value="option2">
                        <label class="form-check-label label_theme" for="theme<?= $row_theme["id"] ?>">
                            <?= $row_theme["theme"] ?>
                        </label>
                    </div>
                <?php } ?>


Si tu coches des cases et que tu fais un print_r($_POST) tu verras comment se présentent les réponses.

0
Merci pour ta réponse.

Je viens de mettre les name :

<div class="marge_theme">
                <?php foreach ($rows_article as $row_article) { ?>
                    <div class="form-check">
                        <input class="form-check-input" type="checkbox" name="article<?= $row_theme["id"] ?>" value="" id="article<?= $row_theme["id"] ?>">
                        <label class="label_theme" for="article<?= $row_theme["id"] ?>">
                            <?= $row_article["titre"] ?> (<?= $row_article["type"] ?>)
                        </label>
                    </div>
                <?php } ?>
            </div>


Je voulais savoir quel était la différence entre value et label?
La value apparait dans la base de donnée ?

Le print_r($_POST) m'affiche : Array ( ) 1
J'ai vue dans un autre post qu'il fallait faire un foreach sur le $_POST mais comment enregistrer ligne par ligne dans la base de donnée ?

Merci pour ton aide
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
4 mai 2020 à 19:33

Je viens de mettre les name :


Pour ton besoin.. tu aurais mieux fait de laisser le name tel que je l'avais mis....(en mettant article à la place de exempe..;)
<input class="form-check-input" type="radio" name="article[<?= $row_theme["id"] ?>]" id="theme<?= $row_theme["id"] ?>" value="<?= $row_theme["id"] ?>">


De cette façon, lorsque tu vas cocher des cases puis "submit" ton formulaire, tu verras que le $_POST contiendra un array de toutes les cases cochées.
De là, il te faudra, en effet, faire une boucle dessus (via un foreach par exemple) pour les traiter.

$articles = !empty($_POST['article']) ? $_POST['article'] : NULL;

if(!empty($articles)) {
  foreach($articles  as $key => $value ){
    // ici le traitement....
    // par exemple
     echo $key . " : "  . $value . "<br>";
  }
}



Je t'invite au passage à lire et à appliquer les conseils donnés ici :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour,

Je voulais dans un premier tant remercier le formum et toi, Jordan45 pour le temps accordé.
J'avais déjà posé quelques questions et on m'a bien aidé.

Je viens de faire ta solution et je dois dire que cela avance.
Je récupère bien mes valeur des cases à cocher de manière séparé.

Maintenant, sauriez-vous svp, comment faire pour les enregistrer individuellement dans ma base de donnée ?

Je veux enregistrer chaque article séparément. Ils auront qu'un seul thème grâce au bouton radio.

En attendant voici ce que j'ai fais grâce à vous

1- définir le thème grâce aux boutons radios

a- je stocke ma valeur dans un tableau

<input class="form-check-input" type="radio" name="theme[<?= $row_theme["id"]?>]" id="theme<?= $row_theme["id"] ?>" value="<?= $row_theme["id"] ?>">
                        <label class="form-check-label label_theme" for="theme[<?= $row_theme["id"]?>]">
                            <?= $row_theme["theme"] ?>
                        </label>


b- je récupère mon tableau grâce à un foreach

$theme = !empty($_POST['theme']) ? $_POST['theme'] : NULL;
            if(!empty($theme)) {
                foreach($theme  as $keyTheme => $valueTheme ){
                   echo $keyTheme . " : "  . $valueTheme ;
                }
              }


2- sélectionner les cases à cocher

a- je stocke ma valeur dans un tableau

<input class="form-check-input" type="checkbox" name="article[<?= $row_article["id"]?>]" value="<?= $row_article["id"]?>">
                        <label class="label_theme" for="article[<?= $row_article["id"]?>]?>">
                            <?= $row_article["titre"] ?> (<?= $row_article["type"] ?>)
                        </label>


b- je récupère mon tableau grâce à un foreach

$article = !empty($_POST['article']) ? $_POST['article'] : NULL;
            if(!empty($article)) {
                foreach($article  as $keyArticle => $valueArticle ){
                  // ici le traitement....
                  // par exemple
                   echo $keyArticle . " : "  . $valueArticle . "<br>";
                }
              }
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
11 mai 2020 à 10:43
Comme tu peux le lire dans le code que je t'ai donné
// ici le traitement....
 // par exemple

Hors... à par le echo que je t'avais mis ( comme exemple....) je ne vois rien d'autre....
Qu'as tu essayé ??

En plus, que signifie exactement :
enregistrer individuellement dans ma base de donnée

Enregistrer QUOI ? dans quelle(s) table(s) ?

Il serait intéressant (et même utile..) que tu nous montres un exemple concret de ce que contient ton $_POST et que tu nous précises ( via ces données d'exemple) quoi doit aller où....
0
Merci pour ta réponse.

Je vais essayé d'être plus clair.

Prenons un exemple de chaussures

Il va y avoir un onglet articles sur des chaussures en vrac :
- baskets
- chaussures de villes
- chaussures de randonnées

Il va y avoir un onglet vidéo en vrac avec des exemple de chaussures

Pour les deux onglets j'ai fait une table article
- id
- titre
- chapeau
- url image
- type (article ou vidéo)
- url article
- en ligne

Et il va y avoir un onglet solutions qui va regrouper les chaussures par thématique.
Ex : chaussures de randonnée débutant avec une sélection des articles et des vidéos présents dans les deux premiers onglets.

J'ai fait une table thème
- id
- theme

Puis une table article_theme avec des clés étrangères
- id
-article_id
-theme_id

article_theme va me permettre de gérer les solutions par thématiques.
Je li mon thème à mes articles (vidéo ou articles) déjà créés.

J'essaye en ce moment de créer une nouvelle solution.
Les boutons radios permettent de sélectionner le thème existant dans la base de donnée.
Les cases à cocher permettre de sélectionner mes articles présents dans la base de donnée.

Je souhaite donc lier le thème et les articles.

Ce que j'entend par enregistrer ligne par ligne dans ma base de donnée c'est que je veux qu'il y'ai qu'un enregistrement à la fois. 1bouton radio avec 1 case à cocher dans la table article_theme. J'ai fait des cases à cocher car c'est plus rapi

J'ai enlevé
// ici le traitement....
// par exemple


car je ne savais pas quoi mettre à part mes requêtes sql.

Je ne sais pas si je suis plus clair :)
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
11 mai 2020 à 11:40
Il faudrait surtout que tu répondes aux questions qu'on te pose
par exemple

Il serait intéressant (et même utile..) que tu nous montres un exemple concret de ce que contient ton $_POST et que tu nous précises ( via ces données d'exemple) quoi doit aller où....

En gros.. tu coches tes cases ... puis tu valides ( bien entendu, tu auras ajouté un print_r($_POST); dans ton code )
Ainsi, tu auras le contenu de ta variable affiché sur ta page.
(contenu que tu nous partageras ici sur le forum).

ne savais pas quoi mettre à part mes requêtes sql.

Ben oui.. c'est bien ça.
Il faut y mettre tes requêtes SQL.
Donc.. qu'as tu essayé ? Qu'est-ce qui ne marche pas ?
0
Merci pour ton aide,

J'avais juste un peu peur de mettre mes requêtes dans un foreach, je sais c'est bête.
Voici ce que j'ai mis et cela fonctionne. Je vais mettre comme résolu après ça.

Merci pour votre aide.

if ($_POST['btn_theme']) {
    $article = !empty($_POST['article']) ? $_POST['article'] : NULL;
    if(!empty($article)) {
        foreach($article  as $keyArticle => $valueArticle ){
            // ici le traitement....
            // par exemple
            
            $sql_nouvelle_solution = "INSERT INTO article_theme (article_id, theme_id) VALUE (?,?)";
            $nouvelle_solution = $pdo->prepare($sql_nouvelle_solution)->execute([$valueArticle,$_POST['theme']]);
        
        
        }
    }
}
0