登录演示:
代码:
//点击登录按钮
private void btnLog_Click(object sender, EventArgs e)
{
object m_obj;
//获取输入的用户名密码
string userName = txtName.Text.Trim();
string userPsw = txtPsw.Text.Trim();
//查询数据库
string connStr = "server=localhost;user id=root;password=123;database=pqxit;charset=utf8;port=3306";
using (MySqlConnection conn=new MySqlConnection(connStr))
{
string sql = string.Format("select count(*) from user where user_name='{0}' and user_psw='{1}'",userName,userPsw);
using (MySqlCommand mcmd=new MySqlCommand(sql,conn))
{
conn.Open();
m_obj = mcmd.ExecuteScalar();//获取第一行第一列
}
}
if (Convert.ToInt32(m_obj)>0)
{
MessageBox.Show("登录成功");
}
else
{
MessageBox.Show("登录失败");
}
}
效果:
这样看上去好像是对的,但是,如果用户名输入个代码会怎么样呢?
竟然不输入密码也登录成功了,我们看看是怎么回事把。
"select count(*) from user where user_name='admin'#' and user_psw=''"
不难发现,是因为sql语句中把用户名字段后面的注释了,肯定有问题呀(Mysql中#注释)
看看怎么解决吧。
一、使用参数化命令
在sql语句中使用占位符命令,占位符表示需要动态替换的值,它们通过Command对象的Parameters集合来传送。如下
1.sql定义语句改为
string sql = "select count(*) from user where user_name=@userName and user_psw=@userPsw";
2.执行sql之前给填充参数,键要与sql语句中一致
mcmd.Parameters.Add(new MySqlParameter("@userName", userName));
mcmd.Parameters.Add(new MySqlParameter("@userPsw", userPsw));
这样,就大功告成了
二、调用存储过程
1.首先在Mysql数据库中创建存储过程
CREATE PROCEDURE count_login(IN userName VARCHAR(20),IN userPsw VARCHAR(20),OUT countLog int)
BEGIN
SELECT COUNT(*)INTO countLog from user where user_name=userName and user_psw=userPsw;
END
2.代码中调用存储过程
//点击登录按钮
private void btnLog_Click(object sender, EventArgs e)
{
string userName = txtName.Text.Trim();
string userPsw = txtPsw.Text.Trim();
//准备连接的字符串
string connStr = "server=localhost;user id=root;password=123;database=pqxit;charset=utf8;port=3306";
MySqlConnection conn = new MySqlConnection(connStr);//创建连接
MySqlCommand mcmd = new MySqlCommand("count_login", conn);//count_login为存储过程名
//调用存储过程必须要指定Command.CommandType
mcmd.CommandType = CommandType.StoredProcedure;//StoredProcedure声明这是存储过程名
//向存储过程传递参数
//需要精确指定数据类型和参数大小 以便数据库内正确匹配
mcmd.Parameters.Add(new MySqlParameter("@userName",MySqlDbType.VarChar,20));
mcmd.Parameters["@userName"].Value = userName;
mcmd.Parameters.Add(new MySqlParameter("@userPsw", MySqlDbType.VarChar, 20));
mcmd.Parameters["@userPsw"].Value = userPsw;
//输出参数也要使用相同方式添加,但必须指定他的Direction为Output
mcmd.Parameters.Add(new MySqlParameter("@countLog", MySqlDbType.VarChar, 20));
mcmd.Parameters["@countLog"].Direction = ParameterDirection.Output;
using (conn)
{
conn.Open();
mcmd.ExecuteNonQuery();//执行存储过程
//获取存储过程返回的值
int count = Convert.ToInt32(mcmd.Parameters["@countLog"].Value);
if (count > 0)
{
MessageBox.Show("登录成功");
}
else
{
MessageBox.Show("登录失败");
}
}
}
这样就可以了,效果是一样的