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 回答