Mysqli & insert into

Bonjour,

Toujours mon parcours du combatant de mysql à mysqli :

			    $req_pre = mysqli_prepare($bdd, 'INSERT INTO eg_anonyme (action, genre, age, ville_id, distribution periode, email) VALUES (?, ?, ,? ,? ,? ,? ,?)');

				mysqli_stmt_bind_param($req_pre, $action, $genre, $age, $ville_id, $distribution, $periode, $email);

				mysqli_stmt_execute($req_pre);


J'ai le message suivant



Merci de votre aide.

19 réponses

Résumé de la discussion

Plusieurs échanges soulignent une erreur de syntaxe et de correspondance entre les paramètres et les placeholders dans une requête INSERT préparée avec mysqli_prepare. Des messages montrent qu’un nombre insuffisant de paramètres ou des virgules mal placées cassent la requête, et que la chaîne de types doit correspondre au nombre de paramètres. La solution pratique consiste à définir les placeholders (sept « ? » pour sept colonnes) et à utiliser une chaîne de types adéquate, par exemple 'ssiisss' pour action, genre, age, ville_id, distribution, periode et email. En cas de doute, vérifier que le SQL ne comporte pas de faute de virgule et que les colonnes listées existent, afin d’éviter des erreurs lors du binding.

Bobot (l’IA à votre service)
  1. Bonjour

    (?, ?, ,? ,? ,? ,? ,?)

    Tu as une virgule en trop (deux virgules qui se suivent)
    De plus, le nombre de ? devrait correspondre au nombre de champs.
    Et «distribution periode» avec un espace n'est pas un bon nom de champ. Tu peux l'utiliser, mais à condition de le mettre entre accents graves (Alt Gr 7)
    1. J'ai corrigé, mais cela ne change rien le message d'erreur demeure...
      1. Contributeur
        'lut, comme dit le message d'erreur,
        mysqli_stmt_bind_param
        s'attend a un objet de requête préparée en tant que 1er paramètre or elle a reçu un booléen, or le seul cas dans lequel
        mysqli_prepare
        renvoie un booléen est quand elle échoue!
        La syntaxe de ta requête n'étant pas erronée, l'erreur vient de la connexion à la BDD, regarde du coté de mysqli_connect_error() pour savoir ce qui cloche.
        1. Waouh ! les choses se compliquent...

          Voila mon script en intro de page :

          <?php
          ini_set('display_errors', true);
          error_reporting(E_ALL);
           
          require_once('../../koneksyon/konfig.php');
          ?>
          


          Et ma (modeste) classe de connection :

          <?php
          //On demarre les sessions
          session_start();
          $bdd = mysqli_connect('localhost', '*****', '*****', '*****');
          ?>
          
          1. On peut revoir la requête corrigée avant de dire qu'elle n'est pas erronée ?
            D'ailleurs, même si la syntaxe est correcte, il peut y avoir une erreur dans un nom de table ou de champ.

            mysqli et / ou mysqli_connect sont-ils à l'intérieur de fonctions ? Si oui, il faudrait déclarer global $bdd pour que la variable soit bien la même dans les deux cas.
            1. Requête corrigée :

                     
              $req_pre = mysqli_prepare($bdd, 'INSERT INTO eg_anonyme (action, genre, age, ville_id, distribution, periode, email) VALUES (?, ?, ?, ,? ,? ,? ,?)');
              
                  mysqli_stmt_bind_param($req_pre, "sis", $action, $genre, $age, $ville_id, $distribution, $periode, $email);
              
                  mysqli_stmt_execute($req_pre);
               
              
              1. Le message d'erreur est-il toujours le même qu'avant ?
                Car tu as une erreur dans ton mysqli_stmt_bind_param.
                extrait de la doc :
                « Le nombre de variables et la longueur de la chaîne de caractères types doivent correspondre aux paramètres de la requête. »
                Toi, ta chaîne types ("sis") n'a que 3 caractères, alors que tu as 7 paramètres.
                1. Désolé, v'là la bonne requête :

                   
                   $req_pre = mysqli_prepare($bdd, 'INSERT INTO eg_anonyme (action, genre, age, ville_id, distribution, periode, email) VALUES (?, ?, ?, ,? ,? ,? ,?)');
                  
                  mysqli_stmt_bind_param($req_pre, "sis", $action, $genre, $age, $ville_id, $distribution, $periode, $email); mysqli_stmt_execute($req_pre);
                  
                  
                  
              2. 1 - je ne vois pas la différence entre cette dernière requête et la précédente
                2 - je t'avais demandé si tu avais toujours le même message d'erreur, peux-tu répondre à cette question ?
                3 - je t'ai fait remarquer une erreur sur le paramètre type, tu n'en parles pas et ne l'as pas corrigé. Est-ce que tu as lu ce que j'avais écrit ?
                1. Bjr "le père", je te remercie de m'aider, mais saches que tu t'adresses à un Nul, un vrai.
                  Même pas foutu de te donner la bonne requête :) qui est la suivante :

                  $req_pre = mysqli_prepare($bdd, 'INSERT INTO eg_anonyme (action, genre, age, ville_id, distribution, periode, email) VALUES (?, ?, ?, ,? ,? ,? ,?)');
                  
                  mysqli_stmt_bind_param($req_pre, "sis", $action, $genre, $age, $ville_id, $distribution, $periode, $email);
                  
                  mysqli_stmt_execute($req_pre);
                  
                  


                  Le message d'erreur est la suivante :

                  1. C'est incroyable comme tu ne tiens pas compte de ce que j'écris. Tu as toujours la même erreur sur le paramètre types, tu n'en parles toujours pas plus, c'est encore comme si je n'avais rien écrit.
                    Un progrès quand même : tu as copié le message d'erreur, et c'est toujours le même qu'au départ.
                    Ce qui m'étonne c'est qu'il n'y a pas de message d'erreur avant celui-ci, il devrait y en avoir un sur le mysqli_prepare. Peux-tu ajouter

                    echo mysqli_error($bdd);

                    après la ligne du mysqli_prepare et voir si un message d'erreur s'affiche ?
                    1. Vraiment désolé, mais "paramètres type" je ne sais pas ce que c'est...

                      Voici le message d'erreur qui s'affiche, et me renvoie à la ligne 2 de connexion en intro de page :

                      You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? ,? ,? ,?)' at line 2
                      


                      Voir le script d'intro dans le message n° 4 ci-dessus.
                      1. Modérateur
                        Bonjour,

                        <blocik>
                        Voici le message d'erreur qui s'affiche, et me renvoie à la ligne 2 de connexion en intro de page
                        </block>
                        Non.. le message d'erreur parle d'un souci de ligne dans une syntaxe SQL (donc dans une requête) et non du numéro de ligne dans ton code source...

                        Le souci se situerait donc dans cette ligne de code :
                        $req_pre = mysqli_prepare($bdd, 'INSERT INTO eg_anonyme (action, genre, age, ville_id, distribution, periode, email) VALUES (?, ?, ?, ,? ,? ,? ,?)');
                        


                        As tu remarqué, par exemple... que tu avais deux virgules qui se suivent sans "?" à l'intérieur ??
                    2. Merci pour la virgule, mais cela ne change pas grand chose, voici le nouveau message d'erreur :

                      1. Modérateur
                        Il faut absolument que tu ajoutes du "debug" à tes instructions pour déterminer d'où vient le souci..

                        Essayes donc ceci :
                        $sql = "INSERT INTO eg_anonyme 
                                (action, genre, age, ville_id, distribution, periode, email) 
                              VALUES (?,?,?,?,?,?,?,?)";
                        $array_params = array(
                                        "sis"
                          , $action
                          , $genre
                          , $age
                          , $ville_id
                          , $distribution
                          , $periode
                          , $email
                          );
                           
                        $req_pre = mysqli_prepare($bdd,$sql) or die(mysqli_error($bdd));
                        
                        mysqli_stmt_bind_param($req_pre, join(',',$array_params))  or die(mysqli_error($bdd));
                        
                        mysqli_stmt_execute($req_pre)or die(mysqli_error($bdd));
                        


                        Au passage... la première variable de l'array ( "sis" ) .. est sensée correspondre aux types de valeurs que tu vas passer dans ta requête.
                        Hors... je vois 8 variables... et seulement 3 lettres.....
                        Je pense que tu devrais refaire un tour ici pour comprendre : https://www.php.net/manual/fr/mysqli-stmt.bind-param.php

                        Cordialement,
                        Jordane
                        1. @Jordane 45

                          Avec ton script, je n'ai plus les tableaux d'erreur, mais ce message :

                          Unknown column 'ville_id' in 'field list'

                          MAIS : le reste de ma page ne s'affiche pas...

                          ET la base de données et la table eg_anonyme n'enregistre RIEN...

                          A propos de "SIS"

                          Dois mettre : SSIISSS pour

                          Caractères - champs - réponse possible

                          s - action -agir
                          s - genre - h
                          i - age - 59
                          i - ville_id - 12
                          s - distribution - oui
                          s - période - mai-juin
                          s - email - omrce@agir.com
                          1. Modérateur
                            Normal que rien ne s'affiche après le message d'erreur. .. je t'ai fait mettre des DIE....
                            et pour ce qui est du message d'erreur. .il est assez clair non ??!!.. tu n'as aucune colonne dans ta table qui se nomme ville_id.
                        2. Après correction, nouveau message d'erreur :

                          1. Modérateur
                            Tu peux poster ton code ?
                        3. $sql = "INSERT INTO eg_anonyme (action, genre, age, ville_id, distribution, periode, email) VALUES (?,?,?,?,?,?,?)";
                          		$array_params = array("ssiisss"
                          					, $action
                          					, $genre
                          					, $age
                          					, $ville_id
                          					, $distribution
                          					, $periode
                          					, $email);
                          								 
                          $req_pre = mysqli_prepare($bdd,$sql) or die(mysqli_error($bdd));
                          						
                          mysqli_stmt_bind_param($req_pre, $array_params)  or die(mysqli_error($bdd));
                          						
                          mysqli_stmt_execute($req_pre)or die(mysqli_error($bdd));
                          
                          
                          
                          
                          1. Modérateur
                            C'est bien ce qui me semblait. ...
                            compare ton code avec celui quie j'ai posté sur le forum...

                            je n'ai pas laissé l'Array tel quel.
                        4. J'imagine que tu veux parler de "sis" ?

                          Si je le remet tel quel, cela ne change pas, j'ai tjrs le message d'erreur...
                          1. Modérateur

                            J'imagine que tu veux parler de "sis" ?

                            Non

                            Regardes ce que tu as écris à la ligne :
                            mysqli_stmt_bind_param($req_pre, $array_params)  or die(mysqli_error($bdd));				
                            

                            Et moi :
                            mysqli_stmt_bind_param($req_pre, join(',',$array_params))  or die(mysqli_error($bdd));
                            
                          2. @jordane45Bonjour

                            join(',',$array_params) ne fait pas la même chose que d'écrire n paramètres séparés par des virgules. join génère une seule chaîne.
                            En fait, l'écriture originale
                            mysqli_stmt_bind_param($req_pre, "sis", $action, $genre, $age, $ville_id, $distribution, $periode, $email);
                            , après correction du "sis", était la bonne.
                        5. Le dénouement approche et j'espère que le héros ne meurt pas à la fin du film...

                          @Jordane45, en procédant à la correction le message d'erreur demeure...

                          @le père, en faisant correction, c-à-d en revenant à l'original j'ai les messages ci-dessous...
                          Corriger le SIS est-ce que cela veut dire le remplacer par "ssiisss" ?

                          1. Eh ben, on dirait bien que le héros meurt à la fin du film.

                            je vais être obligé de revenir à MysQl, au moins là, mes script fonctionnent...

                            Jusqu'ici tout va bien ...