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

Langage C++ Discussion :

Étrange erreur de mysql_query()


Sujet :

Langage C++

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut Étrange erreur de mysql_query()
    Bonjour à tous !

    J'ai intégrer une petite base de donnée à mon programme, celle-ci fonctionne, je parviens à m'y connecter, à y rechercher une information et à ajouter des informations mais il semble y avoir un étrange problème lorsqu'on change la manière de créer un string pour mysql_query().

    en image: http://img443.imageshack.us/img443/4219/bugbo.png

    ou

    Code C++ : 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
    std::string SqlManager::commandInsertCharacter(const sf::String& characterName, const unsigned int& idLogin)
    {
        std::ostringstream id;
        id<<idLogin;
        sf::String sfstr(id.str());
     
        std::string str;
        str+=("INSERT INTO `game`.`characters` (`id`, `name`, `creation`, `login`) VALUES (NULL, '");
        str+=characterName.toAnsiString();
        str+="', '";
        //str+=getDate(); //-----------BUG
        str+="2013-02-01"; //-----------FONCTIONNE
        str+=" ";
        //str+=this->getTime(); //-----------BUG
        str+="03:03:02"; //-----------FONCTIONNE
        str+="', '";
        str+=sfstr.toAnsiString();
        str+="')";
        return str;
    }
     
    std::string SqlManager::getDate()
    {
        return "2013-02-01";
    }
     
    std::string SqlManager::getTime()
     
    {
        return "03:03:02";
    }
     
    std::string str= commandInsertCharacter(characterName, idLogin);
    std::cout<<str<<std::endl;
    if(!mysql_query(&mysql, str.c_str())){
       std::cout<<"AFFECTED"<<std::endl;
    }
    else{
       std::cout<<"MANGE DES CHIPS"<<std::endl;
    }


    Lorsque je lance mon programme il plante lorsque j'utilise soit getDate() soit getTime() soit les deux. Alors qu'ils ne font que retourner exactement le même string que si je ne les appellais pas.

    Mon programme n'affiche alors que:

    std::cout<<str<<std::endl;
    mais pas le
    "AFFECTED" ni "MANGE DES CHIPS" vu qu'il plante sur la condition.

    mais ne plante pas et ajoute correctement ce que je demande si je n'appel pas les fonctions.



    Une erreur de conversion lors d'un return ?

    Merci, je ne parviens pas à comprendre =(

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    C'est plus un problème de c++.
    Sinon, du manière générale il est préférable d'utiliser des variables de liaisons (avec prepare_statement) ce qui en plus limitera les problèmes de convertions liés à la concaténation lors de la construction de la requête :
    MySQL Connector/C++
    C API Prepared Statement Function Descriptions

    Ou alors sur la doc de la librairie utilisée.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 127
    Par défaut
    Bonjour,

    comme le dit skuatamad, c'est un pb de C++, pour être précis de conversion de type.

    Tu utilise l'opérateur '+' pour concaténer, mais en C++, cet opérateur possède des définitions standard très strictes.

    Pour concaténer des string, il attend un "const string&" et non pas un "string" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string& operator+= (const string& str);
    Il faut donc que tes méthodes comme getDate() retourne un 'const string&'.
    Mais tu as intérêt quand même à suivre le conseil de skuatamad.
    Cordialement

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Juste pour savoir, puisque tu utilises judicieusement un ostringstream pour obtenir l'identifiant, pourquoi ne pas en avoir fait autant pour la requete?

    Cela bien sûr, n'annule en rien la recommandation d'utiliser prepare_statement, pour des raisons de sécurité, entre autre.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut
    Citation Envoyé par semaphore1984 Voir le message
    Pour concaténer des string, il attend un "const string&" et non pas un "string" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string& operator+= (const string& str);
    Il faut donc que tes méthodes comme getDate() retourne un 'const string&'
    Malheureusement, retourner un const string& signifie retourner une valeur temporaire et donc le string tiré au final est erroné.


    ______________________________________________________________

    Citation Envoyé par leternel Voir le message
    Juste pour savoir, puisque tu utilises judicieusement un ostringstream pour obtenir l'identifiant, pourquoi ne pas en avoir fait autant pour la requete?
    Je viens de changer mon code de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    std::string SqlManager::commandInsertCharacter(const sf::String& characterName, const unsigned int& idLogin)
    {
        std::ostringstream str;
     
        str<<"INSERT INTO `game`.`characters` (`id`, `name`, `creation`, `login`) VALUES (NULL, '"<<characterName.toAnsiString()<<"', '";
     
        std::string date(getDate());
        str<<date<<" ";
     
        std::string time(getTime());
        str<<time<<"', '"<<idLogin<<"')";
        return str.str();
    }
    avec donc mes deux get..() que je ne vous avais pas montré au complet.

    Code : 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
    const std::string SqlManager::getDate()
    {
        timestamp=time(NULL);
        t=localtime(&timestamp);
        std::ostringstream clock;
        //-------------------------- Years
        clock<<1900+t->tm_year<<"-";
        //-------------------------- Mondays
        if(t->tm_mon+1 < 10){
            clock<<"0";
        }
        clock<<t->tm_mon+1<<"-";
        //-------------------------- Days
        if(t->tm_mday < 10){
            clock<<"0";
        }
        clock<<t->tm_mday;
        //--------------------------
        return clock.str();
    }
     
    const std::string SqlManager::getTime()
    {
        timestamp=time(NULL);
        t=localtime(&timestamp);
        std::ostringstream clock;
        //-------------------------- Hours
        if(t->tm_hour < 10){
            clock<<"0";
        }
        clock<<t->tm_hour<<":";
        //-------------------------- Minutes
        if(t->tm_min < 10){
            clock<<"0";
        }
        clock<<t->tm_min<<":";
        //-------------------------- Seconds
        if(t->tm_sec < 10){
            clock<<"0";
        }
        clock<<t->tm_sec;
        //--------------------------
        return clock.str();
    }
    Le problème persiste, il semblerait donc que ça ne vient pas de l'opération "+=string" mais plutôt de "ostringstream" car elle était déjà présente auparavant et c'est la seule encore présente actuellement.



    ______________________________________________________________

    Citation Envoyé par skuatamad Voir le message
    C'est plus un problème de c++.
    Sinon, du manière générale il est préférable d'utiliser des variables de liaisons (avec prepare_statement) ce qui en plus limitera les problèmes de convertions liés à la concaténation lors de la construction de la requête :
    MySQL Connector/C++
    C API Prepared Statement Function Descriptions

    Ou alors sur la doc de la librairie utilisée.
    Je ne connais pas du tout cette méthode, je débute dans le domaine. Merci de l'info, j'y jette un coup d'oeil !

    EDIT: Quelques fautes.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut
    Peut être existe-t-il un moyen de contourner le problème?

    Enfaite j'aimerais simplement enregistrer la date et l'heure de la création mais je n'ai pas trouvé le moyen de le faire automatiquement par Mysql.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 127
    Par défaut
    Re-Bonjour Roddvb,

    Bon, ma solution était un peu abrégée, il ne suffisait pas de mettre const string reférence comme retour de la fonction,
    Il faut que la signature de ta fonction soit du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::string& SqlManager::getDate() const
    Et la valeur retournée doit être une valeur non locale, soit une variable statique, soit membre de SqlManager, sous peine de référence indéfinie.

    Mais si ton problème est seulement de mettre la date et l'heure courante dans ta colonne création, pourquoi ne pas utiliser un trigger sur la table comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TRIGGER `basetestb`.`T_STAMPE` BEFORE INSERT
        ON basetestb.deslogin FOR EACH ROW
    BEGIN
        SET NEW.creation = TIMESTAMP();
    END;
    Bien sûr, la date enregistrée sera celle du serveur, pas une date distante

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 11
    Par défaut
    Merci beaucoup, j'ai utilisé le déclencheur de Mysql pour contourner le problème et ça marche niquel

    Cloturé!

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/12/2009, 09h46
  2. [threads]étrange erreur à la compilation.
    Par méphistopheles dans le forum Boost
    Réponses: 3
    Dernier message: 02/06/2009, 18h22
  3. [php_writexcel] étrange erreur dans une boucle
    Par Mushu74 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 02/06/2009, 10h48
  4. Gestion des erreurs avec "mysql_query"
    Par bernylap dans le forum Langage
    Réponses: 1
    Dernier message: 15/12/2008, 20h52
  5. Erreur MySQL étrange: erreur 1062 avec update
    Par lysandre dans le forum Requêtes
    Réponses: 3
    Dernier message: 29/02/2008, 00h48

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