c++ Mysql C API mysql_real_escape_string
-
06-07-2019 - |
Вопрос
Я создаю оболочку класса для 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.
Решение
Мне кажется хорошо.Я подозреваю, что ваша проблема с базой данных в другом месте.
Есть простой способ проверить:временно заменить Database::EscapeString
с фиктивной функцией, т.е.
std::string Database::EscapeString(const char *pStr) {return string(pStr);}
Затем посмотрите, есть ли у вас те же ошибки.
Редактировать:Не зная точно, что это за ошибка или какой запрос ее вызывает, сложно сузить круг проблемы.Вот что стоит попробовать:
А) Просто избавьтесь от всех персонажей, от которых нужно будет экранироваться.Он поместит в базу данных фиктивные данные, но, надеюсь, вы все равно просто тестируете:
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;
}
Б) Ищите ошибки в другом месте.Хорошо ли написан код Database::Execute?Может быть, это делает snprintf
внутренне с жестко закодированным размером буфера (который вы можете превышать)
В) Попробуйте взять отладочный вывод и ввести его прямо в клиентскую программу MySQL (не забудьте поставить точку с запятой в конце).Та же ошибка?