错误“;检查与MySQL服务器版本对应的手册”

本文关键字:版本 服务器 检查 MySQL 错误 | 更新日期: 2023-09-27 18:14:05

你好,我的代码有点问题。我得到这个错误,它取决于

myReader =  SelectCommand.ExecuteReader();

我真的不明白。

你的SQL语法有错误;查看与MySQL服务器版本对应的手册,了解在第1行

处"password"附近使用的正确语法。
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();

错误“;检查与MySQL服务器版本对应的手册”

缺少供用户比较的字段名

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

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

说到这里,让我指出字符串连接的危险。如果你的一个文本框中包含一个单引号,命令将失败并出现语法错误,或者,如果你有一个恶意用户,他/她可以准备Sql注入攻击,在输入框中插入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();

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

查询的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"中注入SQLXKCD漫画作品?

您有一个空格问题,并且缺少一个列名:

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

BTW -你有一个潜在的SQL注入问题在这里

这显然不是问这个问题的人的情况,但对于其他人有这个错误:确保您没有使用存在的SQL关键字命名您的列。KEYindex是最可能的。SQL关键字列表。

相关文章: