C++ 在mysql查询中使用变量,在C++;MFC程序
经过互联网的广泛搜索,我仍然没有找到任何解决这个问题的方法 我正在编写一个连接到在线数据库的小型C++应用程序,并在列表框中输出数据。 我需要使用编辑框启用搜索功能,但使用变量时无法使查询正常工作 我的代码是:C++ 在mysql查询中使用变量,在C++;MFC程序,c++,mysql,mfc,C++,Mysql,Mfc,经过互联网的广泛搜索,我仍然没有找到任何解决这个问题的方法 我正在编写一个连接到在线数据库的小型C++应用程序,并在列表框中输出数据。 我需要使用编辑框启用搜索功能,但使用变量时无法使查询正常工作 我的代码是: res = mysql_perform_query (conn, "select distinct artist from Artists"); //res = mysql_perform_query (conn, "select album from Artists where art
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\u search\u edit
,但我试图将其包含在sql语句中的任何方式都会导致错误
例如
导致此错误的原因:
错误C2664:“mysql_执行_查询”:无法将参数2从'class CString'转换为'char*'
没有可执行此转换的用户定义的转换运算符,或者无法调用该运算符“
当我将m_search\u edit
转换为char*
时,会出现“无法添加2个指针”错误
有什么办法可以解决这个问题吗?这里的问题是,您可能正在构建Unicode,这意味着CString由宽字符组成。您不能直接将ASCII字符串与宽字符串连接起来(也不能将字符串文字与+运算符连接起来) 我认为在这里构建查询字符串最清晰的方法是使用
CT2CA
宏将编辑控件的内容从Unicode转换为ASCII,并使用CStringA::Format
将它们插入字符串中
CStringA query;
query.Format("select album from Artists where artist = '%s'", CT2CA(m_search_edit));
res = mysql_perform_query(conn, query);
正如Thomas指出的,您应该意识到这为SQL注入打开了大门
编辑:我不确定这个mysql\u perform\u query
API来自哪里,但从您发布的错误消息来看,它似乎还需要一个可写缓冲区(char*
而不是const char*
).由于我找不到它的文档,我不知道它期望缓冲区有多大,但要从CString中获得一个可修改的缓冲区,请查看和方法:
EDIT2(回应最新评论):
感谢您提供了您的mysql\u perform\u query
函数的定义。在以后提问时,请记住,了解您何时创建了类似这样的帮助函数是很有帮助的
在这种情况下,您的mysql\u perform\u query
函数从不修改查询字符串——它所做的唯一事情就是将其传递给mysql\u query
,该查询采用const char*
,因此您没有理由不声明其参数const
。一旦这样做,您就会发现我的第一个答案是有效的(不需要GetBuffer/ReleaseBuffer):
你是不是在
str=…;
一行中缺少了一个sprintf
?顺便说一下,你正在为自己设置SQL注入。对于桌面应用程序来说,这可能不是一个大问题,但是你应该正确地编码m\u search\u edit
。不,sprintf不工作,当我删除它时,程序工作正常。对不起,我应该这样做更清楚的是,这是一个MFC应用程序。关于SQL注入问题,这只是大学的一个小项目,所以我现在不太担心这一方面,只是想先让程序工作起来。谢谢你的帮助,如果没有它,我根本不知道SQL注入是什么。这也不起作用。它给出了5个“a”错误“Cstring”后保留,如果删除“A”,则出现2个错误。这两个错误是CT2CA:未声明的标识符和“mysql_执行_查询”:无法将参数2从“class CString”转换为“char*”。我应该在第一篇文章中指出,我是在VC++6上执行此操作的。我尝试在Visual Studio 2008中重建该程序。我从您的代码片段中得到此错误:错误1错误C2664:“mysql_执行”_query':无法将参数2从'CStringA'转换为'char*'@D.Gaughan这是什么mysql API?我在web上找不到mysql\u-perform\u-query
的文档,只有mysql\u-query
。无论如何,CString只能隐式转换为const-char*
。如果您需要为函数获取可修改的缓冲区n需要一个非<代码> const < />代码,您应该查看GETBuffReR()和RelaseBuffER()。我使用MySQL C++连接器编辑我的答案。我<代码> M。在程序开始时,我有这个代码块,我不这样认为。{//如果(mysql\u query(conn,sql\u query)){//printf(“mysql查询错误:%s\n,mysql\u错误(conn));//退出(1);}返回mysql\u使用结果(conn);}您发布的代码仍然有错误。主要的错误是query.Buffer(…):没有重载函数包含0个参数。@D.Gaughan您说的query.Buffer(…)
给出了错误,但我的帖子中没有出现错误。请确保您获得了完整的名称,*get*Buffer
或*Release*Buffer
,或者如果您正在调用query.Format
,请使用第一个示例中的参数替换..
(我只是将它们从第二个示例中删掉,以便将重点放在GetBuffer和ReleaseBuffer的使用上)。
CStringA query;
query.Format("select album from Artists where artist = '%s'", CT2CA(m_search_edit));
res = mysql_perform_query(conn, query);
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();
MYSQL_RES *mysql_perform_query(MYSQL *conn, const char * query)
{
// Body as written in comment.
}