Domanda

Sto costruendo un wrapper di classe per mysql c api, in particolare al momento per mysql_real_escape_string e non credo di farlo nel modo giusto.

questo è quello che ho per la funzione:

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

Ho provato a eseguirlo ma non ha funzionato come previsto e si è concluso con errori mysql.

È stato utile?

Soluzione

Mi sta bene. Sospetto che il tuo problema con il database sia altrove.

Esiste un modo semplice per verificare: sostituire temporaneamente Database :: EscapeString con una funzione fittizia, ad esempio

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

Quindi vedi se ricevi gli stessi errori.

Modifica : Non sapendo esattamente quale sia l'errore o quale sia la query che lo causa, è difficile restringere il problema. Ecco alcune cose da provare:

A) Basta sbarazzarsi di tutti i personaggi che dovrebbero essere evasi. Inserirà dati fasulli nel database, ma spero che tu stia testando comunque:

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) Cerca errori altrove. Database :: Execute è ben codificato? Forse esegue un snprintf internamente con una dimensione del buffer hardcoded (che potresti superare)

C) Prova a prendere l'output di debug e immetterlo direttamente nel programma client mysql (non dimenticare di mettere un punto e virgola alla fine). Stesso errore?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top