Frage

Ich baue eine Klasse Wrapper für den MySQL-C-api, und zwar zur Zeit für mysql_real_escape_string und ich glaube nicht, dass ich es ganz richtig mache.

das ist, was ich für die Funktion haben:

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;
}

Ich habe versucht, dies durch läuft, aber es nicht durchführen, wie erwartet und endete in mysql Fehler.

War es hilfreich?

Lösung

Sieht mir gut. Ich vermute, dass Ihre Datenbank Problem an anderer Stelle ist.

Es gibt eine einfache Möglichkeit zu überprüfen: vorübergehend Database::EscapeString mit einer Dummy-Funktion ersetzen, das heißt

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

Dann, wenn Sie die gleichen Fehler erhalten.

Bearbeiten : Nicht zu wissen, genau das, was der Fehler ist, oder das, was die Abfrage verursacht es ist, ist es schwierig, das Problem zu verengen. Hier sind einige Dinge zu versuchen:

A) Gerade alle Zeichen loszuwerden, die entwertet werden müßten. Es wird falsche Daten in die Datenbank gestellt, aber hoffentlich sind Sie nur testen sowieso:

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) an anderer Stelle für Fehler suchen. Ist Datenbank :: Execute gut codiert? Vielleicht tut es ein snprintf intern mit einer fest codierten Puffergröße (die Sie überschreiten werden können)

C) Versuchen Sie Ihre Debug-Ausgabe zu nehmen und es direkt in das MySQL-Client-Programm eingeben (vergessen Sie nicht, ein Semikolon am Ende zu setzen). Gleiche Fehler?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top