Как использовать строку в аргументе Sql? - PullRequest
0 голосов
/ 02 августа 2020

Как следует go вставлять строку в аргумент SQL?

Примерно так:

string clas = "Computer Science";

sql = "SELECT * from STUDENTS where CLASS='clas'";

Ответы [ 2 ]

2 голосов
/ 02 августа 2020

Это можно сделать двумя способами:

  1. Это предпочтительный и более безопасный способ. Вы можете использовать подготовленные операторы вроде этого
string clas = "Computer Science";
sql = "SELECT * FROM Students WHERE Class=?";

// Prepare the request right here

preparedStatement.setString(1, clas);

// Execute the request down here
Более простой, но гораздо менее безопасный вариант (уязвим для SQL -инъекций)
string clas = "Computer Science";
sql = "SELECT * FROM Students WHERE Class='" + clas + "'";
0 голосов
/ 02 августа 2020

Простой ответ:

Вы можете просто сделать следующее:

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]: не стесняйтесь спрашивать, если что-то неясно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...