-3

我有注册页面,我想检查用户名是否已经存在于数据库中或不在 3 层架构中。

我的注册.cs:

public static int checkusername(string user_txt)
 {
  int id2 = 0;
  string selectstr = "select * from xyz where UserName = '" + user_txt + " ' ";
  id2 = DataAccessLayer.ExecuteReader(selectstr);
  return id2;    
 }

以及textbox 的 onclick 事件背后的代码:

protected void txt_username_TextChanged(object sender, EventArgs e)
 {
  if (!string.IsNullOrEmpty(txt_username.Text))
   {
    int id = xyz.checkusername(txt_username.Text.Trim());
    if (id > 0)
     {
      lblStatus.Text = "UserName Already Taken";
     }
    else
     {
      lblStatus.Text = "UserName Available";
     }
   } 

 }

数据访问层:

public static int ExecuteReader(string Query)
 {
  SqlConnection con = new SqlConnection();
  con.ConnectionString = GetConnectionString();
  con.Open();
  int id = 0;            
  SqlCommand cmd = new SqlCommand();
  cmd.CommandText = Query;
  cmd.CommandType = System.Data.CommandType.Text;
  cmd.Connection = con;
  SqlDataReader reader = cmd.ExecuteReader();
  while (reader.Read())
   {
    id++;
   }
  cmd = null;
  reader.Close();
  con.Close();
  return id;
 }
4

3 回答 3

2

通常,如果“选择查询”没有找到带有参数 user_txt 的用户名,您的 id2 最终将得到值 -1。所以适当的代码是:

           if (id ==-1)
               {
                   lblStatus.Text = "UserName Available";
               }
           if (id>0)
               {

                   lblStatus.Text = "UserName Already Taken";
               }

顺便说一句,您的代码非常不安全,并且您的数据库很容易使用SQL 注入攻击我建议您了解这个问题并在查询中添加参数以防止它。C# 有它的方法来实现这一点。不要试图修复对数据库的访问,只需从头开始,牢记 SQL 注入。

于 2013-04-09T10:04:30.240 回答
2

我已经编辑了你的一些代码尝试如下......它会帮助你......

文本更改事件:

    protected void txt_username_TextChanged(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(txt_username.Text))
        {
            if (xyz.checkusername(txt_username.Text.Trim()))
            {
                lblStatus.Text = "UserName Already Taken";
            }
            else
            {
                lblStatus.Text = "UserName Available";
            }
        }

    }

检查用户名:

    public bool CheckUsername(string user_txt)
    {
        bool Result;
        Result = DataAccessLayer.ExecuteReader(user_txt);
        return Result;
    }

执行阅读器:

    public bool ExecuteReader(string user_txt)
    {
        SqlConnection con = new SqlConnection();
        con.ConnectionString = GetConnectionString();
        con.Open();
        SqlCommand cmd = new SqlCommand("select * from xyz where UserName = @UserID", con);
        SqlParameter param = new SqlParameter();
        param.ParameterName = "@UserID";
        param.Value = user_txt;
        cmd.Parameters.Add(param);
        SqlDataReader reader = cmd.ExecuteReader();
        if (reader.HasRows)
            return true;
        else
            return false;
    }
于 2013-04-09T10:34:10.617 回答
0

正如其他人所提到的,这种方法存在潜在的严重安全问题。

但是,您的问题可能就在这里user_txt + " ' "。second 周围的空格',特别是它之前的空格可能会导致用户名与预期不匹配。

于 2013-04-09T10:04:06.367 回答