0

您好,我的代码有点问题。我收到此错误,这取决于

myReader =  SelectCommand.ExecuteReader();

我真的不明白。

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“密码”附近使用正确的语法

MySqlConnection conn = new MySqlConnection("secretstring")
        MySqlCommand SelectCommand = new MySqlCommand("SELECT * FROM userspassword where'" + this.loginuser.Text + "'and password'" + this.passworduser.Text, conn);
        MySqlDataReader myReader;
        conn.Open();
        //myReader = SelectCommand.ExecuteReader();
        myReader =  SelectCommand.ExecuteReader();


        int count = 0;
        while (myReader.Read())
        {
            count = count + 1;
        }
        if (count == 1)
        {
            MessageBox.Show("Correct");
            Form2 pannel = new Form2();
             pannel.Show();
             Hide();

        }
        else if (count > 1)
        {
            MessageBox.Show("More then 1 user logged in");
        }
        else
            MessageBox.Show("Incorrect password or username");
        conn.Close();
4

4 回答 4

2

缺少供用户比较的字段名称

 MySqlCommand SelectCommand = new MySqlCommand("SELECT * FROM userspassword where " +  
        "username = '" + this.loginuser.Text + "' and password = '" + 
         this.passworduser.Text +"'" , conn);

以及字段和值以及右引号之间的一些空格。

说,让我指出字符串连接的危险。如果您的一个文本框包含单引号,该命令将因语法错误而失败,或者,如果您有恶意用户,他/她可能会准备Sql Injection攻击,在输入框中插入 sql 文本。

您应该像这样编写参数化查询

 MySqlCommand SelectCommand = new MySqlCommand("SELECT * FROM userspassword where " +  
        "username = @uname and password = @pwd", conn);
 SelectCommand.Parameters.AddWithValue("@uname",this.loginuser.Text); 
 SelectCommand.Parameters.AddWithValue("@pwd",this.passworduser.Text); 
 myReader =  SelectCommand.ExecuteReader();

在数据库中以明文形式存储密码存在另一个问题。从安全的角度来看,这是另一件要避免的事情。您应该存储密码的哈希,将哈希函数应用于用户输入文本并将此哈希值作为参数传递以检查数据库字段

于 2013-05-17T22:34:52.903 回答
0

您有间距问题并且缺少列名:

MySqlCommand SelectCommand = 
    new MySqlCommand("SELECT * FROM userspassword where username='" 
                     + this.loginuser.Text + "' and password='" 
                     + this.passworduser.Text +"'", conn);

顺便说一句 - 你在这里有一个潜在的 SQL 注入问题

于 2013-05-17T22:33:47.027 回答
0

您在查询的 where 子句中缺少列名。

"SELECT * FROM userspassword where'" + this.loginuser.Text
                                   ^^^^^^^ Column name is missing..

试试看;

MySqlCommand SelectCommand = new MySqlCommand("SELECT * FROM userspassword where " + "YourColumnName = '" + this.loginuser.Text + "' and password '" + this.passworduser.Text +"'" , conn);

但更重要的是,您应该始终使用参数化查询。这种字符串连接会导致SQL 注入攻击。

您可以阅读“Bobby Tables”XKCD 漫画中的 SQL 注入是如何工作的?

于 2013-05-17T22:38:00.003 回答
0

对于提出问题的人来说显然不是这种情况,但对于其他所有遇到此错误的人来说:确保您没有使用现有的 SQL 关键字命名您的列。KEY并且index最有可能。SQL 关键字列表

于 2016-12-28T19:57:29.060 回答