API C ++ Mysql C mysql_real_escape_string - PullRequest
       13

API C ++ Mysql C mysql_real_escape_string

3 голосов
/ 29 ноября 2009

Я создаю оболочку класса для 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.

1 Ответ

2 голосов
/ 29 ноября 2009

выглядит хорошо для меня. Я подозреваю, что проблема с вашей базой данных в другом месте.

Существует простой способ проверить: временно заменить 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;
}

B) Ищите ошибки в другом месте. Хорошо ли закодирована база данных :: Выполнить? Может быть, он snprintf внутренне с жестко закодированным размером буфера (который вы можете превышать)

C) Попробуйте взять отладочный вывод и ввести его прямо в клиентскую программу mysql (не забудьте поставить точку с запятой в конце). Та же ошибка?

...