好吧,我正在为游戏制作一个简单的登录屏幕,它使用用户名和密码身份验证。它连接到数据库,检查是否存在用户名和密码,然后查看其是否与数据匹配。如果您输入正确的用户名和密码,则可以正常工作,但是如果您执行的操作不在数据库中,则它将失败并崩溃。我想知道我做对了吗?下面的代码。
private void loginButton_Click(object sender, EventArgs e)
{
string connectionString = "datasource=STUFFZ;database=users";
string select = "SELECT Username, Password FROM RegularUsers WHERE Username = '" + usernameBox.Text + "' AND Password = '" + passwordBox.Text + "'";
MySqlConnection my = new MySqlConnection(connectionString);
MySqlCommand command = new MySqlCommand(select, my);
my.Open();
//String strResult = String.Empty;
//strResult = (String)command.ExecuteScalar();
string[] bba = new string[2];
bba[1] = (String)command.ExecuteScalar();
my.Close();
if (bba[1].Equals(usernameBox.Text))
{
AdminPanel bb = new AdminPanel();
bb.Show();
}
else
{
MessageBox.Show("INCORRECT USER/PASS!");
}
}
如果您输入错误,错误的USER / PASS框将永远不会显示。
参考方案
几点评论:
不要将您的SQL查询串在一起-使用参数化查询来避免SQL注入
您应该将SqlConnection
和SqlCommand
放入using(....) { ... }
块中
如果返回两个值,则不应使用.ExecuteScalar()
-该调用仅适用于单行,单列返回
因此,总的来说,您的代码应如下所示:
private void loginButton_Click(object sender, EventArgs e)
{
string connectionString = "datasource=STUFFZ;database=users";
string select = "SELECT Username, Password FROM dbo.RegularUsers " +
"WHERE Username = @user AND Password = @Pwd"
using(MySqlConnection myConn = new MySqlConnection(connectionString))
using(MySqlCommand command = new MySqlCommand(select, myConn))
{
command.Parameters.Add("@user", SqlDbType.VarChar, 50);
command.Parameters["@user"].Value = usernameBox.Text.Trim();
command.Parameters.Add("@pwd", SqlDbType.VarChar, 50);
command.Parameters["@pwd"].Value = passwordBox.Text.Trim();
myConn.Open();
using(SqlDataReader rdr = command.ExecuteReader())
{
if(rdr.Read())
{
string userName = rdr.GetString(0);
string password = rdr.GetString(1);
rdr.Close();
// here compare those values and do whatever you need to do
}
}
myConn.Close();
}
}
此外,我认为这段代码有点混乱,因为您在同一代码段中进行数据访问(从SQL Server中选择)和UI访问(读取文本框,弹出对话框),
您应该争取更多的关注点分离,例如
定义方法CheckUserName
,该方法将用户名和密码作为字符串,并返回例如一个bool
从事件处理程序中,从UI中获取信息(读出文本框),使用这些值调用该单独的函数,然后处理返回的值
但是,将UI,逻辑和数据访问代码混合在一起会变得非常混乱,而且维护噩梦真的很快!
当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…
改造正在返回一个空的响应主体 - java我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…
每个文件合并后添加换行 - python我有很多类似以下内容的JSON文件:例如。1.json{"name": "one", "description": "testDescription...", "comment": ""} test.json{"name"…
Json到php,json_decode返回NULL - php我正在用PHP进行JSON解析器的一些API,用于存储有关遗产的信息。我在解析时遇到问题,因为它返回的是NULL值而不是数组或对象。简单的JSON代码可以很好地解析,但是可以这样:{"success":true,"totalCount":1,"data":[{"id":99694…
这个json格式正确吗? - c#我尝试解析时有json数据,返回错误的语法错误,请帮助我发现语法错误。[{"isData":"Yes","Details":"[{"Id":"70","Name":"Test","FileName…