Bonjour,

Plusieurs soucis :

- J'ai un formulaire avec une liste déroulante, mais je n'arrive pas à insérer mon choix dans la BDD.

- Je souhaite récupérer l'id d'une table utilisateurs et la mettre dans la table cours, pour savoir qui a réservé tel cours ( pour ne pas qu'un utilisateur s'inscrive plusieurs fois à un même cours)
 <?php 
session_start(); ?>


<?php 

if(isset($_POST['inscription'])) 
{
    if(empty($_POST['pseudo']) OR  empty ($_POST['password'])) {
        $errors ['identifiants'] = 'Veuillez remplir tous les champs';
    }
    
    if(empty($errors)) {
        $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'root', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
            
          $reponse = $bdd->prepare("SELECT password FROM utilisateurs WHERE pseudo= [langue]seudo  ");
		  $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']; 
                $choix = $_POST['cours'];
                $req = $bdd->prepare('INSERT INTO cours (id, id_users, cours)  SELECT  id FROM utilisateurs WHERE id');
							$req->execute(array(
								'cours' => $choix,
								));
        echo 'Vous êtes inscrit'; 
            }
            else 
            {
               $problemes ['password'] = "Le mot de passe n'est pas correct";    
            }
            $reponse->closeCursor();
    }
}


?>
<!-- Fin PHP -->

<!DOCTYPE html>
<html>

<head>

    <meta charset="utf-8" />
    <link rel="stylesheet" href="style.css" />

    <title>Inscription aux cours</title>
</head>

<body>
    <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 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">
                <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 name="entree">Préparez des entrées succulantes</option>
                        <option name="plat">Préparez des plats de résistances divins</option>
                        <option name="dessert">Préparez des desserts hors du commun</option>
                    </select>
                </div>
            </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>

    </body>
</html>
 


Merci d'avance pour vos réponses et vos remarques
Bonjour,

Pour moi, il y déjà une erreur ici :

$req = $bdd->prepare('INSERT INTO cours (id, id_users, cours)  SELECT  id FROM utilisateurs WHERE id');


si tu fais un insert en SQL ça crée une nouvelle ligne dans la table de BDD.
Donc là, je suis pas sûr que tu utilise la bonne requête.

si tu veux faire un insert, alors il faut que fasse ceci si ta table cours n'a bien que 3 champs:
$req = $bdd->prepare('INSERT INTO cours VALUES (id, id_users, cours) ');


Oubli de VALUES dans ma proposition Smiley sweatdrop (Merci Zelena)
Modifié par gandalfblanc (27 Apr 2017 - 12:25)
Zelena a écrit :
Bonjour.

Il n'y a plus besoin de VALUES maintenant quand on fait un INSERT INTO ?

Smiley confus


si , j'ai fait une erreur. Smiley sweatdrop
Je corrige mon précédent post
Modifié par gandalfblanc (27 Apr 2017 - 12:23)
Merci pour vos réponse, mais malheureusement ça ne fonctionne pas, je n'ai plus de message d'erreur, mais je n'ai rien dans ma table cours.

 <?php 
session_start(); ?>


<?php 

if(isset($_POST['inscription'])) 
{
    if(empty($_POST['pseudo']) OR  empty ($_POST['password'])) {
        $errors ['identifiants'] = 'Veuillez remplir tous les champs';
    }
    
    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= [langue]seudo  ");
		  $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']; 
                $req = $bdd->prepare('INSERT INTO cours VALUES (id, id_users, cours) ');
							$req->execute(array(
                                'id_users' => $id_users,  
								'cours' => $_POST['cours'],
								));
        echo 'Vous êtes inscrit'; 
            }
            else 
            {
               $problemes ['password'] = "Le mot de passe n'est pas correct";    
            }
            $reponse->closeCursor();
    }
}


?>
<!-- Fin PHP -->

<!DOCTYPE html>
<html>

<head>

    <meta charset="utf-8" />
    <link rel="stylesheet" href="style.css" />

    <title>Inscription aux cours</title>
</head>

<body>
    <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 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">
                <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 name="entree">Préparez des entrées succulantes</option>
                        <option name="plat">Préparez des plats de résistances divins</option>
                        <option name="dessert">Préparez des desserts hors du commun</option>
                    </select>
                </div>
            </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>

    </body>
</html>
 


Merci d'avance
Bonjour,
Pour une requête préparée, les paramètres doivent être précédés de deux-points. En admettant que id est auto-incrémenté, et que la table ne contient que ces 3 colonnes :
$req = $bdd->prepare('INSERT INTO cours VALUES (:id, :id_users, :cours) ');
$req->execute(array(
    'id' => null,
    'id_users' => $id_users,  
    'cours' => $_POST['cours']));

ou, en définissant les colonnes :
$req = $bdd->prepare('INSERT INTO cours (id_users,cours) VALUES (:id_users, :cours) ');
$req->execute(array(
    'id_users' => $id_users,  
    'cours' => $_POST['cours']));


En passant, je n'ai pas vu la déclaration de $id_users...
Merci,

Id_users est l'id dans la table utilisateur je dois faire une jointure entre les deux tables ( la table utilisateurs et la table cours.) Mais je ne sais pas comment faire d,'où ma sollicitation

D'avance merci
C'est bien ce qu'il me semblait. Il faut revoir un peu votre méthode d'authentification. Normalement, on ne sélectionne jamais le mot de passe, on s'en sert juste dans le critère de sélection. Ensuite, il faut sélectionner l'id utilisateur lors de cette requête.

$reponse=$bdd->prepare("select id,pseudo from utilisateurs where pseudo= : pseudo and password= : password"); // (1) (2)
$reponse->execute(array('pseudo' => $_POST['pseudo'], 'password' => $_POST['password'])); // (3)
$donnees = $reponse->fetch();
if(empty($donnees)){
  // mauvais login ou mdp
}
else{
  // faire ici l'insertion, en remplaçant $id_user par $donnees['id']
}

(1) remplacer 'id' par le champ identifiant de la table 'utilisateurs'
(2) j'ai ajouté des espaces entre les ":" pour éviter l'interprétation des smileys par le forum, il faut évidemment les coller au nom du paramètre.
(3) je me doute que le mot de passe n'est pas stocké en clair dans la base, mais vous avez une fonction de comparaison (password_verify). Il faudrait faire une fonction de hashage et l'appeler à ce moment-là : 'password' => hashPassword($_POST['password'])
Modifié par Seven tears (27 Apr 2017 - 15:34)
Salut,

@Seven tears password_verify est une fonction native de php (>=5.5.0) cela inclus que le mot passe en base est issue de la fonction password_hash

donc il ne faut pas passer le mot de passe en paramètre de la requête SQL (c'est envisageable si l'encodage est réalisé dans la base ou avec des fonctions de chiffrement du SGBD).


$reponse=$bdd->prepare('select id,pseudo, password from utilisateurs where pseudo= : pseudo'); 
$reponse->execute(['pseudo' => $_POST['pseudo']]);
$donnees = $reponse->fetch();
if($donnees !== null && password_verify($_POST['password'], $donnees['password'])){
// authentification ok
}else {
// soit l'utilisation n'existe pas soit le mot de passe n'est pas bon => message d'erreur
}
$reponse->closeCursor();// important


autre chose : le tag html option n'a pas d'attribut name, ce qui est souhaité ici, je pense, c'est value, qui permet de fournir un valeur différente de ce qui est affiché : <option value="toto">la description de toto</option>
Si l'option n'a pas de value ce qui est envoyé au serveur est le contenu du tag (donc ce qu'il y a entre <option ....> et </option>)

Pour ce qui est de l'insertion dans la table cours il faut simplifier la chose. Le code présenté indique que les cours sont mis en dur dans le html or s'ils étaient affichés depuis la base de données cela pourrait éviter les doublons et surtout d'avoir une valeur qui ne correspond pas à ce qui est listé au départ Smiley cligne (1ere forme normale d'une base de données).
Cela permet de mettre la clef primaire de la table des cours en "value" des options et la table cours devient une table à deux colonnes id_utilisateur et id_cours. Ces deux colonnes forment la clef primaire de la table (si une personne ne peux s'inscrire qu'une seule fois à un cours, sinon une colonne auto incrément en clef primaire).
Cela permet aussi d'avoir une gestion simple des cours sans devoir toucher au code Smiley cligne

pour les jointures SQL : http://sqlpro.developpez.com/cours/sqlaz/jointures/

@+
Modifié par moogliBZH (27 Apr 2017 - 15:52)
Juste au sujet de ton affectation d'un utilisateur à un cours:
As-tu une base qui ressemble à cela?

table: users
id_user clé primaire Auto Indenté
pseudo clé unique
password
etc...

table: cours
id_cours clé primaire Auto Indenté
description
etc...

table cours_users
id_cours_users primaire Auto Indenté
id_cours clé étrangère
id_user clé étrangère
+ index unique (id_cours, id_user)

Les associations entre les cours et les utilisateurs se font dans la table cours_users
avec un insert comme ci-dessous (il y a d'autres syntaxes possible...):

$req = $bdd->prepare('INSERT INTO cours_users (id_cours, id_user) VALUES (?, ?) ');
$req->execute(array($id_users, $_POST['id_cours']));

L'index unique (id_cours, id_user)) sur la table cours_users empêche toute création de doublon (un utilisateur plusieurs fois sur le même cours).

Tu peux rajouter "IGNORE" dans ta requête ce qui t'évitera de gérer les tentatives d'inscription d'un même utilisateur plusieurs fois sur le même cours: l'insertion ne se fera pas mais tu n'auras pas de code erreur de renvoyé! Si tu veux gérer l'erreur et signaler à l'utilisateur qu'il est déjà inscrit tu dois soit vérifier préalablement avec un select sur la table si l'utilisateur est déjà inscrit, soit supprimer le IGNORE dans la requête et contrôler le code retour de l'insertion (duplicate value)....


$req = $bdd->prepare('INSERT IGNORE INTO cours_users (id_cours, id_user) VALUES (?, ?) ');
$req->execute(array($id_users, $_POST['id_cours']));


Bonne continuation
Modifié par GJboba (28 Apr 2017 - 15:57)
Ma base de donnée ressemble à ça :

Table utilisateurs :
id (clé primaire et auto incrémentée)
pseudo
nom
email
password

Table cours :
id (clé primaire et auto incrémentée)
id_user (l'id de la table utilisateur)
cours
date

Je ne sais pas comment insérer m'ID de la table utilisateur dans le champs id_user de la table cours.

Mon nouveau code :

 <?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' => $_SESSION['id'],
								));
        
        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 !
Bonjour,
Je n'avais pas tout lu lors de ma dernière réponse, mais depuis moogliBZH et GJboba t'ont donné les bonnes informations pour compléter et corriger le code :
1) ta liste déroulante de cours doit être générée depuis ta base de données. Les éléments option doivent avoir un attribut value correspondant à l'ID de la table cours (le contenu étant quant à lui le libellé du cours)
2) il te faut.une troisième table pour gérer les inscriptions, avec l'ID utilisateur et l'ID du cours. L'ID utilisateur est récupéré lors de l'authentification (cf mon code corrigé par moogliBZH), l'ID du cours est récupéré dans le tableau $_POST. En gros, GJboba t'a tout donné pour finaliser ça (quoique j'aurais mis une clef primaire sur le couple (id_user,id_cours) pour garantir l'unicité).
Oui je n'ai pas mis de clé primaire sur le couple id_cour + id_user mais un index unique ce qui contrôle aussi l'unicité, c'est parce que j'ai pris l'habitude de mettre une clé auto indenté sur toute mes tables même les tables d'association. L'avantage sur les grosses requêtes bien compliquées c'est d'avoir des joins aux syntaxes plus courte et plus simple avec des clés primaires sur un seul champ! et je suis d'accord ce n'était pas utile dans ce cas.
Bonne soirée