IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Prepared statement en C pour MySQL


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 48
    Par défaut Prepared statement en C pour MySQL
    Bonjour,
    Voilà j'ai cru comprendre que pour faire passer des argument dans un mysql_query (avec la lib mysql) il fallait faire du prepared statement.
    Alors je me suis documenté et j'en suis arrivé à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    mysql_prepare(mysql, "CREATE USER 'log = ?'@'%' IDENTIFIED BY 'pwd = ?'");
    mysql_stmt_bind_param(mysql, log);
    mysql_stmt_bind_param(mysql, pwd);
    mysql_stmt_execute(mysql);
    Ensuite arrivé au moment fatidique (la compile), j'obtiens un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /var/tmp//cc6varSI.o(.text+0xb2): In function `main':
    : undefined reference to `mysql_prepare'
    Alors voilà si quelqu'un pourrait m'orienter sur le prepared statement ?
    Merci

  2. #2
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Salut,

    Je ne connais pas l'API mysql, mais selon le prototype de mysql_prepare() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MYSQL_STMT * mysql_prepare(MYSQL *mysql, const char *query, unsigned long length)
    je dirais qu'il te manque un parametre celui pour la longueur de la requête ? non ?

    @++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 48
    Par défaut
    Exact c'est possible.
    Mais de toute maniere il ne reconnait pas cette fonction. Et je ne vois pas pourquoi..

  4. #4
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par jenova Voir le message
    Exact c'est possible.
    Mais de toute maniere il ne reconnait pas cette fonction. Et je ne vois pas pourquoi..
    OK, vérifie que tu as bien inclus le header, ainsi que :
    lors de la compilation si tu utilises gcc bien-sûr...j'espère que sa résoudra ton problème

    @++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 48
    Par défaut
    Oui oui c'est bien fait.
    Il ne m'embetait pas avant que j'essai de faire du prepared statement.
    C'est pour celà que ça me parait bizarre, il vient m'embeter seulement pour mysql_prepare();

  6. #6
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Bon je n'ai plus qu'à te conseiller d'exécuter un code tiré du "MySQL Manual" utilisant cette fonction, pour ainsi être sûr que ce n'est pas un problème d'inclusion .
    Voici le lien vers la page du code fournis en dessous
    Code 19.1.7.3 mysql_execute() : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
    #define STRING_SIZE 50
     
    #define DROP_SAMPLE_TABLE "DROP TABLE IF EXISTS test_table"
    #define CREATE_SAMPLE_TABLE "CREATE TABLE test_table(col1 INT,\
                                                     col2 VARCHAR(40),\
                                                     col3 SMALLINT,\
                                                     col4 TIMESTAMP)"
    #define INSERT_SAMPLE "INSERT INTO test_table(col1,col2,col3) VALUES(?,?,?)"
     
    MYSQL_STMT    *stmt;
    MYSQL_BIND    bind[3];
    my_ulonglong  affected_rows;
    int           param_count;
    short         small_data;
    int           int_data;
    char          str_data[STRING_SIZE];
    unsigned long str_length;
    my_bool       is_null;
     
    if (mysql_query(mysql, DROP_SAMPLE_TABLE))
    {
      fprintf(stderr, " DROP TABLE failed\n");
      fprintf(stderr, " %s\n", mysql_error(mysql));
      exit(0);
    }
     
    if (mysql_query(mysql, CREATE_SAMPLE_TABLE))
    {
      fprintf(stderr, " CREATE TABLE failed\n");
      fprintf(stderr, " %s\n", mysql_error(mysql));
      exit(0);
    }
     
    /* Prepare an INSERT query with 3 parameters */
    /* (the TIMESTAMP column is not named; it will */
    /* be set to the current date and time) */
    stmt = mysql_prepare(mysql, INSERT_SAMPLE, strlen(INSERT_SAMPLE));
    if (!stmt)
    {
      fprintf(stderr, " mysql_prepare(), INSERT failed\n");
      fprintf(stderr, " %s\n", mysql_error(mysql));
      exit(0);
    }
    fprintf(stdout, " prepare, INSERT successful\n");
     
    /* Get the parameter count from the statement */
    param_count= mysql_param_count(stmt);
    fprintf(stdout, " total parameters in INSERT: %d\n", param_count);
     
    if (param_count != 3) /* validate parameter count */
    {
      fprintf(stderr, " invalid parameter count returned by MySQL\n");
      exit(0);
    }
     
    /* Bind the data for all 3 parameters */
     
    /* INTEGER PARAM */
    /* This is a number type, so there is no need to specify buffer_length */
    bind[0].buffer_type= MYSQL_TYPE_LONG;
    bind[0].buffer= (char *)&int_data;
    bind[0].is_null= 0;
    bind[0].length= 0;
     
    /* STRING PARAM */
    bind[1].buffer_type= MYSQL_TYPE_VAR_STRING;
    bind[1].buffer= (char *)str_data;
    bind[1].buffer_length= STRING_SIZE;
    bind[1].is_null= 0;
    bind[1].length= &str_length;
     
    /* SMALLINT PARAM */
    bind[2].buffer_type= MYSQL_TYPE_SHORT;
    bind[2].buffer= (char *)&small_data;       
    bind[2].is_null= &is_null;
    bind[2].length= 0;
     
    /* Bind the buffers */
    if (mysql_bind_param(stmt, bind))
    {
      fprintf(stderr, " mysql_bind_param() failed\n");
      fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
      exit(0);
    }
     
    /* Specify the data values for the first row */
    int_data= 10;             /* integer */
    strncpy(str_data, "MySQL", STRING_SIZE); /* string  */
    str_length= strlen(str_data);
     
    /* INSERT SMALLINT data as NULL */
    is_null= 1;
     
    /* Execute the INSERT statement - 1*/
    if (mysql_execute(stmt))
    {
      fprintf(stderr, " mysql_execute(), 1 failed\n");
      fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
      exit(0);
    }
     
    /* Get the total number of affected rows */   
    affected_rows= mysql_stmt_affected_rows(stmt);
    fprintf(stdout, " total affected rows(insert 1): %ld\n", affected_rows);
     
    if (affected_rows != 1) /* validate affected rows */
    {
      fprintf(stderr, " invalid affected rows by MySQL\n");
      exit(0);
    }
     
    /* Specify data values for second row, then re-execute the statement */
    int_data= 1000;             
    strncpy(str_data, "The most popular open source database", STRING_SIZE); 
    str_length= strlen(str_data);
    small_data= 1000;         /* smallint */
    is_null= 0;               /* reset */
     
    /* Execute the INSERT statement - 2*/
    if (mysql_execute(stmt))
    {
      fprintf(stderr, " mysql_execute, 2 failed\n");
      fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
      exit(0);
    }
     
    /* Get the total rows affected */   
    affected_rows= mysql_stmt_affected_rows(stmt);
    fprintf(stdout, " total affected rows(insert 2): %ld\n", affected_rows);
     
    if (affected_rows != 1) /* validate affected rows */
    {
      fprintf(stderr, " invalid affected rows by MySQL\n");
      exit(0);
    }
     
    /* Close the statement */
    if (mysql_stmt_close(stmt))
    {
      fprintf(stderr, " failed while closing the statement\n");
      fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
      exit(0);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quel est le meilleur client graphique pour MySQL ?
    Par Community Management dans le forum MySQL
    Réponses: 205
    Dernier message: 20/06/2023, 11h01
  2. Jdbc & mysql. Prepared statement
    Par SyntetikSynapse dans le forum JDBC
    Réponses: 3
    Dernier message: 14/06/2012, 16h37
  3. composant pour BDD pour MySQL
    Par aragom dans le forum Bases de données
    Réponses: 4
    Dernier message: 26/03/2005, 14h18
  4. aide pour Mysql++
    Par ktmracing dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 15/03/2005, 10h10
  5. [C#] [MySQLDriverCS] et [ByteFX] drivers .Net pour MySql
    Par |DUCATI| DesMo dans le forum Windows Forms
    Réponses: 61
    Dernier message: 26/11/2004, 00h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo