Partage
  • Partager sur Facebook
  • Partager sur Twitter

General error: 1364 Field 'id_categorie' doesn't..

Mysql

Sujet résolu
    30 novembre 2021 à 11:52:58

    Bonjour, depuis un bon moment je galère dans ça, j'ai même refait les tables, et j'ai toujours la même erreur. J'ai regardé des solutions parlant d'aller chercher dans le sql mode, et encore lorsque j'efface==>une autre erreur. J'ai donc remis les choses telles qu'elles étaient pour ne pas faire pire.

    Voici les tables, elles sont liées comme on peut les voir dans les photos. Voyez-vous le problème, svp ? Merci :)

    • Partager sur Facebook
    • Partager sur Twitter
      30 novembre 2021 à 11:56:47

      Bonjour,

      et où est le code qui renvoie cette erreur ?

      • Partager sur Facebook
      • Partager sur Twitter

      Pas d'aide concernant le code par MP, le forum est là pour ça :)

        30 novembre 2021 à 12:17:58

        Bonjour, Merci pour votre réponse. Le code est très long. Cependant le voila:

        <?php
        //------------------------------------------------------
        function savePhoto($id_annonce,$id_categorie,$id_membre,$id_utilisateur,$file,$location){
        
            if(empty($file)){
              echo "<br> ERREUR : Aucune image n'est envoyées pour l'upload";
              var_dump($_FILES); // juste pour le debug...
              return false; //pas d'image
            }
            $photo = $file['name'];
            $photo_tmp = $file['tmp_name'];
            if(move_uploaded_file($photo_tmp,$location.$photo)){
               return insertPhoto($id_annonce,$id_categorie,$id_membre,$id_utilisateur,$location.$photo); // tu peux retirer le location si tu ne veux que le nom de l'image et pas son chemin complet
            }
        }
        
        
        function insertPhoto($id_annonce,$photo){
            global $bdd;
            $sql= "INSERT INTO images_annonces(id_annonce,filepath) VALUES(?,?)";
            $datas= array($id_annonce, $photo);
             //Execution de la requete
            try{
            //Execution pour la deuxième table
              $requete2 = $bdd -> prepare($sql) ;
              return $requete2->execute($datas) ;
            }catch(Exception $e){
                // en cas d'erreur :
                echo " Erreur ! ".$e->getMessage();
                echo " Les datas : " ; 
                print_r($datas);
            }      
        }
        
        //Requete 1
        
        function insertAnnonce( $titre, $description, $prix, $villes){
          global $bdd;
         
        
          $sql= "INSERT INTO annonces(titre,description,prix,ville) VALUES(?,?,?,?)";
          $datas= array($titre,$description, $prix, $villes);
          //Execution de la requete
          try{ //requete pour la première tabels
            $requete = $bdd->prepare($sql) ;
            $requete->execute($datas) ;
            return $bdd->LastInsertId();
          }catch(Exception $e){
            // en cas d'erreur :
            echo " Erreur ! ".$e->getMessage();
            echo " Les datas : " ; 
            print_r($datas);
            return false;
          }
        }
        
          //Requete 2
        
          function insertCategorie( $categorie){
            global $bdd;
          $sql= "INSERT INTO categories(categorie) VALUES(?)";
          $datas= array( $categorie);
          //Execution de la requete
          try{ //requete pour la première tabels
            $requete = $bdd->prepare($sql) ;
            $requete->execute($datas) ;
            return $bdd->LastInsertId();
          }catch(Exception $e){
            // en cas d'erreur :
            echo " Erreur ! ".$e->getMessage();
            echo " Les datas : " ; 
            print_r($datas);
            return false;
          }
        
          }
          
          function insertUtilisateur($pseudo,$email, $telephone){
           //Requete 3
          $sql= "INSERT INTO utilisateurs(pseudo, email, telephone) VALUES(?,?,?)";
          $datas= array($pseudo,$email, $telephone);
          //Execution de la requete
          try{ //requete pour la première tabels
            $requete = $bdd->prepare($sql) ;
            $requete->execute($datas) ;
            return $bdd->LastInsertId();
          }catch(Exception $e){
            // en cas d'erreur :
            echo " Erreur ! ".$e->getMessage();
            echo " Les datas : " ; 
            print_r($datas);
            return false;
          }
          }
        
        
        
          //Requete 4
          function insertMembre($pseudo,$email, $telephone, $motdepasse){
          $sql= "INSERT INTO membres(pseudo,email,telephone,motdepasse) VALUES(?,?,?,?)";
          $datas= array($pseudo,$email, $telephone, $motdepasse);
          //Execution de la requete
          try{ //requete pour la première tabels
            $requete = $bdd->prepare($sql) ;
            $requete->execute($datas) ;
            return $bdd->LastInsertId();
          }catch(Exception $e){
            // en cas d'erreur :
            echo " Erreur ! ".$e->getMessage();
            echo " Les datas : " ; 
            print_r($datas);
            return false;
          }
        
        
        
        
        }
        
        
        
        
        
        
        
        
        
        
        
        //----------------------------------------------------------//
        // CONSTANTES ou variables pour le paramétrage..
        //----------------------------------------------------------//
         $location= "pictures/";
        
        
         //----------------------------------------------------------//
        // Traitement du submit
        //----------------------------------------------------------//
        
        if(isset($_POST['formannonce'])) {
            $telephone= intval($_POST['telephone']); // attention, ça fera disparaitre le 0 qui se trouve en première position si il y en a un ...
            $email = trim($_POST['email']); // htmlspecialchars ne s'utilise que pour de l'affichage.. pas pour insérer les données en bdd !
            $categorie= trim($_POST['categorie']);  // htmlspecialchars ne s'utilise que pour de l'affichage.. pas pour insérer les données en bdd !
            $villes= trim($_POST['ville']);  
            $titre = trim($_POST['titre']); 
            $pseudo = trim($_POST['pseudo']);
            $prix= intval($_POST['prix']); // 
            $description= trim($_POST['description']);
            $motdepasse= sha1($_POST['motdepasse']); 
        
            $img1 = ($_FILES['img1']);
            $img2 = ($_FILES['img2']);
            $img3 = ($_FILES['img3']);
            $img4 = ($_FILES['img4']);
            $img5 = ($_FILES['img5']);
        
        
            //on créé l'annonce
            $id_annonce = insertAnnonce($titre, $description, $prix, $villes);
            $id_categorie= insertCategorie($categorie);
            $id_utilisateur= insertUtilisateur($pseudo, $email, $telephone);
            $id_membre= insertMembre($pseudo, $email, $telephone, $motdepasse);
            // si on a bien un id_product, on upload et insère les images
            if(!empty($id_annonce) AND !empty($id_categorie) AND (!empty($id_membre) ||!empty($id_utilisateur)) ){
              savePhoto($id_annonce,$id_annonce,$id_categorie,$id_membre,$id_utilisateur,$img1,$location);
              savePhoto($id_annonce,$id_annonce,$id_categorie,$id_membre,$id_utilisateur,$img2,$location);
              savePhoto($id_annonce,$id_annonce,$id_categorie,$id_membre,$id_utilisateur,$img3,$location);
              savePhoto($id_annonce,$id_annonce,$id_categorie,$id_membre,$id_utilisateur,$img4,$location);
              savePhoto($id_annonce,$id_annonce,$id_categorie,$id_membre,$id_utilisateur,$img5,$location);
            
            echo"<h1 style= 'color: green; background-color: white; margin-top: 120px;'>Votre annonce a bien été déposée et sera publiée bientôt. 
            </h1>";
            
            }else{
              echo "Erreur : Aucun ID n'a été créé !";
            }
        }
        
         ?>



        • Partager sur Facebook
        • Partager sur Twitter
          30 novembre 2021 à 12:47:07

          Bonjour.

          Quand tu appels savephoto, tu lui donnes 7 paramètres alors qu'il en faut que 6.

          A quel ligne est l'erreur ?

          • Partager sur Facebook
          • Partager sur Twitter
            30 novembre 2021 à 13:10:50

            Bonjour Aurélien, l'erreur est à partir de la ligne 59, la function insertCategorie, il s'agit du code pour insérer dans la table categories qui a 2 champs (id comme clé PRIMAIRE auto incrémentée, et categorie). le champ id de la table categories est liée à id_categorie(index) de la table annonces. On peut voir dans les photos. Donc l'erreur PRINCIPALE est la suivante: 

            General error: 1364 Field 'id_categorie' doesn't..a default value

            <<Quand tu appels savephoto, tu lui donnes 7 paramètres alors qu'il en faut que 6.>>

            Comme mon code est desordonné, le 7ème paramètre $location (ligne133), c'est l'endroit du fichier où vont les images



            • Partager sur Facebook
            • Partager sur Twitter
              30 novembre 2021 à 13:27:08

              La même avec insertPhoto :

              > function insertPhoto($id_annonce,$photo){

              2 paramètres

              > return insertPhoto($id_annonce,$id_categorie,$id_membre,$id_utilisateur,$location.$photo);

              Il y en a plus que 2, là.

              > General error: 1364 Field 'id_categorie' doesn't have a default value

              Ta colonne id_categorie (et FK) n'est pas renseignée - n'apparaît même pas - dans insertAnnonce (sa requête INSERT). Mais encore faudrait-il commencer par fournir cette information à la fonction. (impliquerait d'exécuter d'abord insertCategorie de façon à récupérer le lastInsertId et le réinjecter en paramètre de l'appel de la fonction insertAnnonce pour qu'elle puisse le binder en paramètre de son INSERT)

              Rends-toi service :

              • supprime tous ces try/catch, s'il y a une erreur, c'est à l'appelant de le gérer comme il le souhaite, pas à la fonction de le faire elle-même
              • passe explicitement la connexion PDO en paramètre de tes fonctions au lieu de ces global (absent d'ailleurs des fonctions insertMembre et insertUtilisateur donc elles doivent planter)
              • pas de sha1, ça ne vaut rien, utilise password_hash
              • pas besoin d'utiliser !empty comme un gros bourrin pour n'exclure que false, !$id_annonce suffit ...
              • ... mais cette gestion d'erreur est à revoir, il vaudrait mieux laisser planter et tout mettre dans une transaction SQL
              • remplacer les 5 $_FILES['imgX'] par un tableau de façon à pouvoir itérer sur $_FILES['img'] (ie utiliser name="img[]" au lieu de name="imgX" sur les input type="file")
              • pourquoi il y a autant d'INSERT pour un seul script ?
                • quelle(s) différence(s) entre un membre et un utilisateur ? Ca ne fait pas un peu inutilement doublon ?
                • chaque annonce implique sa catégorie ? Tu n'en réutilises jamais une qui existe déjà ?
              • etc

              Bref, il y a du boulot ...

              -
              Edité par julp 30 novembre 2021 à 13:49:19

              • Partager sur Facebook
              • Partager sur Twitter
                30 novembre 2021 à 15:24:51

                Julp, merci pour ton aide, je cherchais à faire disparaitre l'erreur 1364, et tu m'as éclairé sur plusieurs choses. J'ai réussi à faire disparaitre cette erreur, et par conséquence d'autres erreurs se sont affichées. Le problème vient de mon code lui même, qui est un autre sujet. Ainsi j'ai publié le problème ici:( https://openclassrooms.com/forum/sujet/formulaire-inscrits-et-non-inscrits-en-mysql )avec un sujet différent, cette fois ce n'est pas l'erreur 1364.

                Tu m'as éclairer sur ce sujet, je serais heureux que tu fasses de même  pour celui-ci:  https://openclassrooms.com/forum/sujet/formulaire-inscrits-et-non-inscrits-en-mysql

                -
                Edité par mouls22 30 novembre 2021 à 15:26:36

                • Partager sur Facebook
                • Partager sur Twitter

                General error: 1364 Field 'id_categorie' doesn't..

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown