3

私は mysql c api、特に mysql_real_escape_string 用のクラス ラッパーを構築していますが、それを正しく行っているとは思いません。

これは私が関数のために持っているものです:

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

これを実行してみましたが、期待どおりに実行されず、mysql エラーで終了しました。

4

1 に答える 1

2

は、私にはよく見えますよ。データベースの問題は別の場所にあると思われます。

Database::EscapeString確認する簡単な方法があります。一時的にダミー関数に置き換えます。

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

次に、同じエラーが発生するかどうかを確認します。

編集:エラーが何であるか、またはそれを引き起こしているクエリが何であるかを正確に知らないため、問題を絞り込むのは困難です。以下のことを試してみてください。

A) エスケープする必要があるすべての文字を取り除くだけです。偽のデータをデータベースに入れますが、うまくいけば、とにかくテストしているだけです:

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) 他の場所でエラーを探します。Database::Execute は適切にコーディングされていますか? たぶんsnprintf、ハードコードされたバッファサイズで内部的に実行します(これを超えている可能性があります)

C) デバッグ出力を取得して、それを mysql クライアント プログラムに直接入力してみてください (最後にセミコロンを忘れずに)。同じエラー?

于 2009-11-29T01:41:28.880 に答える