Как выбрать элемент из MySql без идентификатора в C # ASP.NET Core

0

Я пытаюсь получить пользователя из таблицы mysql с именем пользователя вместо id в ASP.Net Core, столбец по умолчанию в методе GET - это id. Я попытался изменить его на имя пользователя, но столбец неизвестен.

В моей таблице имя пользователя, пароль и адрес электронной почты находятся в тике TEXT, id в типе INT.

Мой измененный код:

// GET: api/Person/XXX
[HttpGet("{uname}", Name = "Get")]
public Person Get(string uname)
{
    ConnectMysql();

    Person p = new Person();
    string queryString = "SELECT * FROM users WHERE uname = " + uname;

    MySqlCommand cmd = new MySqlCommand(queryString, conn);

    MySqlDataReader myReader = cmd.ExecuteReader();

    if (myReader.Read())
    {
        p.id = (int)myReader["id"];
        p.name = myReader["uname"].ToString();
        p.password = myReader["pword"].ToString();
        p.email = myReader["email"].ToString();

        return p;
    }
    else
    {
        return null;
    }
}

И затем я пытаюсь получить элемент в таблице с вызовом http://localhost: 54203/api/Person/q ("q" - это элемент, существующий в таблице).

Ошибка: MySql.Data.MySqlException: Неизвестный столбец "q" в разделе "where"

Как я могу это исправить?

Теги:

2 ответа

3
Лучший ответ

Вам нужны одинарные кавычки вокруг значений, например:

string queryString = "SELECT * FROM users WHERE uname = '" + uname + "'";

Без них MySql пытается интерпретировать ваше значение uname как имя столбца.

НО НЕ ДЕЛАЙТЕ ЭТО!

Этот код является безумным, уязвимым для SQL-инъекций. Сделайте это, и ваш сайт будет взломан, прежде чем вы зарегистрируете своего первого пользователя.

Структурируйте код следующим образом:

// GET: api/Person/XXX
[HttpGet("{uname}", Name = "Get")]
public Person Get(string uname)
{
   // Don't manage the conneciton like this.
   // .Net uses connection pooling, where in most cases you really do want
   //   a new connection object for each call to the db
   //  ConnectMysql();

    string queryString = "SELECT * FROM users WHERE uname = @uname";

    using (var conn = new MySqlConnection("connection string here"))
    using (var cmd  = new MySqlCommand(queryString, conn))
    {
        cmd.Parameters.Add("@uname", MySqlDbType.VarChar, 20).Value = uname;
        conn.Open();

        using (var myReader As MySqlDataReader = cmd.ExecuteReader())
        {
            if (myReader.Read())
            {
                return new Person() {
                    id = (int)myReader["id"],
                    name = myReader["uname"].ToString(),
                    password = myReader["pword"].ToString(),
                    email = myReader["email"].ToString()
                };
            }
        }
    }
    return null;
}

И пока я здесь, это точно похоже, что вы храните пароль в виде обычного текста. В любом списке грехов безопасности SQL-инъекция находится наверху, а вскоре появляются пароли с открытым текстом.

0

Попробуйте это в своем запросе:

string queryString = "SELECT * FROM users WHERE uname = '" + uname + "'";

Ваша проблема связана с запросом MySql, а не с ASP.NET.

Изменение: я настоятельно рекомендую вам использовать Entity Framework и LINQ для ваших проектов, проверьте их.

Если проект не так серьезен или вы хотите использовать старые способы вместо этого, вы должны параметризовать свои запросы: http://csharp-station.com/Tutorial/AdoDotNet/Lesson06

  • 0
    Я бы, конечно, не сказал «для любой деятельности базы данных в среде .NET». Хотя EF - зверь, это слишком много для многих проектов. Вы также должны рекомендовать использовать параметры вместо
  • 2
    @CamiloTerevinto Да, именно так. Но, учитывая, что код OP склонен к внедрению SQL, я предполагаю, что он является начинающим. Я просто пытаюсь направить его в правильном направлении. Не использовать EF специально является более сложным решением. В любом случае отредактировал мой ответ, спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню