Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在mysql查询中使用变量,在C++;MFC程序_C++_Mysql_Mfc - Fatal编程技术网

C++ 在mysql查询中使用变量,在C++;MFC程序

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

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

我正在编写一个连接到在线数据库的小型C++应用程序,并在列表框中输出数据。 我需要使用编辑框启用搜索功能,但使用变量时无法使查询正常工作

我的代码是:

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.
}