Вопрос

Я создаю оболочку класса для 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 (не забудьте поставить точку с запятой в конце).Та же ошибка?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top