如何在C#ASP.NET Core中从没有id的MySql中选择一个项目

问题描述 投票:0回答:2

我试图在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'

我该如何解决?

c# mysql asp.net
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;
}

虽然我在这里,但确实看起来像是以纯文本形式存储密码。在any list of security sins中,SQL注入位于顶部,而纯文本密码很快就会出现。


0
投票

在您的查询中尝试此操作:

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

你的问题是MySql查询而不是ASP.NET。

编辑:我强烈建议您为项目使用Entity Framework和LINQ,检查它们。

如果项目不是那么严重,或者您想要使用旧方法,那么您应该参数化您的查询:http://csharp-station.com/Tutorial/AdoDotNet/Lesson06

© www.soinside.com 2019 - 2024. All rights reserved.