[RESOLU] Problème insertion donnée dans bdd

Eléphanteau du PHP | 24 Messages

18 oct. 2016, 11:55

Bonjour, j'ai suivi le tuto "Formulaire d'inscription - tutoriel PHP France" mais je ne comprend pas pourquoi j'ai ce message d'erreur Problème dans la requête d'insertion Donc pour le moment, un message d'erreur et toujours aucune valeur dans la bdd.

je l'ai modifié pour mes besoins, j'ai rajouté des champs et je ne veux pas de pseudo mais l'adresse mail à la place voici la table dont je veux insérer les valeurs récupérées par le formulaire.

Merci de votre aide.

CREATE TABLE IF NOT EXISTS `clients` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nom` varchar(255) NOT NULL,
`prenom` varchar(255) NOT NULL,
`mail` varchar(255) NOT NULL,
`adresse` varchar(255) NOT NULL,
`codepostal` varchar(255) NOT NULL,
`naissance` varchar(255) NOT NULL,
`age` varchar(255) NOT NULL,
`mdp` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `mail` (`mail`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
<?php
/* Indique le bon format des entêtes (par défaut apache risque de les envoyer au standard ISO-8859-1)*/
header('Content-type: text/html; charset=UTF-8');

/* Initialisation de la variable du message de réponse*/
$message = null;

/* Récupération des variables issues du formulaire par la méthode post*/
$nom = filter_input(INPUT_POST, 'nom');
$prenom = filter_input(INPUT_POST, 'prenom');
$adresse = filter_input(INPUT_POST, 'adresse');
$codepostal = filter_input(INPUT_POST, 'codepostal');
$ville = filter_input(INPUT_POST, 'ville');
$mail = filter_input(INPUT_POST, 'mail');
$phone = filter_input(INPUT_POST, 'phone');
$naissance = filter_input(INPUT_POST, 'naissance');
$age = filter_input(INPUT_POST, 'age');
$mdp = filter_input(INPUT_POST, 'mdp');

/* Si le formulaire est envoyé */
if (isset($nom,$prenom,$adresse,$codepostal,$ville,$mail,$phone,$naissance,$age,$mdp)) 
{   

    /* Teste que les valeurs ne sont pas vides ou composées uniquement d'espaces  */
   $nom = trim($nom) != '' ? $nom : null;
$prenom = trim($prenom) != '' ? $prenom : null;
$adresse = trim($adresse) != '' ? $adresse : null;
$codepostal = trim($codepostal) != '' ? $codepostal : null;
$ville = trim($ville) != '' ? $ville : null;
$mail = trim($mail) != '' ? $mail : null;
$phone = trim($phone) != '' ? $phone : null;
$naissance = trim($naissance) != '' ? $naissance : null;
$age = trim($age) != '' ? $age : null;
$mdp = trim($mdp) != '' ? $mdp : null;

    /* Si $mail et $pass différents de null */
    if(isset($nom,$prenom,$adresse,$codepostal,$ville,$mail,$phone,$naissance,$age,$mdp))
    {
    /* Connexion au serveur : dans cet exemple, en local sur le serveur d'évaluation
    A MODIFIER avec vos valeurs */
    $hostname = "localhost";
    $database = "prendrerdv";
    $username = "root";
    $password = "";
    
    /* Configuration des options de connexion */
    
    /* Désactive l'éumlateur de requêtes préparées (hautement recommandé)  */
    $pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
    
    /* Active le mode exception */
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    
    /* Indique le charset */
    $pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";
    
    /* Connexion */
    try
    {
      $connect = new PDO('mysql:host='.$hostname.';dbname='.$database, $username, $password, $pdo_options);
    }
    catch (PDOException $e)
    {
      exit('problème de connexion à la base');
    }
        
    
    /* Requête pour compter le nombre d'enregistrements répondant à la clause : champ du mail de la table = mail posté dans le formulaire */
    $requete = "SELECT COUNT(*) FROM clients WHERE mail = ?";
    
    try
    {
      /* préparation de la requête*/
      $req_prep = $connect->prepare($requete);
      
      /* Exécution de la requête en passant la position du marqueur et sa variable associée dans un tableau*/
      $req_prep->execute(array(0=>$mail));
      
      /* Récupération du résultat */
      $resultat = $req_prep->fetchColumn();
      
      if ($resultat == 0) 
      /* Résultat du comptage = 0 pour ce mail, on peut donc l'enregistrer */
      {
        /* Pour enregistrer la date actuelle (date/heure/minutes/secondes) on peut utiliser directement la fonction mysql : NOW()*/
        $insertion = "INSERT INTO clients(nom, prenom, adresse, codepostal, ville, mail, phone, naissance, age, mdp) VALUES(:nom, :prenom, :adresse, :codepostal, :ville, :mail, :phone, :naissance, :age, :mdp)";
        
        /* préparation de l'insertion */
        $insert_prep = $connect->prepare($insertion);
        
        /* Exécution de la requête en passant les marqueurs et leur variables associées dans un tableau*/
        $inser_exec = $insert_prep->execute(array(':nom'=>$nom,':prenom'=>$prenom,':adresse'=>$adresse,':codepostal'=>$codepostal,':ville'=>$ville,':mail'=>$mail,':phone'=>$phone,':naissance'=>$naissance,':age'=>$age,':mdp'=>$mdp));
        
        /* Si l'insertion s'est faite correctement...*/
        if ($inser_exec === true) 
        {
          /* Démarre une session si aucune n'est déjà existante et enregistre le mail dans la variable de session $_SESSION['login'] qui donne au visiteur la possibilité de se connecter.  */
          if (!session_id()) session_start();
          $_SESSION['login'] = $mail;
          
          /* A MODIFIER Remplacer le '#' par l'adresse de votre page de destination, sinon ce lien indique la page actuelle.*/
          $message = 'Votre inscription est enregistrée.';
          /*ou redirection vers une page en cas de succès ex : menu.php*/
          /*header("Location: menu.php");
            exit();  */
        }   
      }
      else
      {   /* Le mail est déjà utilisé */
        $message = 'Ce mail est déjà utilisé, changez-le.';
      }
    }
    catch (PDOException $e)
    {
      $message = 'Problème dans la requête d\'insertion';
    }	
  }
  else 
  {    /* Au moins un des deux champs "mail" ou "mot de passe" n'a pas été rempli*/
    $message = 'Les champs mail et Mot de passe doivent être remplis.';
  }
}
?>

<!doctype html>
<html lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Formulaire d'inscription - tutoriel PHP France</title>

<style type="text/css">
<!--
body, p, h1,form, input, fieldset 
{
  margin:0;
  padding:0;
}

body 
{
  background-color: #F4F4F4;
}

#inscription 
{
  width:400px;
  background:#FFFFFF;
  margin:20px auto;
  font-family: Arial, Helvetica, sans-serif;
  font-size:1em;
  border:1px solid #ccc;
  border-radius:10px;
}

#inscription fieldset 
{
  text-align:center;
  font-size:1.2em;
  background:#333333;
  padding-bottom:5px;
  margin-bottom:15px;
  color:#FFFFFF;
  letter-spacing:0.05em;
  border-top-left-radius:10px;
  border-top-right-radius:10px;
}

#inscription p 
{
  padding-top:15px;
  padding-right:50px;
  text-align:right;
}

#inscription input 
{
  margin-left:30px;
  width:150px;
}

#inscription #valider 
{
  width:155px;
  font-size:0.8em;
}

#inscription #message 
{
  height:27px;
  color:#F00;
  font-size:0.8em;
  font-weight:bold;
  text-align:center;
  padding:10px 0 0 0;
}
-->
</style>
</head>
<body>
<div id = "inscription">
    <form action = "#" method = "post">
    <fieldset>Inscription</fieldset>
    <p><label for = "nom">Nom : </label><input type = "text" name = "nom" id = "nom" /></p>
	<p><label for = "prenom">Prénom : </label><input type = "text" name = "prenom" id = "prenom" /></p>
	<p><label for = "adresse">Adresse : </label><input type = "text" name = "adresse" id = "adresse" /></p>
	<p><label for = "codepostal">Code postal : </label><input type = "text" name = "codepostal" id = "codepostal" /></p>
	<p><label for = "ville">Ville : </label><input type = "text" name = "ville" id = "ville" /></p>
	<p><label for = "mail">E-Mail : </label><input type = "text" name = "mail" id = "mail" /></p>
	<p><label for = "phone">Téléphone : </label><input type = "text" name = "phone" id = "phone" /></p>
	<p><label for = "naissance">Date de Naissance : </label><input type = "date" name = "naissance" id = "naissance" /></p>
	<p><label for = "age">Âge : </label><input type = "text" name = "age" id = "age" /></p>
    <p><label for = "mdp">Mot de passe : </label><input type = "password" name = "mdp" id = "mdp" /></p>
    <p><input type = "submit" value = "Envoyer" id = "valider" /></p>
    </form>
    <p id = "message"><?= $message?:'' ?></p>
</div>
</body>
</html>

Merci de votre aide

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 oct. 2016, 12:10

salut,

catch (PDOException $e)
{
$message = 'Problème dans la requête d\'insertion';
}

il faut exploiter le message d'erreur fournit par l'exeption sinon tu ne t'en sortiras pas
=> $message .= 'Erreur : '.$e->getMessage();

d'après tes infos le message va te dire que la table ne contient pas de colonne ville et tu en indiques une dans ta requête d'insertion.


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 24 Messages

18 oct. 2016, 13:36

Ha merci beaucoup de ta réponse, qui m'a bien aidé et maintenant mes valeurs rentrent parfaitement dans ma table.

J'ai encore 3 petits problèmes.

-1 J'aimerai bien ajouter un champs captcha dans mon formulaire et également dans le php (2-3 questions) mais je ne sais pas où mettre le code et quel code mettre.

-2 La page login marche parfaitement et m'envoie vers la page admin/index.php ou j'ai mis ce code histoire de la protéger
<?php
session_start(); 
if(!isset($_SESSION['mail'])) {die('Vous devez être enregistré pour accéder à cette partie du site');}
$_SESSION['login'] = $mail;
?>
mais la page au lieu de s'afficher completement avec le menu , j'ai juste cette phrase qui apparait alors que logiquement je suis connecté :

Vous devez être enregistré pour accéder à cette partie du site



-3 Apparament dans mon code je bloque l'utilisation de PDO mais comment transformer le script pour qu'il s'adapte à cette nouvelle norme ?

Merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 oct. 2016, 14:03

pour le captcha je suis tenté de te conseiller celui de google : https://www.google.com/recaptcha/intro/index.html (bon faut un compte et ils traitent les données sur leurs serveurs ça peux rebuter).

Si tu veux le faire toit même le plus simple c'est de une sélection aléatoire parmi des questions / réponse et tu met en session le code pour la réponse (surtout pas dans le formulaire sinon c'est trop simple ;) ).
ensuite coté serveur tu compares la réponse faite avec la bonne réponse.

évite les trucs a base d'image tordue et compagnie c'est moche et pas simple a utiliser.

2/ a priori $_SESSION['mail'] n'existe pas.
ajoute un var_dump($_SESSION); pour voir ce qu'il y a en session.
est ce que tu met bien l'email en session lorsque tu as valider les informations d'authentification de l'utilisateur ?

3/ je n'ai pas compris. tu bloque PDO ? PDO c'est natif php soit l'extension est dispo soit elle l'est pas. Si elle ne l'est pas faut râler ce n'est pas normal ;)


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 24 Messages

18 oct. 2016, 14:26

Merci pour ta réponse rapide est précise. Je vais me mettre sur la captcha avec des questions au hasard ;)

en ajoutant var_dump($_SESSION);

array (size=1)
'login' => string '[email protected]' (length=21)

donc la page admin/index.php reçoit bien mon adresse mail mais refuse d'afficher la page admin

voici mon code placé dans le <head> </head>
<?php
session_start(); 
var_dump($_SESSION); 
if(!isset($_SESSION['mail'])) {die('Vous devez être enregistré pour accéder à cette partie du site');}
$_SESSION['login'] = $mail;
?>


-3 je me suis posé la question car dans le code on utilise , false veut dire qu'il ne se sert pas de pdo
/* Désactive l'éumlateur de requêtes préparées (hautement recommandé)  */
    $pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 oct. 2016, 16:35

array (size=1)
'login' => string '[email protected]' (length=21)

c'est $_SESSION['login'] et pas $_SESSION['mail'] XD

3/ nan pas du tout c'est même dit dans le commentaire ;)
c'est parce que PDO est prévu pour "émuler" les requêtes préparées, en clair ça ressemble a des requêtes préparées, ça fonctionne pareil mais s'en est pas. c'est PDO qui gère les insertion derrière de façon classique.
en mettant cela a false tu indiques de ne pas utiliser ce système mais d'utiliser les système natif des sgbd.

d'ailleurs le tableau $pdo_options c'est quelque chose que tu passes au constructeur de l'objet PDO ;)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 24 Messages

18 oct. 2016, 17:41

Alors je sais pas ce qui c'est passé mais j'ai même plus mon adresse mail qui apparaît

Dans ma page login.php j'ai ce code
if (!session_id()) session_start();
        $_SESSION['login'] = $mail;
            
        $message = 'Bonjour '.htmlspecialchars($_SESSION['login']).', vous êtes connecté';
        /*ou redirection vers une page en cas de succès ex : menu.php*/
        header("Location: ./admin/index.php");
		
        exit();

et voici le code de ma page admin/index.php

J'ai crée un champs int qui s'appel level dans ma table client, comment faire pour que la page membre/index.php s'ouvre si level=0 et comment faire pour que la page admin/index.php s'ouvre si level=1 ?
<!DOCTYPE html>
<html>
<head>

  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="generator" content="">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="shortcut icon" href="assets/images/logo.png" type="image/x-icon">
  <meta name="description" content="">
  
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic&subset=latin">
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Montserrat:400,700">
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Raleway:100,100i,200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800,800i,900,900i">
  <link rel="stylesheet" href="assets/et-line-font-plugin/style.css">
  <link rel="stylesheet" href="assets/bootstrap-material-design-font/css/material.css">
  <link rel="stylesheet" href="assets/tether/tether.min.css">
  <link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
  <link rel="stylesheet" href="assets/socicon/css/socicon.min.css">
  <link rel="stylesheet" href="assets/theme/css/style.css">
  <link rel="stylesheet" href="assets/moncss/css/mbr-additional.css" type="text/css">
  <?php
session_start(); 
var_dump($_SESSION); 
if(!isset($_SESSION['login'])) {die('Vous devez être enregistré pour accéder à cette partie du site');}
$_SESSION['login'] = $mail;
?>
  
  
</head>
<body>
<section class="mbr-slider mbr-section mbr-section__container carousel slide mbr-section-nopadding" data-ride="carousel" data-keyboard="false" data-wrap="true" data-pause="false" data-interval="false" id="index-slider-0">
    <div>
        <div>
            <div>
                
                <div class="carousel-inner" role="listbox">
                    <div class="mbr-section mbr-section-hero carousel-item dark center mbr-section-full active" data-bg-video-slide="false" style="background-image: url(assets/images/beautistas-negative-space-2000x1125-99-2000x1125-74.jpg);">
                        <div class="mbr-table-cell">
                            
                            <div class="container-slide container">
                                
                                <div class="row">
                                    <div class="col-md-8 col-md-offset-2 text-xs-center">
                                        
                                        

                                        
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

              
                </a>
            </div>
        </div>
    </div>
</section>

<section class="engine"><a rel="external" href=""></a></section><section class="mbr-section mbr-section__container" id="index-header3-0" style="background-color: rgb(255, 255, 255); padding-top: 0px; padding-bottom: 0px;">
    <div class="container">
        <div class="row">
            <div class="col-xs-12">
                <h3 class="mbr-section-title display-2">Panneau d'Administration</h3>
                <small class="mbr-section-subtitle">Nombre de Client:<br>Moyenne d'âge:</small>
            </div>
        </div>
    </div>
</section>

<section class="mbr-cards mbr-section mbr-section-nopadding" id="index-features3-0" style="background-color: rgb(255, 255, 255);">

    

    <div class="mbr-cards-row row">
        <div class="mbr-cards-col col-xs-12 col-lg-3" style="padding-top: 0px; padding-bottom: 80px;">
            <div class="container">
              <div class="card cart-block">
                  <div class="card-img"><img src="assets/images/ajoutclient-600x399-55.jpg" class="card-img-top"></div>
                  
                </div>
            </div>
        </div>
        <div class="mbr-cards-col col-xs-12 col-lg-3" style="padding-top: 0px; padding-bottom: 80px;">
            <div class="container">
                <div class="card cart-block">
                    <div class="card-img"><img src="assets/images/listeclients-600x399-90.jpg" class="card-img-top"></div>
                    
                </div>
            </div>
        </div>
        <div class="mbr-cards-col col-xs-12 col-lg-3" style="padding-top: 0px; padding-bottom: 80px;">
            <div class="container">
                <div class="card cart-block">
                    <div class="card-img"><img src="assets/images/ajouteragenda-600x399-33.jpg" class="card-img-top"></div>
                    
                </div>
            </div>
        </div>
        <div class="mbr-cards-col col-xs-12 col-lg-3" style="padding-top: 0px; padding-bottom: 80px;">
            <div class="container">
                <div class="card cart-block">
                    <div class="card-img"><img src="assets/images/mon-agenda-600x399-34.jpg" class="card-img-top"></div>
                    
                </div>
            </div>
        </div>
        
        
    </div>
</section>

<footer class="mbr-small-footer mbr-section mbr-section-nopadding" id="index-footer1-0" style="background-color: rgb(50, 50, 50); padding-top: 1.75rem; padding-bottom: 1.75rem;">
    
    <div class="container">
        <p class="text-xs-center">Copyright (c) 2016.</p>
    </div>
</footer>


  <script src="assets/web/assets/jquery/jquery.min.js"></script>
  <script src="assets/tether/tether.min.js"></script>
  <script src="assets/bootstrap/js/bootstrap.min.js"></script>
  <script src="assets/smooth-scroll/SmoothScroll.js"></script>
  <script src="assets/bootstrap-carousel-swipe/bootstrap-carousel-swipe.js"></script>
  <script src="assets/theme/js/script.js"></script>
  
  
 <div id="scrollToTop" class="scrollToTop mbr-arrow-up"><a style="text-align: center;"><i class="mbr-arrow-up-icon"></i></a></div>
  </body>
</html>
Merci de ton aide super modo ;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

19 oct. 2016, 10:11

salut,

évite ce genre d'affectation $_SESSION['login'] = $mail;
tu ne sais pas du tout ce qui ce passe et la plus part du temps $mail n'existe pas tu affectes donc la valeur null à $_SESSION['login']
du coup dans ce code
<?php
if (!session_id()) session_start();
   $_SESSION['login'] = $mail;
            
        $message = 'Bonjour '.htmlspecialchars($_SESSION['login']).', vous êtes connecté';
        /*ou redirection vers une page en cas de succès ex : menu.php*/
        header("Location: ./admin/index.php");
tu as deux problèmes en 4 lignes de codes.
- tu écrases $_SESSION['login'] avec null
- tu emploi la fonction header alors que tu as déjà envoyer le corps de la réponse (affichage).
il faut vraiment que tu ais un error_reporting = A_ALL et un display_error = on pour développer correctement (modifie ton php.ini).


pour la redirection, il faut dans la page qui valide le formulaire de connexion tu vas récupérer les informations utilisateur dont le champs level.

et ci les infos sont valides
<?php
if($dataUtilisateurRecuperée['level'] ==1) {
    header('admin/index.php');
}else {
    header('membre/index.php');
}

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 24 Messages

19 oct. 2016, 12:39

super merci, je vais corriger cela. Merci beaucoup à toi pour ta rapidité ;)