PHP Liste déroulante + join

Par Jérémy Bernard, il y a 9 ans


Bonjour,

Plusieurs soucis :

Mon code :
https://pastebin.com/PyGYLzRH

Merci d'avance pour vos réponses

9 réponses

Mehdikacim, il y a 9 ans

Bonsoir, as-tu teamviewer pour que je susi regarder ça de plus prêt.

Carouge10, il y a 9 ans

Bonjour,

Il faut que tu revois comment on crée une liste déroulante en html car l'option n'a pas de "name" mais "value"
Ce qui te permettra de récupérer la valeur sélectionnée de cette liste par un $POST['cours']

Jérémy Bernard, il y a 9 ans

Merci de vos réponses.

J'ai modifié mon code :

Mon principal problème est de mettre id de la table utilisateurs dans le champs id_user de la table cours

<?php session_start(); ?> <?php if(isset($_POST['inscription'])) { if(empty($_POST['pseudo'])) { $errors ['pseudo'] = 'Veuillez indiquez votre pseudo'; } if(empty($errors)) { try { $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'root'); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } $liste_cours = $_POST['cours']; $req = $bdd->prepare('INSERT INTO cours (cours, id_user, date) VALUES(:cours, NOW())'); $req->execute(array( 'cours' => $liste_cours, 'id_user' => , )); echo 'Vous êtes inscrit au cours '; } else foreach($errors as $erreur) { $erreur; } } ?> <?php if(empty ($errors)) { $nomclass = "alert alert-dismissible alert-info"; $message = "Pas d'erreur"; } else { $nomclass = "alert alert-dismissible alert-danger"; $message = $erreur; } ?> <!-- Fin PHP --> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <link rel="stylesheet" href="style.css" /> <title>Inscription aux cours</title> </head> <body> <?php if(isset($_SESSION['pseudo'])){ ?> <h1>Inscription aux cours</h1> <form method="post" class="form-horizontal"> <fieldset> <div class="form-group"> <label class="col-lg-2 control-label">Pseudo</label> <div class="col-lg-10"> <input type="text" class="form-control" placeholder="Pseudo" name="pseudo" value="<?php echo $_SESSION['pseudo']; ?>"> </div> </div> <div class="form-group"> <label for="select" class="col-lg-2 control-label">Cours désirés</label> <div class="col-lg-10"> <select class="form-control" id="select" data-cip-id="cIPJQ342845642" name="cours"> <option value="entree">Préparez des entrées succulantes</option> <option value="plat">Préparez des plats de résistances divins</option> <option value="dessert">Préparez des desserts hors du commun</option> </select> </div> <div class="form-group"> <div class="col-lg-10 col-lg-offset-2"> <button type="submit" class="btn btn-primary" name="inscription">S'inscrire</button> </div> </div> </fieldset> </form> <div class="<?php echo $nomclass ?>"> <?php echo $message ?> </div> <?php } else {?> <p> Veuillez vous connecter en cliquant <a href='connexion.php'>ici</a>. <?php } ?> </body> </html>

Merci d'avance

Lartak, il y a 9 ans

Bonjour.
Tu as deux problèmes dans ton code.
Le premier est dans la requête SQL, soit :

$req = $bdd->prepare('INSERT INTO cours (cours, id_user, date) VALUES(:cours, NOW())');

Tu dis qu'il y a trois paramêtres qui seront insérés dans l'enregistrement mais tu ne définis que pour deux des paramêtres, soit, cours et date, mais tu ne définies pas id_user.
Ensuite dans la ligne suivante, soit :

$req->execute(array('cours' => $liste_cours, 'id_user' => ,));

Tu ne définis pas la valeur pour id_user.

Jérémy Bernard, il y a 9 ans

Je suis tout à fait d'accord, c'est bien pour ça que je viens vous demadner de l'aide. Je ne sais pas quoi mettre, car je veut mettre l'id de la table utilisateur dans la table cours.

Lartak, il y a 9 ans

Tu pourrais par exemple nous montrer le code correspondant à la connexion d'utilisateur pour que nous puissions voir comment tu initialises la session de l'utilisateur afin que nous puissions correctement t'aider.
Étant donné que d'après le message d'erreur destiné à l'utilisateur pour le pseudo, il est clair que celui qui remplit le formulaire est lié à l'utilisateur qui sera enregistré dans la table.
Par conséquent, je ne comprends pas pourquoi tu fais un input pour le pseudo dans le formulaire, alors que tu l'as dans la session, via $_SESSION['pseudo'].

Jérémy Bernard, il y a 9 ans

Voici mon code de connexion :

<?php session_start(); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <link rel="stylesheet" href="style.css" /> <title>Connexion</title> </head> <body> <!-- PHP --> <?php if(isset($_POST['connexion'])) { if(empty($_POST['pseudo'])) { $errors ['pseudo'] = "Veuillez remplir le champs pseudo ! "; } if (empty($_POST['password'])) { $errors ['password'] = "Veuillez indiquez votre mot de passe ! "; } if(empty($errors)) { try { $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'root'); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } $reponse = $bdd->prepare("SELECT password FROM utilisateurs WHERE pseudo= :pseudo "); $reponse->execute(array('pseudo' => $_POST['pseudo'])); $donnees = $reponse->fetch(); if(empty($donnees)){ $problemes ['pseudo'] = "Le pseudo n'est pas bon "; } if(password_verify($_POST['password'], $donnees['password'])) { $_SESSION['pseudo'] = $_POST['pseudo']; echo 'Vous êtes connecté' ; header ('location: inscriptions_cours.php'); } else { $problemes ['password'] = "Le mot de passe n'est pas correct"; } $reponse->closeCursor(); } else { foreach($errors as $erreur) { $erreur; } } if (isset($problemes)) { foreach ($problemes as $probleme) { $probleme; } } } ?> <?php if(empty ($errors)) { $nomclass = "alert alert-dismissible alert-info"; $message = "Pas d'erreur"; } else { $nomclass = "alert alert-dismissible alert-danger"; $message = $erreur; } ?> <!-- Fin PHP --> <h1>Connexion</h1> <form method="post" class="form-horizontal"> <fieldset> <div class="form-group"> <label class="col-lg-2 control-label">Pseudo</label> <div class="col-lg-10"> <input type="text" class="form-control" placeholder="Pseudo" name="pseudo" value="<?php if(isset($_POST['pseudo'])) { echo $_POST['pseudo'];} ?>" > </div> </div> <div class="form-group"> <label for="inputPassword" class="col-lg-2 control-label">Mot de passe</label> <div class="col-lg-10"> <input type="password" class="form-control" id="inputPassword" name="password" placeholder="Mot de passe" data-cip-id="inputPassword"> </div> </div> <div class="form-group"> <div class="col-lg-10 col-lg-offset-2"> <button type="submit" class="btn btn-primary" name="connexion">Connexion</button> </div> </div> </fieldset> </form> <p> Vous pouvez vous déconnecter en cliquant <a href= 'deconnexion.php'><button type="submit" class="btn btn-primary" name="déconnexion">Déconnexion</button></a> <div class="<?php echo $nomclass ?>"> <?php echo $message ?> </div> <?php if(isset($_SESSION['pseudo'])){ ?> <h1> Bienvenu dans votre espace personnel <?php if(isset($_POST['pseudo'])) { echo htmlspecialchars($_POST['pseudo']) ; }?></h1> <?php } ?> </body> </html>
Lartak, il y a 9 ans

Lors de la confirmation de la connexion, tu ne définis à aucun moment les données de l'utilisateur dans la session, donc au lieu de ne récupérer que password dans la table utilisateurs, récupéres toutes les données que tu pourrais avoir besoin plus tard, comme par exemple l'id, le pseudo, et son email, ça t'évitera de faires des requêtes SQL par la suite dans cette table, juste pour récupérer ces infos là, donc par exemple :

$reponse = $bdd->prepare("SELECT id, pseudo, email, password FROM utilisateurs WHERE pseudo = :pseudo"); $reponse->execute(array('pseudo' => $_POST['pseudo'])); $user = $reponse->fetch(); // suite du code ... if (password_verify($_POST['password'], $user['password'])) { unset($user['password']); $_SESSION['auth'] = $user; $_SESSION['flash'] = 'Vous êtes connecté'; header ('Location: inscriptions_cours.php'); die(); } // Suite du code ....

De cette maniière par exemple dans la page qui nous intéresse, tu as simplement à récupérer l'id dans la session, soit :

$req = $bdd->prepare('INSERT INTO cours (cours, id_user, date) VALUES(:cours, :id_user, NOW())'); $req->execute(array('cours' => $liste_cours, 'id_user' => $_SESSION['user']['id']));

Par contre, étant donné que tu ne veux pas que l'utilisateur puisse s'inscrire plusieurs fois à un même cours, tu devrais d'abord vérifier s'il n'existe pas déja un enregistrement pour l'utilisateur et le cours choisi avant de faire l'insertion en base de données.

Jérémy Bernard, il y a 9 ans

Bonjour,

Je mets le code avec lequel ça fonctionne à 90 %. J'ai toujours un problème : si un utilisateur s'inscire à un cours, aucun autre utilisateur ne peut s'inscire à ce cours. Évidemment, ce n'est pas ce que je souhaite. Je pense que je dois rajouter une condition lorsque je vérifie si le cours et déjà présent, comme id_user, mais je ne sais pas comment le mettre en place. Si vous avez des idées, je suis preneur. Merci d'avance.

<?php session_start(); include "database.php"; $database = new Database(); $bdd = $database->getdb(); ?> <?php if (isset($_POST['inscription'])) { if (empty($_POST['pseudo'])) { $errors['pseudo'] = 'Veuillez indiquez votre pseudo'; } $reponse = $bdd->query('SELECT id_user, cours FROM cours WHERE cours = "' . $_POST['cours'] . '" '); $cours = $reponse->fetch(); $reponse -> closeCursor(); if (strtolower($_POST['cours']) == strtolower($cours['cours']) ) { $errors['cours'] = "Vous êtes déjà inscrit à ce cours"; } if (empty($errors)) { $reponse = $bdd->prepare("SELECT id FROM utilisateurs WHERE pseudo= :pseudo "); $reponse->execute(array( 'pseudo' => $_POST['pseudo'] )); $donnees = $reponse->fetch(); $id = $donnees['id']; $liste_cours = $_POST['cours']; $req = $bdd->prepare('INSERT INTO cours (id_user, cours, date) VALUES(:id_user, :cours, NOW())'); $req->execute(array( 'cours' => $liste_cours, 'id_user' => $id )); echo 'Vous êtes inscrit au cours '; } else foreach ($errors as $erreur) { $erreur; } } else { $utilisateur = $bdd->prepare('SELECT * FROM utilisateurs INNER JOIN cours ON utilisateurs.id=cours.id_user WHERE utilisateurs.id= :id'); $utilisateur->execute(array( 'id' => $_SESSION['id_user'] )); $donnees = $utilisateur->fetchAll(PDO::FETCH_OBJ); foreach ($donnees as $donnee) { $listedescours = $donnee->cours; } } ?> <?php if (empty($errors)) { $nomclass = "alert alert-dismissible alert-info"; $message = "Pas d'erreur"; } else { $nomclass = "alert alert-dismissible alert-danger"; $message = $erreur; } ?> <!-- Fin PHP --> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <link rel="stylesheet" href="style.css" /> <title>Inscription aux cours</title> </head> <body> <?php if (isset($_SESSION['pseudo'])) { ?> <h1>Inscription aux cours</h1> <form method="post" class="form-horizontal"> <fieldset> <div class="form-group"> <label class="col-lg-2 control-label">Pseudo</label> <div class="col-lg-10"> <input type="text" class="form-control" placeholder="Pseudo" name="pseudo" value="<?php echo $_SESSION['pseudo']; ?>"> </div> </div> <div class="form-group"> <label for="select" class="col-lg-2 control-label">Cours désirés</label> <div class="col-lg-10"> <select class="form-control" id="select" data-cip-id="cIPJQ342845642" name="cours"> <option value="entree">Préparez des entrées succulantes</option> <option value="plat">Préparez des plats de résistances divins</option> <option value="dessert">Préparez des desserts hors du commun</option> </select> </div> <div class="form-group"> <div class="col-lg-10 col-lg-offset-2"> <button type="submit" class="btn btn-primary" name="inscription">S'inscrire</button> </div> </div> </div> </fieldset> </form> <p> Vous pouvez vous déconnecter en cliquant <a href= 'deconnexion.php'><button type="submit" class="btn btn-primary" name="déconnexion">Déconnexion</button></a> <div class="<?php echo $nomclass;?>"> <?php echo $message; ?> </div> <?php if (isset($donnee)) { ?> <div class="alert alert-dismissible alert-success"> <p>Vous êtes inscrit au cours : <?php foreach ($donnees as $donnee) { $liste_cours = $donnee->cours; echo "<li>$liste_cours </li>"; } ?></p> </div> <?php } else {?> <div class="alert alert-dismissible alert-success"> <p>Vous n'êtes inscrit à aucun cours. </p> <?php } ?> <?php } else { ?> <p> Veuillez vous connecter en cliquant <a href='connexion.php'>ici</a>.</p></div> <?php } ?> </body> </html>