2013-04-22 3 views
0

Как говорится в заявлении, я пытаюсь запросить базу данных MySQL с использованием локальной переменной для предложения where. Я знаю, что в java вы можете использовать оператор +, чтобы просто вставлять локальные переменные в строку запроса, которая, очевидно, не совпадает с C++. поэтому я подумал, что идентификатор использовать строковый поток:Как использовать локальную переменную как часть запроса MySQL (Qt C++)

void test::something(double car_id) 
{ 
std::stringstream ss; 
    ss << "SELECT * FROM cars WHERE carID = '"; 
    ss << car_id << "'"; 
    QString query_string = QString::fromStdString(ss.str()); 
    QSqlQuery query(query_string); 
    // execute the query 
    query.exec(); 
    std::cout << query.value("carID").toString().toStdString() << std::endl; 
} 

, но это также не работает, любая помощь будет большой, потому что я не могу найти ответ

приветствия

+1

Как это не работает? В чем проблема? – deepmax

+0

Никогда не создавайте SQL-запросы с конкатенацией строк. Инъекция очень вероятна. Используйте [подготовленные заявления] (https://en.wikipedia.org/wiki/Prepared_statement)! – leemes

+0

говорит, что 'QSQLQuery :: значение не помещается в действительную запись' – AngryDuck

ответ

7

Вместо добавление переменной в строку запроса, вы должны параметризовать запросы. Так, что-то вроде этого:

void test::something(double car_id){ 
    QSqlQuery query; 
    query.prepare("SELECT * FROM cars WHERE carID = ?"); 
    query.addBindValue(car_id); 
    query.exec(); 
    std::cout << query.value("carID").toString().toStdString() << std::endl; 
} 

Или с именованными привязок:

void test::something(double car_id){ 
    QSqlQuery query; 
    query.prepare("SELECT * FROM cars WHERE carID = :car_id"); 
    query.bindValue(":car_id", car_id); 
    query.exec(); 
    std::cout << query.value("carID").toString().toStdString() << std::endl; 
} 
+0

Это очень верно. Но AFAIK это не решает проблему. Вставьте 'query.next()' – leemes

+0

вот-вот скажет те же самые приветствия @leemes и спасибо WOLPH, это выглядит хорошо, см. Мой вопрос также спрашивал, как использовать локальные переменные в операциях SQL правильно, на которые вы ответили плохо, принимаете – AngryDuck

+0

@WoLpH как бы я использовал это значение привязки с несколькими параметрами? Еще раз спасибо – AngryDuck

0

если carID числовой столбец в БД вам не нужно цитирует

QString query_string = "SELECT * FROM cars WHERE carID = " 
+ QString::number(car_id); 

иначе

QString query_string = "SELECT * FROM cars WHERE carID = '" 
+ QString::number(car_id) + "'"; 

Примечание 1: вы не должны использовать этот подход на всех, но посмотрите на параметры запроса связывания. По многим причинам (инъекции, экранирование, форматирование/преобразование и т. Д.)

Примечание 2: почему людям нравится смешивать базовые типы STL с основными типами QT (строки, базовые контейнеры и т. Д.). Никогда не видел никаких преимуществ этого, кроме совершенно нечитаемого кода и проблем с конверсией.

Смежные вопросы