繁体   English   中英

用C#更新MySQL

[英]Update MySQL in C#

我有以下代码:

public partial class LogintoProfile : Form
{
    public LogintoProfile()
    {
        InitializeComponent();
    }

    private void BoxPawo_TextChanged(object sender, EventArgs e)
    {
        //Boxen viser stjerner i stedet for text
        BoxPawo.PasswordChar = '*';
        //Maxlængde på Password
        BoxPawo.MaxLength = 36;
    }

    private void BoxCopawo_TextChanged(object sender, EventArgs e)
    {
        //Boxen viser stjerner i stedet for text
        BoxPawo.PasswordChar = '*';
        //Maxlængde på Password
        BoxPawo.MaxLength = 36;
    }

    private void Update_Click(object sender, EventArgs e)
    {
        string connStr = "server=localhost;user=root;database=p4_projekt;port=3306;password=Jeppesen95;charset=latin1;";
        MySqlConnection conn = new MySqlConnection(connStr);

        try
        {
           MessageBox.Show("Forbinder til databasen");
            conn.Open();
            string sql = "UPDATE p4_projekt.customer_table set First_name='" + BoxFornavn.Text + "',Last_name='" + BoxEfternavn.Text + "',Email='" + textBoxEmail.Text + "',Password=" + BoxPawo.Text + "WHERE Customer_id=@id";
            MySqlCommand cmd = new MySqlCommand(sql, conn);
            MySqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                Console.WriteLine(rdr[0] + " -- " + rdr[1]);   // [] kan ikke huske om det er array plads?!
            }

            rdr.Close();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

        conn.Close();
        Console.WriteLine("Done.");
        Console.ReadLine();
    }

    private void TankOp_Click(object sender, EventArgs e)
    {
        string connStr = "server=localhost;user=root;database=p4_projekt;port=3306;password=**********;charset=latin1;";
        MySqlConnection conn = new MySqlConnection(connStr);

        try
        {
            MessageBox.Show("Forbinder til databasen");
            conn.Open();
            string sql = "UPDATE p4_projekt.customer_table set Balance'" + Balance.Text + "WHERE Customer_id=@id";
            MySqlCommand cmd = new MySqlCommand(sql, conn);
            MySqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                Console.WriteLine(rdr[0] + " -- " + rdr[1]);   // [] kan ikke huske om det er array plads?!
            }

            rdr.Close();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

        conn.Close();
        Console.WriteLine("Done.");
        Console.ReadLine();
    }

    private void Back_Click(object sender, EventArgs e)
    {
        this.Hide();
        Login.Login name = new Login.Login();
        name.ShowDialog();
    }
}

是导致我出现问题的Update_Click方法。 我正在开发一个登录应用程序。

轮廓

该页面允许用户编辑他们的信息。 但是要拥有一个update子句,您需要一个where语句。 如果用户知道它的ID,就可以了,因为那样我就知道了。 但就我而言,他们没有。

我读了一些可以使用参数的文章,但是我不确定。 这是登录代码:

public partial class Login : Form
{
    private string connStr;
    private MySqlConnection conn;

    public Login()
    {
        InitializeComponent();
    }

    private void connect_to_DB()
    {
        try
        {
            connStr = "server=localhost;user=root;database=p4_projekt;port=3306;password=**********;charset=latin1;";
            conn = new MySqlConnection(connStr);
            conn.Open();
        }
        catch (MySqlException e)
        {
            throw;
        }
    }

    private bool login_validation(string email, string pass)
    {
        connect_to_DB();

        MySqlCommand cmd = new MySqlCommand();
        cmd.CommandText = "Select * from customer_table where Email=@email and Password=@pass";
        cmd.Parameters.AddWithValue("@email", email);
        cmd.Parameters.AddWithValue("@pass", pass);
        cmd.Connection = conn;

        MySqlDataReader login = cmd.ExecuteReader();

        if (login.Read())
        {
            conn.Close();
            return true;
        }
        else
        {
            conn.Close();
            return false;
        }
    }

    private void buttonSubmit_Click(object sender, EventArgs e)
    {
        string email = textBoxEmail.Text;
        string pass = textBoxPass.Text;

        if (email == "" || pass == "")
        {
            MessageBox.Show("Tomme felter, udfyld venligst begge felter");
            return;
        }

        bool r = login_validation(email, pass);

        if (r)
        {
            MessageBox.Show("Korrekte oplysninger");
            this.Hide();
            LogintoProfile name = new LogintoProfile();
            name.ShowDialog();  
        }
        else
            MessageBox.Show("Forkerte oplysninger");
    }
}

您的最后一个值(密码)不在文本字段要求的单引号之间。 因此,解决该问题似乎微不足道,但是由于另一个原因,您的代码是错误的。 您永远不要将值串联在一起以形成sql命令。 这种方法会导致类似您遇到的问题,或者导致更糟的情况,即使用Sql Injection可以很容易地入侵您的代码

请使用此处的参数化查询

string sql = @"UPDATE p4_projekt.customer_table 
               set First_name=@firstname, Last_name=@lastname,
                   Email=@email,Password=@password
               WHERE Customer_id=@id";
  MySqlCommand cmd = new MySqlCommand(sql, conn);
  cmd.Parameters.Add("@firstname", MySqlDbType.VarChar).Value = BoxFornavn.Text;
  cmd.Parameters.Add("@lastname", MySqlDbType.VarChar).Value = BoxEfternavn.Text;
  cmd.Parameters.Add("@email", MySqlDbType.VarChar).Value = textBoxEmail.Text;
  cmd.Parameters.Add("@password", MySqlDbType.VarChar).Value = BoxPawo.Text; 
  cmd.Parameters.Add("@id", MySqlDbType.Int32).Value =  ???? // no value for id ???

我也注意到最后一个参数没有给出值。 @id一个,这对于更新工作至关重要。 ID参数唯一标识要更新的记录。 我想这是您检查登录是否成功时检索到的ID。 要使用此登录ID,您需要存储某种在应用程序生存期内可用的全局变量。 因此,您可以在登录表单中使用静态变量

public partial class Login : Form
{
    public static int CurrentUserID = -1;

    public Login()
    {
        ......
    }    

private bool login_validation(string email, string pass)
{

    .....
    if (login.Read())
    {
        Login.CurrentUserID = login.GetInt32(login.GetOrdinal("ID"));
        conn.Close();
        return true;
    }
    else
    {
        conn.Close();
        return false;
    }
}

现在,在更新表单中,您可以使用CurrentUserID设置您的最后一个参数

....
cmd.Parameters.Add("@id", MySqlDbType.Int32).Value = Login.CurrentUserID;
....

您没有SQL问题* ,有业务逻辑问题。

您具有一个输入表单,其中包括以下字段:

  • 名字
  • 电子邮件地址

现在,您希望用户既可以在系统未知时插入其信息,又可以在已知时更新其信息。

因此,您需要将这些属性中的一个或多个标识为唯一标识用户,以便他们在更新信息时可以提供这些属性。 该电子邮件地址将是一个不错的选择。

然后,您可以将更新查询编写为:

UPDATE ...
WHERE Email = @Email

并参数化您的查询。

* :很好,您有一个巨大的SQL注入漏洞。 请参阅如何将用户提供的输入添加到SQL语句?

我看不懂德语(?),但是在设计方式上有很多问题。

  1. 不要以这种方式构建sql语句,而是在邀请sql注入攻击。

我本来想增加点数,但现在太多了。 我以后可以添加更多,但是连接字符串在这里吗? 为什么在这里输入密码?

这是原型吗?

首先,为什么不按要求更新问题,以便我们了解您要执行的操作。

是的,将参数提供给存储过程会更好。 一经了解,便可以添加更多信息和重构建议。 用户可以识别哪些独特信息? 您必须使用某些东西才能进行查找。 同样,我需要更多信息来帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM