Проверка, существует ли уже имя пользователя в базе данных перед регистрацией - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь добавить функциональность к , проверяю введенное имя пользователя и смотрю, существует ли оно в базе данных MySql, прежде чем пользователь будет успешно зарегистрирован . Я пробовал искать другие похожие вопросы, но из-за того, что мне не хватает опыта, я не могу правильно реализовать это в своем коде.

Вот что у меня есть:

private void button1_Click(object sender, EventArgs e)
{
    string user = tbUser.Text;
    string pass = tbPass.Text;
    string email = tbEmail.Text;

    if (tbUser.Text == "" || tbPass.Text == "" || tbEmail.Text == "")
    {
        MessageBox.Show("Please fill out all fields.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

    else {

        bool exists = false;
        string checkuser = $"SELECT COUNT(*) from users where name = {user}";

       try
        {
            if (OpenConnection())
            {
                MySqlCommand cmd = new MySqlCommand(checkuser, conn);

                try
                {
                    cmd.Parameters.AddWithValue("name", tbUser.Text);
                    exists = (int)cmd.ExecuteScalar() > 0;

                }
                catch (Exception ex)
                {

                }
                if (exists)
                    MessageBox.Show("Username already exists.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                else
                {
                    Register(user, pass, email);
                    MessageBox.Show("Successfully Registered!");
                    this.Close();
                }
            }
        }
        catch (Exception ex)
        {

        }
    }

}

public bool Register(string user, string pass, string email)
{
    string register = $"INSERT INTO users (name, password, email) VALUES('{user}', '{pass}', '{email}');";

    try
    {
        if (OpenConnection()) 
        {
            MySqlCommand cmd = new MySqlCommand(register, conn);

            try
            {
                cmd.ExecuteNonQuery();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
        else
        {
            conn.Close();
            return false;
        }
    }
    catch (Exception ex)
    {
        conn.Close();
        return false;
    }
}

private bool OpenConnection()
{
    try
    {
        conn.Open();
        return true;
    }
    catch (MySqlException ex)
    {
        switch (ex.Number)
        {
            case 0:
                MessageBox.Show("Connection to the server failed.");
                break;
            case 1045:
                MessageBox.Show("Database username or password is incorrect.");
                break;
        }
        return false;
    }
}

The приведенный выше код не работает при регистрации пользователя и не работает при проверке наличия имени пользователя. Был бы признателен за любую помощь в указании мне в правильном направлении :)

1 Ответ

1 голос
/ 08 мая 2020

Насколько мне известно, синтаксис объявления параметра в тексте команды не {user}, а @user.

Итак, эта строка вашего кода

string checkuser = $"SELECT COUNT(*) from users where name = {user}";

Должно быть

string checkuser = $"SELECT COUNT(*) from users where name = @user";

И «@user» должен соответствовать имени добавляемого вами параметра.

Вы ложно вызываете параметр name вместо user на эта строка

cmd.Parameters.AddWithValue("name", tbUser.Text);

Итак, она должна выглядеть так

cmd.Parameters.AddWithValue("user", tbUser.Text);

Как @Transcendent уже упоминал в комментариях к вашему методу Register, вы никогда не добавляете 3 параметра, используемых в текст команды в ваши коллекции параметров, поэтому эта строка просто отсутствует

cmd.Parameters.AddWithValue("user", tbUser.Text);
cmd.Parameters.AddWithValue("pass", tbPass.Text); //this line assumes there is a textbox called tbPass
cmd.Parameters.AddWithValue("email", tbEmail.Text); //this line assumes there is a textbox called tbEmail
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...