Я пытаюсь получить пользователя из таблицы 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"
Как я могу это исправить?
Вам нужны одинарные кавычки вокруг значений, например:
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-инъекция находится наверху, а вскоре появляются пароли с открытым текстом.
Попробуйте это в своем запросе:
string queryString = "SELECT * FROM users WHERE uname = '" + uname + "'";
Ваша проблема связана с запросом MySql, а не с ASP.NET.
Изменение: я настоятельно рекомендую вам использовать Entity Framework и LINQ для ваших проектов, проверьте их.
Если проект не так серьезен или вы хотите использовать старые способы вместо этого, вы должны параметризовать свои запросы: http://csharp-station.com/Tutorial/AdoDotNet/Lesson06