c++ Mysql C API mysql_real_escape_string

4

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


1
具体是什么MySQL错误导致的?您在将它们输入MySQL之前,尝试过使用printf或cout打印生成的字符串(tStr和retStr)吗?结果如何? - Daniel Bingham
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客户端程序(不要忘记在结尾处加上分号)。还是出现相同的错误?


当/如果你这样做,请确保传递的字符串不包含任何需要转义的字符(例如引号)。 - Managu
当不使用mysql_real_escape_string时,我会在字符串的不同位置收到相同类型的错误。错误:20:46:36 E 数据库:数据库查询失败:您的SQL语法有误;请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法,位于第1行附近“s leading design team, mixed with fear among the next lower ranking support staf”。 - Undawned
引用字符串和转义字符串是两个不同的过程。 - Managu
对我来说似乎不是问题。我已经对我的答案做了一些修改。 - Managu
啊,谢谢您先生,您选了C选项,一针见血。 我的缓冲区最初太小了(1024),当问题出现时我改变了这个值,但忘记在sprintf位置更改第二个引用的值。 - Undawned
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接