我在将变量输入数据库时遇到问题。我已经看过其他关于如何通过转义传递变量的帖子,但这些解决方案不适用,因为我通过API获取变量。顺便说一句,我通过foreach循环循环数据。
level = "" + x.Account_Level + "";
name = "" + x.name + "";
command.CommandText = "INSERT INTO `data` (`level`, `name`) VALUES(" + level + ", " + name + ")";
command.ExecuteNonQuery();
有时候,一个变量会带有一个撇号,并会搞砸代码。是否有可能在每个撇号之前插入一个斜杠,或者是否有像PHP这样的方式只用单引号推送整个变量?谢谢!
修改 这会有用吗?我想我需要添加i来更改每个循环的参数名称,因为它声明参数已经声明。
using (var web = new WebClient())
{
web.Encoding = System.Text.Encoding.UTF8;
var jsonString = responseFromServer;
var jss = new JavaScriptSerializer();
var MatchesList = jss.Deserialize<List<Matches>>(jsonString);
string connectString = "Server=myServer;Database=myDB;Uid=myUser;Pwd=myPass;";
MySqlConnection connect = new MySqlConnection(connectString);
MySqlCommand command = connect.CreateCommand();
int i = 1;
connect.Open();
foreach (Matches x in MatchesList)
{
command.CommandText = "INSERT INTO `data` (`level`, `name`) VALUES(?level" + i + ", ?name" + i + ")";
command.Parameters.AddWithValue("level" + i, x.Account_Level);
command.Parameters.AddWithValue("mode" + i, x.name);
command.ExecuteNonQuery();
i++;
}
connect.Close();
}
答案 0 :(得分:2)
快速而肮脏的修复是使用类似的东西:
level = level.Replace("'","whatever");
但仍存在问题。它不会捕获其他不良字符,它甚至可能不适用于撇号上的边缘情况。
最佳解决方案是不以这种方式构建查询。相反,学习如何使用参数化查询,以便SQL注入攻击是不可能的,并且无论你放入什么内容,参数都可以工作(理所当然)。
例如(在我的头顶,所以可能需要一些调试):
MySqlCommand cmd = new MySqlCommand(
"insert into data (level, name) values (?lvl, ?nm)", con);
cmd.Parameters.Add(new MySqlParameter("lvl", level));
cmd.Parameters.Add(new MySqlParameter("nm", name));
cmd.ExecuteNonQuery();