Выбор ячеек базы данных mysql в c # - PullRequest
0 голосов
/ 03 марта 2019

То, что я пытаюсь сделать, это выбрать ячейку, в которой находится мое имя пользователя, и сравнить пароль с текстом, это сделано в Unity C #, но я использую Mysql Reference, он должен быть похож на любой тип C #.Теперь я пытаюсь сделать нечто подобное в vb, когда вы читаете значение в считывателе, это будет выглядеть так в vb rdr (0), но я не могу сделать это в c #, вот мой код.Для тех, кто беспокоится о том, куда идет пароль, я планировал добавить шифрование позже.

void Login_Data(string un, string pw) {
        con = new MySqlConnection(connectionString);
        con.Open();
        Debug.Log("Mysql state: " + con.State);

        string sql = "SELECT * FROM `users` WHERE '" + un + "'";
        cmd = new MySqlCommand(sql, con);
        rdr = cmd.ExecuteReader();

        while (rdr.Read()) {
                if (rdr[3] == pw) // this is the problem it keeps warning 
//me i like my stuff clean but i dont risk errors if (rdr[3] == pw) also 
//it did give me an error but not here.

                {
                    username = un;
                    MessageBox.Show(username + ", Has Logged in!", "API");
                    usertext.text = "User: " + username;
                    m_uid.text = "UserID: " + rdr.GetString("uid");
                }
        }
}

Предупреждение CS0252 Возможное непреднамеренное сравнение ссылок;чтобы получить сравнение значений, приведите левую сторону к типу 'string'

Я не понимаю это предупреждение или почему оно происходит

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Теперь я знаю, что подобные строки pw.Equals (rdr [3]) не могут содержаться таким образом, если (rdr [3] == pw)

void Login_Data(string un, string pw) {
    try {

        con = new MySqlConnection(connectionString);
        con.Open();
        Debug.Log("Mysql state: " + con.State);

        string sql = "SELECT * FROM `users` WHERE uname='" + un + "'";
        cmd = new MySqlCommand(sql, con);
        rdr = cmd.ExecuteReader();

        while (rdr.Read())
        {
                if (pw.Equals(rdr[3]))
                {
                    username = un;
                    MessageBox.Show(username + ", Has Logged in!", "API");
                    usertext.text = "User: " + username;
                    m_uid.text = "UserID: " + rdr.GetString("uid");
                }
        }
 }

это сработало благодаряДрако 18 и Зак Райан дали мне новые знания.

0 голосов
/ 03 марта 2019

Вот исправление в одну строку:

.... if (rdr[3].ToString() == pw).....

Причина, по которой вы получаете ошибку, состоит в том, что вы сравниваете ячейку данных с типом данных ...

Но давайтеВыучите немного больше, не так ли?

Во-первых, ваш оператор SQL не имеет смысла.Давайте посмотрим на это:

"SELECT * FROM `users` WHERE '" + un + "'"

Итак, вы используете предложение Where.Давайте поговорим об общей грамматике.Когда мы используем какое-либо слово, связанное с WH, разве мы не должны давать информацию о чем-то?Мол, вы не можете просто сказать:

Брайан отправился в Нью-Джерси, где ...

Вместо этого вы могли бы сказать:

Брайанотправился в Нью-Джерси, где оставил куки-файлы своего браузера.

То же правило применяется к операторам SQL.Когда вы используете предложение Where, вы фактически проверяете, совпадает ли какое-либо значение с данным значением ....

Вот как выглядит правильное использование оператора Where:

Select * From Table Where Column1 = 'Some Value'

Двигаемся дальше ...

Вы используете IDataReader, который здесь совершенно не нужен.Почему бы просто не сравнить все значения внутри самого оператора SQL?Просто используйте AND, чтобы сделать несколько сравнений ...

И, как вы упоминали, вы храните имена пользователей и пароли в базе данных.Рекомендуется хранить имя пользователя и хэш пароля.Для этого у вас есть множество вариантов, таких как Argon2, bcrypt, scrypt или PBKDF2 .

Последнее, но не менее важное: самая большая проблема с вашим кодом - следующая строка:

MessageBox.Show(username + ", Has Logged in!", "API");

После долгих лет разработки разработчики пришли с такими паттернами, как MVVM, для масштабируемости, производительности и чего-то еще.Тогда почему ты живешь в 17 веке?Всегда помните:

Вы потратите 20% времени на написание кодов и 80% на его обслуживание.

Поэтому не пишите такие коды, связанные с пользовательским интерфейсом, вСам пользовательский интерфейс.Если вы знакомы с паттерном MVVM, вы уже знаете, о чем я говорю ...

В любом случае, надеюсь, что вы чему-то научились ... И если я где-то ошибся, не стесняйтесь исправить это.Капешишь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...