Выберите для входа и обновления одновременно - PullRequest
1 голос
/ 14 февраля 2020

Можно ли использовать SQL command для входа в систему и update одновременно? Я имею в виду, когда вход в систему, я хочу изменить logat in 1. Нужно ли создавать новый if с OpenConnection()?

public bool IsLogin(string user, string pass) {
            string query = $"SELECT * from utiliz WHERE username='{user}' AND password='{GetSha1(pass)}'";
            string query_update = $"UPDATE utiliz SET logat='{1}' WHERE username='{user}'";
            try
            {
                if (OpenConnection())
                {
                    MySqlCommand cmd = new MySqlCommand(query, conn);
                    MySqlDataReader reader = cmd.ExecuteReader();
                    if (reader.Read())
                    {
                        reader.Close();
                        conn.Close();
                        return true;
                    }
                    else
                    {
                        reader.Close();
                        conn.Close();
                        return false;
                    }
                }
                else {
                    conn.Close();
                    return false;
                }
            }
            catch (Exception ex) {
                conn.Close();
                return false;
            }
            }

EDITED

Ребята, я отредактировал свой код, следуя процедуре параметров. Это хорошо, что я сделал?

if (String.IsNullOrEmpty(textBox_pass_login.Text) && String.IsNullOrEmpty(textBox_usr_login.Text) || String.IsNullOrEmpty(textBox_usr_login.Text) || String.IsNullOrEmpty(textBox_pass_login.Text))
            {
                System.Windows.Forms.MessageBox.Show("Both fields (username,password) are required");
            }
            else
            {
                string user = textBox_usr_login.Text;
                string password = textBox_pass_login.Text;
                string encryptedpass = GetSha1(password);
                try
                {
                    using (var connection = conn)
                    {
                        string query = "SELECT * from utiliz WHERE username=@user AND password=@password";
                        using (var command = new MySqlCommand(query, conn))
                        {
                            command.Parameters.AddWithValue("@user", user);
                            command.Parameters.AddWithValue("@password", encryptedpass);
                            MySqlDataAdapter sda = new MySqlDataAdapter(command);
                            DataTable dt = new DataTable();
                            sda.Fill(dt);
                            conn.Open();
                            int i = command.ExecuteNonQuery();
                            conn.Close();
                            if (dt.Rows.Count > 0)
                            {
                                this.Hide();
                                var form2 = new Form1();
                                form2.Closed += (s, args) => this.Close();
                                form2.Show();
                            }
                            else
                            {
                                System.Windows.Forms.MessageBox.Show("Wrong credentials");
                                textBox_usr_login.Clear();
                                textBox_pass_login.Clear();
                            }
                        }
                    }
                }
                catch
                {
                    System.Windows.Forms.MessageBox.Show("Wrong credentials");
                    textBox_usr_login.Clear();
                    textBox_pass_login.Clear();
                }    
            }

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

Как рекомендует (и демонстрирует) Фелипе Ориани, вам следует использовать параметризованные запросы.

Позвольте мне, однако, указать, что вы можете сделать это с помощью одного update запроса. Хитрость заключается в том, чтобы отфильтровать запрос на обновление как по имени пользователя, так и по паролю:

UPDATE utiliz SET logat = @logat WHERE username = @username AND password = @password

Вы хотите выполнить запрос с помощью метода ExecuteNonQuery, который возвращает количество затронутых строк.

Если учетные данные действительны, причина where выбирает соответствующую запись и происходит обновление, возвращая 1 в качестве числа затронутых записей. Иначе, запись не обновляется, и метод возвращает 0.

1 голос
/ 14 февраля 2020

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

Проверьте приведенный ниже пример с комментариями (я не тестировал этот код, может не работать должным образом в вашей среде):

public bool IsLogin(string user, string pass) 
{
    // prepare the queries with parameters with '@' and parameter name
    const string query = "SELECT count(username) from utiliz WHERE username = @username AND password = @password";
    const string query_update = "UPDATE utiliz SET logat = @logat WHERE username = @username";

    // prepare the encrypted password
    string encryptedPass = GetSha1(pass);

    // use a result variable to use as the function result

    bool result = false;
    try
    {
        if (OpenConnection())
        {
            // start a transaction from the connection object
            using (MySqlTransaction tran = conn.BeginTransaction())
            {
                try    
                {
                    int userFound = 0;
                    // prepare the MySqlCommand to use the query, connection and transaction.
                    using (MySqlCommand userCommand = new MySqlCommand(query, conn, tran))
                    {
                        userCommand.Parameters.AddWithValue("@username", user);
                        userCommand.Parameters.AddWithValue("@password", encryptedPass);

                        userFound = (int) userCommand.ExecuteScalar();
                    }  

                    if (userFound > 0)
                    {
                        // prepare the MySqlCommand to use the query, connection and transaction to update data
                        using (MySqlCommand logatCommand = new MySqlCommand(query_update, conn, tran))
                        {
                            logatCommand.Parameters.AddWithValue("@logat", DateTime.Now);
                            logatCommand.Parameters.AddWithValue("@username", user);                        

                            logatCommand.ExecuteNonQuery();
                        }
                    }  

                    // commit the transaction
                    tran.Commit();

                    result = true;
                }
                catch (Exception ex)
                {
                    // perform some log with ex object. 


                    tran.Rollback();
                }
                finally
                {
                    conn.Close();
                }
            }            
        }
    }
    catch (Exception e)
    {
        // perform some log...

        return false;
    }

    return result;
}
...