Следующий метод сделает работу, но не предотвратит вас от инъекций sql
func insertStatement(table: String, dict: [String : Any]) -> String {
let values: [String] = dict.values.compactMap { value in
if value is String || value is Int || value is Double {
return "'\(value)'"
} else if let date = value as? Date {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
return "'" + dateFormatter.string(from: date) + "'"
}
// handle other types if necessary
return nil
}
return "INSERT INTO \(table) (" + dict.keys.joined(separator: ",") + ") VALUES (" + values.joined(separator: ",") + ")"
}
Использование:
insertStatement(table: "test_table", dict: ["id": 8, "name" : "John", "age" : Date()])
Выход: INSERT INTO test_table(id,age,name) VALUES ('8','2019-04-24','John')
Для предотвращения SQL-инъекций вы должны использовать подготовленные операторы для привязки значений, например, в библиотеке PDO PHP, например:
func insertStatement(table: String, dict: [String : Any]) {
let columns = dict.keys.joined(separator: ",")
let values = dict.keys.map({ ":" + $0 }).joined(separator: ",")
// build the statement
let sql = "INSERT INTO " + table + "(" + columns + ") VALUES (" + values + ")"
var bind: [String : Any] = [:]
for (column, value) in dict {
bind[":\(column)"] = value
}
}