我在将信息写入数据库方面遇到了麻烦。我正在使用我在Youtube上观看视频时学到的方法,在那里我们制作了query string
并输入了所有INSERT INTO
内容,但我尝试使用我读过的参数的新方法更安全,防止SQL注入,我读到这是不好的。
我使用下面的代码,一切运行正常,没有错误,它连接到我的FTP服务器并完成所有这些。我的问题是,它没有像我之前使用安全性较低的代码那样将任何输入的用户信息写入MYSQL数据库。
,如果回答此问题的人知道如何检查用户名是否已在数据库中使用,请告知我们,以便我不必另外提出问题。我尝试过像
这样的东西if(Reader.HasRows) MessageBox.Show("Username Taken");
但我收到错误Use of unassigned local variable 'reader'
。
代码我正在使用:
private void btnRegister_Click(object sender, EventArgs e)
{
MySqlDataReader reader;
int numerror = 0;
if (RUsernameTextBox.Text == "")
{
numerror = numerror + 1;
}
if (RPasswordTextBox.Text == "")
{
numerror = numerror + 1;
}
if (REmailTextBox.Text == "")
{
numerror = numerror + 1;
}
if (numerror == 1)
{
ErrorLabel.Text = "*1 required field is blank.";
}
else if (numerror == 2)
{
ErrorLabel.Text = "*2 required fields are blank";
}
else if (numerror == 3)
{
ErrorLabel.Text = "*3 required fields are blank";
}
else
{
if (reader.HasRows) CMessageBox("Error", "");
//add the user to the MySQL database
string HashedPassword = EncodePassword(RPasswordTextBox.Text);
string constring = "datasource=localhost;port=3306;username=Admin;password=**********";
using (MySqlConnection con = new MySqlConnection(constring))
{
MySqlCommand cmd = new MySqlCommand("INSERT INTO userinfo.users (username,password,email,premium,picture) VALUES (@username, @hashedpassword, @email , @premium , @picture);");
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
cmd.Parameters.AddWithValue("@Username", RUsernameTextBox.Text);
cmd.Parameters.AddWithValue("@hashedpassword", HashedPassword);
cmd.Parameters.AddWithValue("@email", REmailTextBox.Text);
cmd.Parameters.AddWithValue("@premium", "0");
cmd.Parameters.AddWithValue("@picture","ftp://***.***.*.**/Profile Pictures/" + RUsernameTextBox.Text + Path.GetFileNameWithoutExtension(RProfilePicture.ImageLocation) + ".png");
try
{
con.Open();
cmd.ExecuteNonQuery();
con.Close();
MakeLoginVisible();
try
{
string TempFolder = Path.GetTempPath();
RProfilePicture.Image.Save(@"C:\temp\" + Path.GetFileNameWithoutExtension(RProfilePicture.ImageLocation) + ".png", System.Drawing.Imaging.ImageFormat.Png);
ftp ftpclient = new ftp(@"ftp://***.***.*.**/", "Admin", "**********");
ftpclient.createDirectory("Profile Pictures/" + RUsernameTextBox.Text);
ftpclient.upload("Profile Pictures/" + RUsernameTextBox.Text + "/" + Path.GetFileNameWithoutExtension(RProfilePicture.ImageLocation) + ".png", @"C:\temp\" + Path.GetFileNameWithoutExtension(RProfilePicture.ImageLocation) + ".png");
MakeLoginVisible();
CMessageBox("Success!", "AirSpace Account '" + RUsernameTextBox.Text + "' Created.");
ftpclient = null;
}
catch (Exception ex)
{
CMessageBox("Error", ex.Message.ToString());
}
}
catch (Exception ex)
{
CMessageBox("Error", ex.Message.ToString());
}
}
}
答案 0 :(得分:1)
使用未分配的局部变量'xxx'
表示编译器无法断定您在给定时间为某个变量赋值。分配任何东西,包括null都将删除该错误消息,因为编译器将知道您已经考虑了变量的内容。
答案 1 :(得分:0)
我可能错了,因为我没有通过.net直接使用MySQL,但在我看到的其他答案中,参数是用"?"来处理的,不是" @"