我试图在ASP.Net Core中使用用户名而不是id从mysql表中获取用户,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:'where子句'中的未知列'q'
我该如何解决?
你需要围绕值的单引号,如下所示:
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;
}
虽然我在这里,但确实看起来像是以纯文本形式存储密码。在any list of security sins中,SQL注入位于顶部,而纯文本密码很快就会出现。
在您的查询中尝试此操作:
string queryString = "SELECT * FROM users WHERE uname = '" + uname + "'";
你的问题是MySql查询而不是ASP.NET。
编辑:我强烈建议您为项目使用Entity Framework和LINQ,检查它们。
如果项目不是那么严重,或者您想要使用旧方法,那么您应该参数化您的查询:http://csharp-station.com/Tutorial/AdoDotNet/Lesson06