Простой ответ:
Вы можете просто сделать следующее:
string clas = "Computer Science";
sql = "SELECT * FROM Students WHERE Class='" + clas + "'";
Хороший ответ :
Но , мы можем сделать лучше, чем это. Что, если потребуется замена нескольких значений, что тогда? См. Код ниже, он может заменить несколько строк. А также при необходимости можно написать проверку на sql инъекцию. И самое лучшее, вам просто нужно вызвать функцию prepare()
, и все готово.
Инструкции по использованию:
Используйте ? куда нужно положить строку. Если требуется замена нескольких строк , поместите все строки по порядку (как параметры) при вызове функции подготовки. Также обратите внимание на вызов функции подготовки prepare(sql, {param_1, param_2, param_3, ..., param_n})
.
[Примечание: он будет работать с C ++ 11 и более поздними версиями. Он не будет работать с предварительной версией C ++ 11. Итак, при компиляции используйте флаг -std = c ++ 11 с g ++]
#include <iostream>
#include <string>
#include <initializer_list>
using namespace std;
// write code for sql injection if you think
// it necessary for your program
// is_safe checks for sql injection
bool is_safe(string str) {
// check if str is sql safe or not
// for sql injection
return true; // or false if not sql injection safe
}
void prepare(string &sql, initializer_list<string> list_buf) {
int idx = 0;
int list_size = (int)list_buf.size();
int i = 0;
for(string it: list_buf) {
// check for sql injection
// if you think it's necessary
if(!is_safe(it)) {
// throw error
// cause, sql injection risk
}
if(i >= list_size) {
// throw error
// cause not enough params are given in list_buf
}
idx = sql.find("?", idx);
if (idx == std::string::npos) {
if(i < list_size - 1) {
// throw error
// cause not all params given in list_buf are used
}
}
sql.replace(idx, 1, it);
idx += 1; // cause "?" is 1 char
i++;
}
}
// now test it
int main() {
string sql = "SELECT * from STUDENTS where CLASS=?";
string clas = "clas";
prepare(sql, {clas});
cout << sql << endl;
string sql2 = "select name from class where marks > ? or attendence > ?";
string marks = "80";
string attendence = "40";
prepare(sql2, {marks, attendence});
cout << sql2 << endl;
return 0;
}
[PS]: не стесняйтесь спрашивать, если что-то неясно.