我正在为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