不确定为什么以下代码会给我一个例外。我试图检查MySQL数据库中是否存在用户名,如果没有,那么我想创建一个用户。如果我自己运行任一查询,那么它可以正常但不能在一起。
int valid = -1;
using (MySqlConnection cnn = new MySqlConnection(conString))
{
cnn.Open();
bool usernameExists = false;
string sql1 = String.Format("SELECT Username FROM Users WHERE Username = \"{0}\"", username);
MySqlCommand cmd1 = new MySqlCommand(sql1, cnn);
usernameExists = (int)cmd1.ExecuteScalar() > 0;
if (!usernameExists)
{
string sql = String.Format("INSERT INTO Users(Username, Password) VALUES(\"{0}\", \"{1}\")", username, password);
MySqlCommand cmd = new MySqlCommand(sql, cnn);
valid = cmd.ExecuteNonQuery();
}
}
return valid;
答案 0 :(得分:0)
首先,MySQL使用单引号。这意味着您的查询将是:
string.format("SELECT Username FROM Users WHERE Username = '{0}' LIMIT 1", Username);
但是,SQL注入非常容易受到攻击。这是使用MySQL参数来阻止它的代码。
int valid = -1;
using (MySqlConnection cnn = new MySqlConnection(conString))
{
cnn.Open();
bool usernameExists = false;
MySqlCommand cmd1 = new MySqlCommand("SELECT Username FROM Users WHERE Username = @username LIMIT 1", cnn);
cmd1.Parameters.AddWithValue("@username", username);
usernameExists = (int)cmd1.ExecuteScalar() > 0;
if (!usernameExists)
{
MySqlCommand cmd = new MySqlCommand("INSERT INTO Users(Username, Password) VALUES(@username, @password)", cnn);
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@password", password);
valid = cmd.ExecuteNonQuery();
}
}
return valid;
你可以尝试一下吗?
答案 1 :(得分:0)
我通过更改第一个查询来实现它:
MySqlCommand cmd1 = new MySqlCommand("SELECT Username FROM Users WHERE Username = @username LIMIT 1", cnn);
到
MySqlCommand cmd1 = new MySqlCommand("SELECT COUNT(UserID) FROM Users WHERE Username = @username", cnn);
int valid = int.Parse(cmd.ExecuteScalar().ToString());
感谢您的帮助。