[RESOLU] Sélectionner la bonne catégorie dans un POST

Eléphanteau du PHP | 11 Messages

01 oct. 2021, 08:58

Bonjour,

Alors voilà, pour m'entrainer à PHP j'ai voulu créer un forum et je me suis retrouvé bloqué ...

Je n'arrive pas à poster mes topics dans la bonne catégorie, et pire que ça, je n'arrive même pas à afficher les catégories que j'ai créées dans un fonction <select> avec une recherche sql ...


Je vous partage mon code, je ne trouve pas de solution depuis quelques temps déjà ...
Je supprime le code au fur et à mesure pour rendre le sujet plus visible[/PHP]
Modifié en dernier par Noobiephp le 01 oct. 2021, 12:20, modifié 1 fois.

Mammouth du PHP | 2703 Messages

01 oct. 2021, 09:10

quel est le code html généré par ce code ?
<select class="form-select" aria-label="Default select example">
<option selected>Sélectionnez la catégorie</option>
<option value="1"><?= $topic_category ?></option>
</select>

Eléphanteau du PHP | 11 Messages

01 oct. 2021, 09:16

quel est le code html généré par ce code ?
<select class="form-select" aria-label="Default select example">
<option selected>Sélectionnez la catégorie</option>
<option value="1"><?= $topic_category ?></option>
</select>
"Warning : Underfined variable $topic_category in C####### /forum/publish-topic.php on line 38"

j'ai essayé une requête SQL comme ça
$bdd->query('SELECT * FROM categories');
et toujours pareil ...

Mammouth du PHP | 2703 Messages

01 oct. 2021, 09:32

vous avez auparavant réussi à afficher le contenu d'une requête select ?

Eléphanteau du PHP | 11 Messages

01 oct. 2021, 10:19

Non ...

Mammouth du PHP | 2703 Messages

01 oct. 2021, 10:26

et le support que vous utilisez pour apprendre n'évoque pas cet aspect ?

Eléphanteau du PHP | 11 Messages

01 oct. 2021, 10:35

Malheureusement non... En fait le support était minime à la base et j'ai développé le reste du forum moi même en utilisant ce que je connaissais. Là je suis bloqué parce que je n'ai aucun "précédent" qui me permet de voir comment récuperer les données ...

Ma base de données est articulée comme ça :

ANSWERS (id, id_auteur, pseudo_auteur, id_topic, contenu)
CATEGORIES (id, category_name, category_description)
TOPICS (id, titre, contenu, id_auteur, pseudo_auteur, image_auteur, date_publication)
USERS (id, pseudo, email, signature, mdp, image)

l'idée serait d'insérer un topic dans la bonne catégorie ...

J'ai essayé ça mais ça ne fonctionne toujours pas. Je ne suis vraiment pas sûr de ce que je fais et je cherche des réponses par ci par là mais c'est un peu compliqué
Modifié en dernier par Noobiephp le 01 oct. 2021, 12:21, modifié 2 fois.

Mammouth du PHP | 2703 Messages

01 oct. 2021, 10:38


Eléphanteau du PHP | 11 Messages

01 oct. 2021, 10:41

merci je connaissais pas ...

Eléphanteau du PHP | 11 Messages

01 oct. 2021, 11:05

J'ai essayé de cette façon et ça ne fonctionne toujours pas je deviens fou ...
Modifié en dernier par Noobiephp le 01 oct. 2021, 12:21, modifié 1 fois.

Mammouth du PHP | 2703 Messages

01 oct. 2021, 11:14

il faut faire les choses dans l'ordre.
1. afficher le contenu de la liste déroulante correctement pour permettre à l'utilisateur de faire sa sélection
2. récupérer le contenu de cette liste en php, pas besoin de requête sql select (sauf pour vérifier que l'id passé par le formulaire existe bien)

Eléphanteau du PHP | 11 Messages

01 oct. 2021, 11:31

le code html pour afficher la liste déroulante des catégories me semble correct mais le message d'erreur me dit qu'elle ne l'est pas... Les fichiers sont bien inclus, la fonction est définie dans le code PHP mais j'ai toujours le même message d'erreur ...
Warning: Undefined variable $topic_categories in C:\xampp\htdocs\Forum\publish-topic.php on line 38
Avec juste la commande fetch elles devraient toutes être affichées normalement ?

Eléphanteau du PHP | 11 Messages

01 oct. 2021, 11:53

Ok j'ai finalement réussi à afficher les catégories T_T

J'ai utilisé
$topic_categories = $bdd->query('SELECT id, category_name, category_description FROM categories ORDER BY id DESC LIMIT 0,5');
        <?php while ($category = $topic_categories->fetch()) { ?>
 <!-- Sélelectionner la catégorie -->
            <div class="card-header bg-dark text-white mb-4">
                <select class="form-select" aria-label="Default select example">
                    <option selected>Sélectionnez votre catégorie</option>
                    <option value="?"><?= $category['category_name']; ?></option>
                </select>
            </div>
            <?php } ?>
Problème désormais : je n'arrive pas à afficher les catégories dans un menu déroulé normal...

Je ne trouve également pas comment valider le formulaire et rentrer les topics dans la bonne catégorie. J'ai un message d'erreur qui s'affiche quand je valide le formulaire (j'ai inséré les bonnes variables $topic_catégorie dans mon publishActions.php, enfin je crois...)
<?php
 
require('actions/database.php');
 
$topic_categories = $bdd->query('SELECT id, category_name, category_description FROM categories ORDER BY id DESC LIMIT 0,5');
 
 
//Valider le formulaire
if(isset($_POST['validate'])){
 
 
    //Vérifier si les champs ne sont pas vides
    if(!empty($_POST['title']) AND !empty($_POST['content'])){
         
 
        //Les données du topic
        $topic_category = $topic_categories['id'];
        $topic_title = htmlspecialchars($_POST['title']);
        $topic_content = nl2br(htmlspecialchars($_POST['content']));
        $topic_date = date('d/m/Y H:i:s' );
        $topic_id_author = $_SESSION['id'];
        $topic_pseudo_author = $_SESSION['pseudo'];
        $topic_image_author = $_SESSION['image'];
  
        //Insérer le topic sur topics
        $insertTopicOnWebsite = $bdd->prepare('INSERT INTO topics(catégorie, titre, contenu, id_auteur, pseudo_auteur, image_auteur, date_publication)VALUES(?, ?, ?, ?, ?, ?, ?)');
        $insertTopicOnWebsite->execute(
            array(
                $topic_category,
                $topic_title, 
                $topic_content,
                $topic_id_author,
                $topic_pseudo_author,
                $topic_image_author,
                $topic_date,
            )
        );
         
        $successMsg = "Votre topic a bien été publié sur le site";
         
    }else{
        $errorMsg = "Veuillez compléter tous les champs...";
    }
 
}
La liste n'est pas déroulante, ça me crée juste 3 fois la même chose
<?php
require('actions/users/securityAction.php');
require('actions/topics/publishTopicAction.php');
?>
<!DOCTYPE html>
<html lang="en">
<link rel="stylesheet" href="assets/style.css">
<?php include 'includes/head.php'; ?>
 
<body>
    <?php include 'includes/navbar.php'; ?>
 
    <br><br>
 
    <form class="container" method="POST">
 
        <?php
        if (isset($errorMsg)) {
            echo '<p class="alert alert-danger" role="alert">' . $errorMsg . '</p>';
        } elseif (isset($successMsg)) {
            echo '<p class="alert alert-success" role="alert">' . $successMsg . '</p>';
        }
        ?>
 
        <div class="alert alert-danger" role="alert">
            <div class="card-body">
                <span>Soyez libres de poster tout ce que vous voulez, mais assurez vous de respecter nos conditions.</span>
            </div>
        </div>
 
        <div class="card bg-dark text-white mb-4 mb-4">
        <?php while ($category = $topic_categories->fetch()) { ?>
            <!-- Sélelectionner la catégorie -->
            <div class="card-header bg-dark text-white mb-4">
                <select class="form-select" aria-label="Default select example">
                    <option selected>Sélectionnez votre catégorie</option>
                    <option value="?"><?= $category['category_name']; ?></option>
                </select>
            </div>
            <?php } ?>
            <!-- Choisir un titre -->
            <div class="card-header bg-dark text-white mb-4">
                <input type="text" class="form-control" name="title" placeholder="Titre de votre topic">
            </div>
             
            <!-- Ecrire le contenu -->
            <div class="card">
                <div class="card-body">
                    <textarea type="text" class="form-control" name="content" placeholder="Contenu de votre topic"></textarea>
                </div>
            </div>
             
        </div>
 
        <!-- Valider -->
 
        <button type="submit" class="btn btn-primary" name="validate">Publier</button>
        <a href="index.php" class="btn btn-secondary">Retour</a>
    </form>
 
</body>
 
</html>

Mammouth du PHP | 2703 Messages

01 oct. 2021, 19:47

La liste n'est pas déroulante, ça me crée juste 3 fois la même chose
quel est le code html auquel il faut que l'exécution du php aboutisse ?
en gros, il faut commencer par coder en dur la liste déroulante, et quand cela fonctionnera, le faire en php.

Eléphanteau du PHP | 11 Messages

02 oct. 2021, 11:17

J'ai trouvé la solution !!!

Code : Tout sélectionner

<!-- Sélelectionner la catégorie --> <div class="card-header bg-dark text-white mb-4"> <select class="form-select" name="category"> <option selected>Choisissez votre catégorie</option> <option value=" <?php foreach($bdd->query('SELECT * FROM categories ORDER BY id ASC') as $row) { if($row['id'] == $topic_categories) echo '<option selected="selected" value="'. $row['id'] . '">' . $row['nom_categorie'] . '</option>'; else echo '<option value="'. $row['id'] . '">' . $row['nom_categorie'] . '</option>'; } ?>" </option> </select> </div>