2013-12-12 2 views
1

У меня есть несколько ошибок в моем коде, по какой-то причине, когда я пытаюсь поймать в конце, он вызывает ошибки, заявляя, что отсутствует множество скобок, хотя я не думаю, что это так. Может кто-нибудь, пожалуйста, дайте мне знать, где я поступил неправильно.простой логин C# и веб-приложение MySQL

Код:

namespace login 
{ 
    public partial class _Default : Page 
    { 
     // decleration of tabels and dataadapters including my connection string for my MySQL databse 
     DataSet ds = new DataSet(); 
     MySqlConnection cs = new MySqlConnection(@"SERVER= ********;username=******;password=******;Allow Zero Datetime=true; Initial Catalog = benoatsc_GreenFilm"); 

     MySqlDataAdapter da = new MySqlDataAdapter(); 
     DataTable dt = new DataTable(); 
     String totalDonations = string.Empty; 

     protected void Button1_Click(object sender, EventArgs e) 
     { 
     try 
     { 
      MySqlCommand SelectCommand = new MySqlCommand("select * from films.user where user_name='" + this.username.Text + "; and password='" + this.password.Text + "';", cs); 
      MySqlDataReader myreader; 
      cs.Open(); 
      myreader = SelectCommand.ExecuteReader(); 

      int count = 0; 
      while (myreader.Read()) 
      { 
       count = count + 1; 
      } 

      if (count == 1) 
      { 
       Response.Write(@"<script language='javascript'>alert('wow your in !!');</script>"); 
      } 

      else if (count > 1) 
      { 
       Response.Write(@"<script language='javascript'>alert('duplicate');</script>"); 
      } 

      else Response.Write(@"<script language='javascript'>alert('wrong password');</script>"); 

      cs.Close(); 
     } 

     catch (Exception ex) 
     { 
      Response.Write(@"<script language='javascript'>alert(ex.message);</script>"); 
     } 
     } 
    } 
} 
+1

Off тему: Вы должны использовать SQL параметров. Как бы то ни было, вы уязвимы для атак SQL Injection. –

+3

попробуйте ввести '' или '1' = '1' в имя пользователя, как только ваш код работает, см. [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection) – Habib

+0

спасибо Я включу предупреждения для MySQL инъекции – Beep

ответ

6

Проблема 1: вы открыли дополнительный Керли скобку { после try block.
Проблема 2: Вы открыли параметр user_name с помощью single quotes, но вы не закрыли с single quotes.

Решение 1: Вам необходимо удалить дополнительную скобу для завивки, открытую после блока try.
Решение 2: необходимо приложить user_name параметр с single quotes должным образом.

Предложение: ваш запрос открыт для SQL Injection attacks, я хотел бы предложить использовать parameterised queries, чтобы избежать этого.

Полный код: с помощью parameterised queries

namespace login 
{ 
public partial class _Default : Page 
{ 
    // decleration of tabels and dataadapters including my connection string for my MySQL databse 
    DataSet ds = new DataSet(); 
    MySqlConnection cs = new MySqlConnection(@"SERVER= ********;username=******;password=******;Allow Zero Datetime=true; Initial Catalog = benoatsc_GreenFilm"); 

    MySqlDataAdapter da = new MySqlDataAdapter(); 
    DataTable dt = new DataTable(); 
    String totalDonations = string.Empty; 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 

       MySqlCommand SelectCommand = new MySqlCommand("select * from films.user where [email protected] and [email protected];", cs); 
       MySqlDataReader myreader; 
       SelectCommand.Parameters.AddWithValue("@username",this.username.Text); 
       SelectCommand.Parameters.AddWithValue("@password",this.password.Text); 
       cs.Open(); 

       myreader = SelectCommand.ExecuteReader(); 

       int count = 0; 
       while (myreader.Read()) 
       { 
        count = count + 1; 
       } 

       if (count == 1) 
       { 
        Response.Write(@"<script language='javascript'>alert('wow your in !!');</script>"); 
       } 

       else if (count > 1) 
       { 
        Response.Write(@"<script language='javascript'>alert('duplicate');</script>"); 
       } 

       else Response.Write(@"<script language='javascript'>alert('wrong password');</script>"); 

       cs.Close(); 
      } 

      catch (Exception ex) 
       { 
       Response.Write(@"<script language='javascript'>alert(ex.message);</script>"); 
       }//end of catch block 

     }//end of try block 
    }//end of class 
}//end of namespace 
+0

Excelent @Sudhakar Tillapudi, спасибо. одна проблема, хотя при использовании параметризованных запросов возникает ошибка, что, возможно, мне не хватает ссылки для этого, знаете ли вы, какова будет эта ссылка? – Beep

+0

@Beep: какое именно сообщение об ошибке? –

+0

Ahh был моим недостатком, пространство имен было другим. благодарю вас, как всегда @Sudhakar Tillapudi еще раз вы были очень полезны. – Beep

2

Помимо отсутствующих скобок и неправильного SQL запроса (содержит точку с запятой) вы можете улучшить свой код много. Вы можете использовать ExecuteScalar и изменить ваш запрос на COUNT(*). Таким образом, вам не нужно учитывать код. Также используйте инструкцию using, которая обеспечит закрытие соединения даже в случае исключения. Так что ваш код должен быть на следующей linesL

namespace login 
{ 
    public partial class _Default : Page 
    { 
     // decleration of tabels and dataadapters including my connection string for my MySQL databse 
     DataSet ds = new DataSet(); 
     MySqlConnection cs = new MySqlConnection(@"SERVER= ********;username=******;password=******;Allow Zero Datetime=true; Initial Catalog = benoatsc_GreenFilm"); 

     MySqlDataAdapter da = new MySqlDataAdapter(); 
     DataTable dt = new DataTable(); 
     String totalDonations = string.Empty; 

     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected void Button1_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       using (MySqlCommand SelectCommand = new MySqlCommand("select count(*) from films.user where [email protected] AND password = @password", cs)) 
       { 
        SelectCommand.Parameters.AddWithValue("@username", username.Text); 
        SelectCommand.Parameters.AddWithValue("@password", password.Text); 
        cs.Open(); 
        int count = (int)SelectCommand.ExecuteScalar(); 
        if (count == 1) 
        { 
         Response.Write(@"<script language='javascript'>alert('wow your in !!');</script>"); 
        } 
        else if (count > 1) 
        { 
         Response.Write(@"<script language='javascript'>alert('duplicate');</script>"); 
        } 

        else Response.Write(@"<script language='javascript'>alert('wrong password');</script>"); 
       } 
      } 

      catch (Exception ex) 
      { 
       Response.Write(@"<script language='javascript'>alert(ex.message);</script>"); 
      } 

     } 
    } 
} 

Использование параметров с помощью команды избавит вас от SQL Injection

+0

Спасибо, но когда я попробую, это говорит мне имя пользователя и пароль.text до сих пор нет, у меня есть текстовые поля? – Beep

+1

@Beep, я просто скопировал его из вашего кода * без 'this' *, try,' this.username.Text' и 'this.password.Text', но я не думаю, что это должно иметь какой-то эффект. – Habib

+0

спасибо, я принял ответ Sudhakar Tillapudi, но спасибо четыре вашей помощи – Beep

Смежные вопросы