2012-05-16 40 views
3

我想開發C#應用程序,我想要登錄窗體連接到遠程服務器。我連接到服務器,但當我嘗試登錄時,行:MySqlDataReader reader = cmd.ExecuteReader();給我一個錯誤:未知列「admin」在where clause你有什麼想法可以從哪裏來的問題?這裏是我的代碼:在C#應用程序的where子句中的未知列

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using MySql.Data.MySqlClient; 

namespace ECBSRecruitmentAgencySoftware 
{ 
    public partial class LogIn : Form 
    { 
     public LogIn() 
     { 
      InitializeComponent(); 
     } 

     public bool tryLogin(string username , string password) 
     { 
      MySqlConnection con = new MySqlConnection("host=aaaaaaaa.baaadsg;user=saaaaaak;password=2333333336;database=soaaaaaaaa2;"); 
      MySqlCommand cmd = new MySqlCommand("Select * FROM niki WHERE user_name = `" + username + "` AND user_password = `" + password + "`;"); 
      cmd.Connection = con; 
      con.Open(); 
      MySqlDataReader reader = cmd.ExecuteReader(); 
      if (reader.Read() != false) 
      { 
       if (reader.IsDBNull(0) == true) 
       { 
        cmd.Connection.Close(); 
        reader.Dispose(); 
        cmd.Dispose(); 
        return false; 
       } 
       else 
       { 
        cmd.Connection.Close(); 
        reader.Dispose(); 
        cmd.Dispose(); 
        return true; 
        } 
      } 
      else 
      { 
       return false; 
      } 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      if (tryLogin(user.Text, pass.Text) == true) 
      { 
       MainScreen F2 = new MainScreen(); 
       F2.Show(); 
       this.Hide(); 
      }    
      else 
       MessageBox.Show("Wrong details!");    
     } 
    } 
} 
+3

1.你應該使用參數化查詢,而不是字符串連接。你很容易受到SQL注入的影響。 2.你不應該存儲明文密碼,你應該存儲密碼散列,並且每當有人輸入密碼時,你應該立即散列它,然後忽略明文密碼並且只比較兩個散列。 3.而不是返回查詢中的所有列,您應該返回count(*)。你只關心*如果*有一行有正確的用戶/密碼,而不是所有的信息。 – Servy

+0

我假設你試圖用「admin」的用戶名登錄? – Tremmors

+0

@Servy你可以給我舉個例子或者我可以看的地方 –

回答

3

在您的查詢報價字符串中使用',而不是(')

Select * FROM niki WHERE user_name = '" + username + "' AND user_password = '" + password + "' 
3

試試這個:

MySqlCommand cmd = new MySqlCommand("Select * FROM niki WHERE user_name = '" + username + "' AND user_password = '" + password + "'"); 

的'是指表和列名稱,如果名稱是保留名稱。例如。 tbl.`from`將引用一個名爲「from」的列,而不是SQL保留字FROM。

這就是你得到一個錯誤消息的原因,因爲當你在命令中發現管理員時,你認爲你指的是一個名爲「admin」的列。沒有獎勵當然猜測你在登錄表單中輸入「admin」作爲用戶名! :)

2

使用已命名的參數,而不是你的解決方案:

MySqlCommand cmd = new MySqlCommand("Select * FROM niki WHERE user_name = @username AND user_password = @password"); 
cmd.Parameters.AddWithValue("@username", username); 
cmd.Parameters.AddWithValue("@password", password); 

UPD:更新AddWithValue作爲UnhandledException說

+0

'cmd.Parameters.AddWithValue(「@ username」,username)'? – Damith