Использование переменной в запросе mysql в программе C ++ MFC - PullRequest
1 голос
/ 25 апреля 2010

после обширного поиска в интернете я до сих пор не нашел решения этой проблемы.

Я пишу небольшое приложение на 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_search_edit, настроенная для поля редактирования, но любой способ, которым я пытаюсь включить ее в оператор sql, вызывает ошибки.

например.

res = mysql_perform_query (conn, "select album from Artists where artist = '"+m_search_edit+" ' ");

вызывает эту ошибку:

ошибка C2664: «mysql_perform_query»: невозможно преобразовать параметр 2 из «class CString» в «char *» Отсутствует пользовательский оператор преобразования, который может выполнить это преобразование, или оператор не может быть вызван "

А когда я конвертирую m_search_edit в символ *, это выдает ошибку «Невозможно добавить 2 указателя».

Есть ли способ обойти это ???

1 Ответ

2 голосов
/ 26 апреля 2010

Проблема в том, что вы, вероятно, создаете 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);

И, как указал Томас, вы должны знать, что это оставляет дверь открытой для SQL-инъекций ...

РЕДАКТИРОВАТЬ: Я не уверен, откуда взялся этот mysql_perform_query API, но из сообщения об ошибке, которое вы опубликовали, похоже, что для него также требуется буфер записи (char * вместо const char *). Поскольку я не могу найти документацию для него, я не знаю, насколько велик ожидаемый размер этого буфера, но чтобы получить модифицируемый буфер из CString, посмотрите на GetBuffer () и ReleaseBuffer () методы:

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):

MYSQL_RES *mysql_perform_query(MYSQL *conn, const char * query)
{
   // Body as written in comment.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...