Вопрос по c#, mysql, prepared-statement – Использование подготовленного оператора в C # с Mysql

2

Я пытался подготовить заявление в моей программе, но не работает.

Часть с комментариями является частью «Подготовленное заявление». Когда я превращаю это в нормальное утверждение, все правильно.

Может кто-нибудь сказать мне, что мне не хватает?

Большое спасибо.

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();
}
Что не работает точно? Ошибка отображается? juergen d

Ваш Ответ

2   ответа
6

' из вашего запроса и использования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();
1

Ваше решение почти правильно, как есть. Однако, поскольку это процесс входа в систему и, следовательно, задача, ориентированная на безопасность, я хотел бы также сделать несколько предложений.

Во-первых, подумайте о том, чтобы обработчик события кнопки выглядел следующим образом:

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 и вход в систему запрещен. Я также разбил запрос на составную строку для удобства чтения.

Похожие вопросы