Моя программа читает 0 из базы данных, хотя есть 1

0

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

pstmt = con->prepareStatement("SELECT (?) FROM votos WHERE id = (?)");
pstmt->setString(1, eleccion);
pstmt->setInt(2, p->getId());
res = pstmt->executeQuery();
while(res->next())
{
    p->setVoto(res->getInt(1));
}

Когда переменные eleccion и id являются Provincial и 1 соответственно, функция getInt (1) должна возвращать 1, но возвращает 0.

Команда (в командной строке mysql):

SELECT Provincial from Votos WHERE id=1

Возвращает таблицу с одной строкой и одним столбцом со значением 1

Боковые заметки:

Проверка орфографии

Функция getId() работает правильно

Компилятор не дает никакой ошибки

  • 0
    Добро пожаловать в ТАК. Пожалуйста, закончите тур. Действительный ТАК вопрос. Конец рецензирования. Наслаждайтесь ТАК ;-)
  • 0
    Вы не можете связать переменную как имя поля в подготовленном операторе.
Теги:

1 ответ

2
Лучший ответ

Вы не можете использовать заполнитель в подготовленном запросе для имени столбца. Он возвращает значение строки eleccion, не используя его как имя столбца в таблице. Вам нужно выполнить конкатенацию строк, чтобы заменить имя столбца.

std::string sql = std::string("SELECT '") + eleccion + "' FROM votos WHERE id = ?";
pstmt = con->prepareStatement(sql.c_str());
pstmt->setInt(1, p->getId());
res = pstmt->executeQuery();
while(res->next())
{
    p->setVoto(res->getInt(1));
}

Если значение eleccion исходит от пользователя или какого-либо другого ненадежного источника, убедитесь, что вы проверяете его перед конкатенацией, чтобы предотвратить SQL-инъекцию.

  • 0
    Спасибо, я этого не знал. Ошибка (по-видимому) устранена, теперь у меня есть внутренняя ошибка сервера (конец вывода скрипта перед заголовками) Редактировать: я решил
  • 0
    Стоит отметить, что вы, возможно, уже открыли дверь для SQL-инъекций. Безопасный способ сделать это с помощью белого списка имен столбцов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню