Partage
  • Partager sur Facebook
  • Partager sur Twitter

Insert value list does not match column list: 113

mysql/php requête insert avec fk

    31 août 2019 à 18:01:05

    bonjour

    j'ai cette erreur ' Insert value list does not match column list: 1136 Column count doesn't match value count at row 1 in" 

    mais je ne vois pas pourquoi, jai vérifié le nombre de colonne, l'orthographe mais ...

    req = $bdd->prepare('INSERT INTO topics (title, detail, budget, ville, departement, date, id_user, activity, category) VALUES (:titre, :description, :budget, (SELECT V.ville_id, D.departement_id FROM villes INNER JOIN departements ON D.departement_code=V.ville_departement WHERE ville_nom= :ville), now(), :id_user, (SELECT id_activity, id_category FROM activities WHERE activity=:activity))');
            $req -> bindValue(':titre', $_SESSION['projet']['titre'], PDO::PARAM_STR);
            $req -> bindValue(':description', $_SESSION['projet']['description'], PDO::PARAM_STR);
            $req -> bindValue(':ville', $_SESSION['projet']['ville'], PDO::PARAM_STR);
    		$req -> bindValue(':budget', $_SESSION['projet']['budget'], PDO::PARAM_INT);
    //        $req -> bindValue(':departement', $_SESSION['projet']['departement'], PDO::PARAM_STR);
            $req -> bindValue(':id_user', $perso['id_user'], PDO::PARAM_STR);
            $req -> bindValue(':activity', $category, PDO::PARAM_STR);
            $ins = $req->execute();

    EDIT:

    j'ai porté quelque modification et l'erreur est maintenant

    Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de '' à la ligne 1 

    -
    Edité par born1 2 septembre 2019 à 0:35:07

    • Partager sur Facebook
    • Partager sur Twitter
      2 septembre 2019 à 10:50:28

      Bonjour,

      born1 a écrit:

      j'ai porté quelque modification

      Lesquelles ? Peux-tu reposter le code corrigé ?

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        2 septembre 2019 à 22:22:26

        Salut, merci

        alors le code:

        $category= trim(substr($_POST['categorie'], 0, strpos($_POST['categorie'],"(")));
                $req = $bdd->prepare('INSERT INTO topics (id_user , title , detail , budget , category , activity , departement , ville , date) VALUES ((SELECT id_user FROM users WHERE pseudo = :pseudo), :title , :detail , :budget , (SELECT id_category , id_activity FROM activities WHERE activity=:activity) , (SELECT D.departement_id , V.ville_id FROM villes V INNER JOIN departements D ON D.departement_code=V.ville_departement WHERE V.ville_nom= :ville), now()');
                $req -> bindValue(':title', $_SESSION['projet']['titre'], PDO::PARAM_STR);
                $req -> bindValue(':detail', $_SESSION['projet']['description'], PDO::PARAM_STR);
                $req -> bindValue(':ville', $_SESSION['projet']['ville'], PDO::PARAM_STR);
        		$req -> bindValue(':budget', $_SESSION['projet']['budget'], PDO::PARAM_INT);
        //        $req -> bindValue(':departement', $_SESSION['projet']['departement'], PDO::PARAM_STR);
                $req -> bindValue(':pseudo', $_SESSION['name'], PDO::PARAM_STR);
                $req -> bindValue(':activity', $category, PDO::PARAM_STR);
        		var_dump($_SESSION);
                $req->execute();

        donne : 

        array(3) { ["name"]=> string(5) "yohan" ["compte"]=> string(3) "pro" ["projet"]=> array(7) { ["titre"]=> string(46) "[tout ) doit etre ok" ["description"]=> string(218) "jlsvkl s , s ,sbl ndls msfù ,sd ,MLs, , £s,ùl,nsm n ôs, ô mkfsn ^,s ô kmxn k,ps,x cmps os,, smld ^lv,e $pssv,^foo,bôsf,ôv,,ù mksow, $pvk ; ^,sfx ô sf,ô ¤pv$sp f,bd bkdg $p , d^^,^sodùbs,smd" ["categorie"]=> string(32) "élagage / abatage (espace vert)" ["budget"]=> string(1) "2" ["code_postal"]=> string(5) "97222" ["ville"]=> string(13) "bellefontaine" ["departement"]=> string(10) "martinique" } }
        Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de '' à la ligne 1 in D:\wamp64\www\rewrited\canevas\traitement.php on line 71

        ligne 71

        dans mon code 

        req->execute();

        je n'accède pas au code source de la page 


        -
        Edité par born1 2 septembre 2019 à 22:31:46

        • Partager sur Facebook
        • Partager sur Twitter
          2 septembre 2019 à 23:54:52

          alors merci beaucoup, il m'a semblé avoir vérifié pourtant, mais ça devait être avant la dernière modification. 

          néanmoins, j'ai cette nouvelle erreur

          Warning: PDOStatement::execute(): SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row 1

          j'ai vérifié mon nombre colonnes qui est de 12 avec 1 colonne auto incrément, et 2 avec des valeurs par défaut. 

          j'ai vérifié le nombre de colonne que j'utilise dans l'insert => 9 

          le nombre de valeurs => 9 dont 5 obtenues lors de 3 sous requetes

          le nombre de liaison des valeurs => 6

          l'othographe ! 

          mais je ne vois pas d'erreur 

          • Partager sur Facebook
          • Partager sur Twitter
            2 septembre 2019 à 23:59:12

            Tu ne peux pas faire un SELECT renvoyant 2 valeurs dans ce contexte :

            (SELECT id_category , id_activity FROM activities WHERE activity=:activity)

            Tu dois le remplacer par :

            (SELECT id_activity FROM activities WHERE activity=:activity), (SELECT id_category FROM activities WHERE activity=:activity)
            

            Ca me paraît bien compliqué tout ça.

            L'id de l'utilisateur, tu devrais l'avoir en session. Son nom en session, c'est plutôt pour des raisons pratiques, comme cache, pour éviter des SELECT si tu l'affiches en header ou autre.

            J'aurais bien suggéré un INSERT ... SELECT mais ça ne simplifierait pas plus.

            Vu que tu utilises des données en session, tu aurais probablement pu récupérer directement l'id de tes données plutôt que leurs noms.

            -
            Edité par julp 3 septembre 2019 à 0:03:12

            • Partager sur Facebook
            • Partager sur Twitter
              3 septembre 2019 à 2:00:00

              Tu ne peux pas faire un SELECT renvoyant 2 valeurs dans ce contexte

              =>ah ok ! 

              Ca me paraît bien compliqué tout ça.

              =>oui, ça fait long là requête !

              L'id de l'utilisateur, tu devrais l'avoir en session

              =>c'est sûr, ça ne touche pas à la sécurité ? 

              • Partager sur Facebook
              • Partager sur Twitter
                3 septembre 2019 à 2:36:09

                > c'est sûr, ça ne touche pas à la sécurité ?

                Non. pseudo ou id, tu te bases toujours sur une info en session. Mais un id ça coûte moins cher à stocker et c'est plus "performant" pour travailler dessus (index de ta bdd). Surtout, un id, c'est fixe, ça ne change pas de valeur dans le temps alors que le pseudo, pas forcément.

                -
                Edité par julp 3 septembre 2019 à 2:37:31

                • Partager sur Facebook
                • Partager sur Twitter
                  3 septembre 2019 à 4:11:33

                  ok super merci , j'ai quelques lignes à modifier
                  j'ai une dernière question comment récupérer le code afin de le traiter les codes sqlstate? ça se travaille dans le try catch?

                  -
                  Edité par born1 3 septembre 2019 à 4:13:26

                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 septembre 2019 à 11:42:45

                    Ca dépend ce que tu cherches à faire, si c'est pour gérer un doublon, il y a éventuellement d'autres options.

                    Sinon, oui, c'est la solution la plus "évidente".

                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 septembre 2019 à 12:43:43

                      En effet , c'est pour voir si j'ai des doublons ou et éventuellement d'autres codes sqlstate
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Insert value list does not match column list: 113

                      × 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