首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++ MFC程序中使用mysql查询中的变量

问在C++ MFC程序中使用mysql查询中的变量
EN

Stack Overflow用户
提问于 2010-04-25 19:53:18
回答 1查看 2.4K关注 0票数 1

经过广泛的网络搜索,我仍然没有找到任何解决这个问题的办法。

我正在编写一个小型C++应用程序,它连接到一个在线数据库并将数据输出到一个列表框中。

我需要使用编辑框启用搜索函数,但在使用变量时无法使查询工作。

我的代码是:

代码语言:javascript
复制
res = mysql_perform_query (conn, "select distinct artist from Artists");
//res = mysql_perform_query (conn, "select album from Artists where artist = ' ' ");



while((row = mysql_fetch_row(res)) != NULL){
    CString str;
    UpdateData();

    str = ("%s\n", row[0]);

    UpdateData(FALSE);
    m_list_control.AddString(str);

}

第一个"res =“行工作正常,但我需要第二个行才能工作。我为编辑框设置了一个成员变量m_search_edit,但是我尝试将它包含在sql语句中的任何方式都会导致错误。

例如:

代码语言:javascript
复制
res = mysql_perform_query (conn, "select album from Artists where artist = '"+m_search_edit+" ' ");

导致此错误:

错误C2664:'mysql_perform_query‘:不能将参数2从’CString‘类转换为'char *’,没有用户定义的转换运算符可以执行此转换,或者不能调用运算符。“

当我将m_search_edit转换为char*时,它会给我一个“无法添加2个指针”的错误。

有办法绕过这件事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-25 20:05:11

这里的问题是您可能正在为Unicode构建,这意味着CString由宽字符组成。不能用宽字符串直接连接ASCII字符串(也不能将字符串文字与+运算符连接起来)。

我认为这里构建查询字符串的最清晰的方法是使用CT2CA宏将编辑控件的内容从Unicode转换为ASCII和CStringA::Format,以便将它们插入字符串中。

代码语言:javascript
复制
CStringA query;
query.Format("select album from Artists where artist = '%s'", CT2CA(m_search_edit));
res = mysql_perform_query(conn, query);

正如Thomas所指出的,您应该知道这为SQL注入打开了大门.

编辑:我不知道这个mysql_perform_query API是从哪里来的,但是从您发布的错误消息来看,它似乎也需要一个可写缓冲区(char *而不是const char *)。因为我找不到它的文档,所以我不知道它期望这个缓冲区有多大,但是要从CString中获取一个可修改的缓冲区,请查看GetBuffer()和ReleaseBuffer()方法:

代码语言:javascript
复制
CStringA query;
query.Format(...); // Replace ... with parameters from above
char * buffer = query.GetBuffer(MAX_STRING_LENGTH); // make length big enough for mysql
res = mysql_perform_query(conn, buffer)
query.ReleaseBuffer();

EDIT2 (回应最新评论):

感谢您提供了mysql_perform_query函数的定义。在将来提出问题时,请记住,知道什么时候创建了类似于此的助手函数是有帮助的。

在这种情况下,您的mysql_perform_query函数从不修改查询字符串--它所做的唯一的事情就是将它传递给mysql_query,后者需要一个const char *,因此没有理由不声明它的参数const。一旦你这样做了,你会发现我的第一个答案有效(不需要GetBuffer/ReleaseBuffer):

代码语言:javascript
复制
MYSQL_RES *mysql_perform_query(MYSQL *conn, const char * query)
{
   // Body as written in comment.
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2709699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档