質問

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エラーで終了しました。

役に立ちましたか?

解決

よさそうだ。データベースの問題は別の場所にあると思われます。

確認する簡単な方法があります。一時的に 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クライアントプログラムに直接入力してみてください(最後にセミコロンを入れることを忘れないでください)。同じエラー?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top