Вопрос по c#, mysql, prepared-statement – Использование подготовленного оператора в C # с Mysql
Я пытался подготовить заявление в моей программе, но не работает.
Часть с комментариями является частью «Подготовленное заявление». Когда я превращаю это в нормальное утверждение, все правильно.
Может кто-нибудь сказать мне, что мне не хватает?
Большое спасибо.
private void btnLogin_Click(object sender, EventArgs e)
{
MySqlCommand cmd = MySqlConn.cmd;
//cmd = new MySqlCommand("SELECT * FROM admin WHERE admin_username='@val1' AND admin_password=PASSWORD('@val2')", MySqlConn.conn);
//cmd.Prepare();
//cmd.Parameters.AddWithValue("@val1", tboxUserName.Text);
//cmd.Parameters.AddWithValue("@val2", tboxPassword.Text);
cmd = new MySqlCommand("SELECT * FROM admin WHERE admin_username='"+tboxUserName.Text+"' AND admin_password=PASSWORD('"+tboxPassword.Text+"')", MySqlConn.conn);
MySqlDataReader res = cmd.ExecuteReader();
if (!res.HasRows) { MessageBox.Show("Error! "); res.Close(); return; }
else
{
//do something
}
res.Close();
}
'
из вашего запроса и использованияPrepare
после добавления параметров:
cmd = new MySqlCommand("SELECT * FROM admin WHERE [email protected] AND admin_password=PASSWORD(@val2)", MySqlConn.conn);
cmd.Parameters.AddWithValue("@val1", tboxUserName.Text);
cmd.Parameters.AddWithValue("@val2", tboxPassword.Text);
cmd.Prepare();
Ваше решение почти правильно, как есть. Однако, поскольку это процесс входа в систему и, следовательно, задача, ориентированная на безопасность, я хотел бы также сделать несколько предложений.
Во-первых, подумайте о том, чтобы обработчик события кнопки выглядел следующим образом:
private void btnLogin_Click(object sender, EventArgs e)
{
if (Login(tboxUserName.Text, tboxPassword.Text))
{
// Log in was successful, do something...
}
else
{
// Log in was NOT successful, inform the user...
}
}
Это облегчит обслуживание и удобочитаемость приложения. Затем объявите функцию с именемLogin()
выполнить тяжелую работу:
private bool Login(string username, string password)
{
try
{
MySqlCommand cmd = MySqlConn.cmd;
cmd = new MySqlCommand(
"SELECT count(*) FROM admin " +
"WHERE [email protected] " +
"AND admin_password=PASSWORD(@passwd)",
MySqlConn.conn);
cmd.Prepare();
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@passwd", password);
int result = (int)cmd.ExecuteReader();
// Returns true when username and password match:
return (result > 0);
}
catch (Exception e)
{
// Optional: log exception details
// Deny log in if an error has occurred:
return false;
}
}
Вы заметите несколько вещей здесь. Во-первых, из исходной строки запроса были удалены кавычки, которые мешали именованным параметрам работать правильно. Кроме того, запрос возвращаетcount()
Функция result вместо попытки создания результирующего набора, содержащего имя пользователя и пароль администратора. Наконец, метод инкапсулируется в блок try-catch, так что в случае возникновения ошибки метод возвращаетfalse
и вход в систему запрещен. Я также разбил запрос на составную строку для удобства чтения.