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

时间:2013-05-17 22:29:11

标签: c# mysql

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

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 个答案:

答案 0 :(得分:3)

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

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

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

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

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

 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();

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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);

但更重要的是,你应该总是使用parameterized queries。这种字符串连接是导致 SQL Injection 攻击的原因。

您可以阅读How does the SQL injection from the "Bobby Tables" XKCD comic work?

答案 3 :(得分:0)

对于提出此问题的人来说显然不是这种情况,但是对于其他所有人都有这样的错误:请确保您没有使用现有的SQL关键字命名您的列。 KEYindex最有可能。 List of SQL keywords