Partage
  • Partager sur Facebook
  • Partager sur Twitter

Insert into with sprintf

Sujet résolu
    28 juin 2022 à 15:17:23

    Bonjour, 

    J'ai un problème pour insérer des variables dans ma table sql.

    Lorsque je remplace les variables par des chaînes de caractères, la requête fonctionne, sinon elle ne fonctionne pas. 

    Veuillez m'aider. Je suis en difficulté  

    Voila mon code: 

     char *seq;

        char *name;

        char *id;

        char *espece;

        char simulationn[];

        char inhibitionn[];

    ..............

    char query[3000];

    sprintf(query,"INSERT INTO pro (`id`, `nom`,`espece`, `sequence`,`simulation`,`inhibition`) VALUES ('%s','%s','%s','%s','%s','%s');",id,name,espece,seq,simulationn,inhibitionn);

    if(mysql_query(conn, query)!=0){

         printf("\n error");

    }else {

           printf("\n Rows were insert \n");

    }

    • Partager sur Facebook
    • Partager sur Twitter
      28 juin 2022 à 15:58:38

      1. Ce que tu montres, c'est ce qui marche, ce qui marche pas, les deux ou aucun ?

      2. Qu'est ce que que tu penses déclarer quand tu écris

      char truc[];

      ?

      3. Printf construit une chaîne de caractères. La faire afficher pour voir ce qu'il y a dedans.

      4. Les requêtes préparées sont préférables aux requêtes construites dynamiquement.

      -
      Edité par michelbillaud 28 juin 2022 à 16:03:33

      • Partager sur Facebook
      • Partager sur Twitter
        28 juin 2022 à 16:39:56 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


          28 juin 2022 à 16:47:11

          Bonjour,

          Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
          Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

          Pour plus d'informations, nous vous invitons à lire les règles générales du forum

          Merci de colorer votre code à l'aide du bouton Code

          Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.

          En image le bouton code, cela donne :

          Liens conseillés

          • Partager sur Facebook
          • Partager sur Twitter
            28 juin 2022 à 16:51:04

            Utilises le bouton code </> du forum pour poster ton code ! (tu peux modifier ton post, lien modifier en haut à droite du post).

            marwamokni1 a écrit:

            Lorsque je mets char truc[], parce que le taille de la chaîne n'est pas connu. Il un traitement qui sera effectué qui rempli par la suite la chaine de caractère.

            Et oui, mais c'est pas comme cela que ça marche ! Parce que tu ne peux rien mettre dans un tableau qui n'a pas de dimension !
            Normalement, tu devrais avoir une erreur, car ce n'est pas permit.
            • Partager sur Facebook
            • Partager sur Twitter
            ...
              28 juin 2022 à 16:53:27

              Bonjour 

              1- le code qui ne marche pas

              2- 

              char truc[];

              il s'agit d'une chaîne dont je ne connais pas la taille à l'avance.

              3- bien évidement

              4- oui  

              • Partager sur Facebook
              • Partager sur Twitter
                28 juin 2022 à 17:03:07

                2) J'ai bien compris, mais tu ne peux pas faire cela, il te faut une taille pour ton tableau, alors donne lui une taille suffisamment grande pour contenir ta chaîne !
                • Partager sur Facebook
                • Partager sur Twitter
                ...
                  28 juin 2022 à 19:16:12

                  je n'ai pas d'erreur et le code marche bien !

                  il y a que la requête qui ne marche pas 

                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 juin 2022 à 19:17:39

                    Est-ce que tu connais à l'avance la taille maximale possible qu'aura la chaîne de caractères ? Par exemple si ce sont des mots du dictionnaire, on met la taille de « anticonstitutionnellement ».
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 juin 2022 à 19:32:35

                      marwamokni1 a écrit:

                      je n'ai pas d'erreur (....)

                      Ah bon ?

                      int main(void) {
                      	char truc[];
                      	
                      	return(0);
                      }
                      sp.c: In function 'main':
                      sp.c:2:7: error: array size missing in 'truc'
                        char truc[];
                             ^~~~
                      

                      en compilant avec gcc.



                      -
                      Edité par edgarjacobs 28 juin 2022 à 19:34:51

                      • Partager sur Facebook
                      • Partager sur Twitter

                      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                        28 juin 2022 à 19:39:25

                        Je vous remercie!

                        Lorsque j'ajoute une taille, la requête est bien remplie mais une erreur sql apparaît. 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 juin 2022 à 19:41:52

                          marwamokni1 a écrit:

                          (....) Lorsque j'ajoute une taille, la requête est bien remplie mais une erreur sql apparaît. 

                          Alors, ce n'est plus un problème de C. Mais il y a pas mal de gens qui connaissent sql. Tu auras peut-être un réponse .... en donnant l'erreur sql retournée.

                          -
                          Edité par edgarjacobs 28 juin 2022 à 19:42:58

                          • Partager sur Facebook
                          • Partager sur Twitter

                          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                            28 juin 2022 à 19:48:13

                            Cela fonctionne !! merci bcppp

                            en fait, j'ai oublié d'activer le serveur sql

                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 juin 2022 à 23:45:06

                              Si  char truc[] est dans un déclaration de paramètre d'une fonction, ça peut "marcher" (= compiler sans erreur), exemple

                              void afficher(char message[])
                              {
                                 printf("message = %s\n", message);
                              }
                              

                              parce que dans ce cas précis, la déclaration est équivalente à celle d'un pointeur

                              void afficher(char *message)

                              ce qui est une bizarrerie historique du langage C.

                              Dans ton message rien ne le laissait deviner (et là je suis obligé d'induire un contexte dans lequel tu peux avoir raison de dire "je n'ai pas d'erreur", en supposant en plus que tu parles de la compilation du source.

                              Si tu montrais ton code en entier, ça éviterait de perdre du temps à tout le monde, nous à te signaler des trucs bizarres, et toi à partir sur des fausses pistes.



                              -
                              Edité par michelbillaud 29 juin 2022 à 13:18:51

                              • Partager sur Facebook
                              • Partager sur Twitter
                                29 juin 2022 à 0:41:21

                                marwamokni1 a écrit:

                                Voila mon code: ...

                                    char simulationn[];

                                    char inhibitionn[];

                                Il n'y a pas d’ambiguïtés !

                                • Partager sur Facebook
                                • Partager sur Twitter
                                ...
                                  29 juin 2022 à 6:38:35

                                  Le code ne va pas marcher avec les gens dont  par exemple, le nom contient une apostrophe. Monsieur  N'Diaye ne va pas être content.

                                  -
                                  Edité par michelbillaud 29 juin 2022 à 9:32:35

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    29 juin 2022 à 7:55:05

                                    N'utilise pas sprintf pour faire des requêtes SQL, c'est la porte ouvertes aux injections. Utilise la vraie API du SGBD en question (et en général ils offrent des prepared statements).

                                    En l'occurence avec MySQL.

                                    -
                                    Edité par markand 29 juin 2022 à 11:02:51

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    git is great because Linus did it, mercurial is better because he didn't.

                                      29 juin 2022 à 10:10:35

                                      @michelbillaud:

                                      Le code ne va pas marcher avec les gens dont par exemple, le nom contient une apostrophe. Monsieur N'Diaye ne va pas être content.

                                      Le caractère délimiteur utilisé est l'accent grave ` (AltGr-7 sur nos claviers français) et pas l'apostrophe.

                                      Cela dit, markand a raison, cela serait plus sûr d’utiliser les fonctions plus sécurisées.

                                      Cet exemple montre comment utiliser les prepared statements pour une requête INSERT avec 3 valeurs à insérer, liées à la requête avec les fonctions "mysql_stmt_xxx" : https://dev.mysql.com/doc/c-api/8.0/en/mysql-stmt-execute.html

                                      Comme le montre l'exemple, c'est une grosse galère à utiliser en C :-)

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        29 juin 2022 à 13:12:44

                                         @Dlks

                                         > Le caractère délimiteur utilisé est l'accent grave ` (AltGr-7 sur nos claviers français) et pas l'apostrophe.

                                        Dans les VALUES, il s'agit bien d'apostrophes

                                        printf(query, "INSERT INTO pro (`id`, `nom`,`espece`, `sequence`,`simulation`,`inhibition`)"  
                                                      "VALUES ('%s','%s','%s','%s','%s','%s');",            //  <--- ici

                                        > Comme le montre l'exemple, c'est une grosse galère à utiliser en C :-)

                                        Mais quel idée de vouloir utiliser C pour un programme qui accède à une base de données, et aura donc vraisemblablement besoin de chaînes de caractères, qui n'existent pas vraiment en C. Ca et l'UTF-8...

                                        -
                                        Edité par michelbillaud 29 juin 2022 à 13:18:01

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          29 juin 2022 à 13:25:44

                                          michelbillaud a écrit:

                                          Mais quel idée de vouloir utiliser C pour un programme qui accède à une base de données, et aura donc vraisemblablement besoin de chaînes de caractères, qui n'existent pas vraiment en C. Ca et l'UTF-8...


                                          Est-ce réservé à un langage précis alors ?

                                          Je vois pas où est le soucis des chaînes de caractères, à part si l'OP les fabrique caractère par caractère tout est transparent. S'il utilise par exemple, fgets pour récupérer une chaine de son terminal et que son environnement est en UTF-8, alors en base il y aura une chaîne en UTF-8. En réalité pour être UTF-8 friendly il y a pas grand chose à faire.

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          git is great because Linus did it, mercurial is better because he didn't.

                                            30 juin 2022 à 8:53:23

                                            > à part si l'OP les fabrique caractère par caractère tout est transparent.

                                            Hélas, il faut leur réserver explicitement une taille. et bien sûr vérifier partout qu'on ne tente jamais de la dépasser. Et prendre les mesures préventives au cas où. Emmerdements en cascade.

                                            > En réalité pour être UTF-8 friendly il y a pas grand chose à faire.

                                            Exemple, passer une chaine UTF-8 en majuscules, genre "Nguyễn Tất Thành" en "trimmant" les espaces au bout et supprimant ceux qui sont en doublon ?  C'est pas impossible en C, c'est juste hyper-pénible.

                                            -
                                            Edité par michelbillaud 30 juin 2022 à 8:55:30

                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Insert into with sprintf

                                            × 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