Question

Je construis un wrapper de classe pour l'API mysql c, en particulier pour le moment avec mysql_real_escape_string et je ne pense pas que je le fasse correctement.

voici ce que j'ai pour la fonction:

std::string Database::EscapeString(const char *pStr)
{
    char *tStr = new char[strlen(pStr)*2+1];
    mysql_real_escape_string(m_sqlCon, tStr, pStr, strlen(pStr));
    string retStr(tStr);
    delete [] tStr;
    return retStr;
}

J'ai essayé de l'exécuter mais cela n'a pas fonctionné comme prévu et s'est terminé par des erreurs mysql.

Était-ce utile?

La solution

Ça me va. Je soupçonne que votre problème de base de données est ailleurs.

Il existe un moyen simple de vérifier: remplacez temporairement Database :: EscapeString par une fonction fictive, c'est-à-dire.

std::string Database::EscapeString(const char *pStr) {return string(pStr);}

Ensuite, voyez si vous obtenez les mêmes erreurs.

Modifier : Ne sachant pas exactement quelle est l'erreur ou la requête qui la cause, il est difficile de circonscrire le problème. Voici quelques choses à essayer:

A) Supprimez simplement tous les caractères qui auraient besoin d’être échappés. Cela mettra de fausses données dans la base de données, mais j'espère que vous ne faites que tester de toute façon:

std::string Database::EscapeString(const char *pStr) {
    string result;
    while (*pStr) {
        if (strchr("\"'\r\n\t",*pStr))
        {
            //bad character, skip
        }
        else
        {
            result.push_back(*pStr);
        }
        ++pStr;
    }
    return result;
}

B) Recherchez les erreurs ailleurs. Est-ce que Database :: Execute est bien codé? Peut-être qu’il fait un snprintf en interne avec une taille de tampon codée en dur (que vous pouvez éventuellement dépasser)

C) Essayez de prendre votre sortie de débogage et de la saisir directement dans le programme client mysql (n'oubliez pas de mettre un point-virgule à la fin). Même erreur?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top