2009-11-29 129 views
2

我正在为mysql c api构建一个类包装,特别是在mysql_real_escape_string的时刻,我不认为我做得很对。C++ 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错误?你有没有尝试使用printf或cout打印结果字符串(包括tStr和retStr),然后再将它们送入mysql?结果是什么? – 2009-11-29 01:39:20

回答

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客户端程序中(不要忘记在末尾添加分号)。同样的错误?

+0

当/如果你这样做,确保你传入的字符串不包含任何需要转义的字符(例如引号) – Managu 2009-11-29 01:42:33

+0

当不使用mysql_real_escape_string时,我得到相同类型的错误,但在字符串的不同位置。 Erorr: 20:46:36 E数据库:数据库查询失败:您的SQL语法中有错误 ;请检查与您的MySQL服务器版本对应的手册,以便yntax可以使用在附近的领先设计团队中,并在下一个较低的ranking支持人员处混合使用 – Undawned 2009-11-29 01:48:18

+0

需要引用该字符串。例如。 “INSERT INTO表(string_column)VALUES(somebodys领先的设计团队,担心下一个排名较低的支持人员担忧)”是无效的SQL。 – Managu 2009-11-29 01:51:40