【问题标题】:String to sqlsyntax字符串到 sql 语法
【发布时间】:2011-07-19 22:39:48
【问题描述】:

我有一个字符串:

string theUserId = Session["UserID"].ToString();

但我不知道如何将字符串添加到这个 sqlsnytax

    {
        if (Session["UserID"] != null) 
        {
            string theUserId = Session["UserID"].ToString();
            Label1.Text = Convert.ToString(theUserId);


        OdbcConnection cn = new OdbcConnection("Driver={MySQL ODBC 3.51 Driver}; Server=localhost; Database=gymwebsite; User=x; Password=x;");
        cn.Open();
        OdbcCommand cmd = new OdbcCommand("SELECT User.FirstName, User.SecondName, User.Aboutme, User.DOB, Pictures.picturepath FROM User LEFT JOIN Pictures ON User.UserID = Pictures.UserID WHERE User.UserID=@UserID"), cn);

        cmd.Parameters.AddWithValue("@UserID", theUserId);

        OdbcDataReader reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            Name.Text = String.Format("{0} {1}", reader.GetString(0), reader.GetString(1));
            Aboutme.Text = String.Format("{0}", reader.GetString(2));
            Age.Text = String.Format("{0}", reader.GetString(3));
            Image1.ImageUrl = String.Format("{0}", reader.GetString(4));
        }


    }
}
}

User.UserID=1 如何将其更改为 User.UserID="theUserId"

【问题讨论】:

  • @Brandon 根据要求给出了正确答案;但是,有几点需要注意。首先,“theUserId”需要在执行前进行清理。就目前而言,这上面写满了 SQL 注入。其次,我不确定你也传递这个是什么,但看起来确实有人需要把它撕掉。您可能想在 codereview.stackexchange.com 上发布一些代码
  • @ukhardy,已删除。 WraithNath 基本上有相同的答案,没有所有的噪音。我删除了我的并赞成他的。
  • 谢谢布兰登,我会效仿的。

标签: c# asp.net mysql sql html


【解决方案1】:

请参阅以下内容。要注意的第一件事是 USING 子句,它将清理您的连接。要么使用这些,要么必须将所有内容包装在 try .. catchs 中并进行适当的处​​理调用。

if (Session["UserID"] != null) 
{
    string theUserId = Session["UserID"].ToString();
    Label1.Text = Convert.ToString(theUserId);

    using (OdbcConnection cn = new OdbcConnection("Driver={MySQL ODBC 3.51 Driver}; Server=localhost; Database=gymwebsite; User=root; Password=commando;")) {
        cn.Open();
        using (OdbcCommand cmd = new OdbcCommand("SELECT User.FirstName, User.SecondName, User.Aboutme, User.DOB, Pictures.picturepath FROM User LEFT JOIN Pictures ON User.UserID = Pictures.UserID WHERE User.UserID=@UserID", cn)) {

            cmd.Parameters.AddWithValue("@UserID", theUserId);

            using (OdbcDataReader reader = cmd.ExecuteReader()) {
                while (reader.Read())
                {
                    Name.Text = String.Format("{0} {1}", reader.GetString(0), reader.GetString(1));
                    Aboutme.Text = String.Format("{0}", reader.GetString(2));
                    Age.Text = String.Format("{0}", reader.GetString(3));
                    Image1.ImageUrl = String.Format("{0}", reader.GetString(4));
                }
            } // using reader
        } // using cmd
    } // using connection
}

【讨论】:

    【解决方案2】:
    string theUserId = Session[ "UserID" ].ToString();
    
    OdbcCommand cmd = new OdbcCommand(
          "SELECT User.FirstName, User.SecondName, User.Aboutme, User.DOB, Pictures.picturepath FROM User LEFT JOIN Pictures ON User.UserID = Pictures.UserID WHERE User.UserID=@UserID" 
        ), cn);
    
       cmd.Parameters.AddWithValue("@UserID", theUserId);
    

    您可以使用@Parameter 名称定义参数,然后使用 .Parameters.AddWithValue 添加它们

    这比 string.format 或自己连接字符串安全得多

    【讨论】:

    • 我在线上遇到错误,cn);这真的很奇怪,因为这是我在字符串中添加的be4吗? iv 重新编辑,以便您可以看到
    • @Garrith,不,它以前不起作用。在您发布的示例中,您的字符串后面有一个额外的结束 )。删除它。
    【解决方案3】:

    你在寻找这样的东西吗?

    string.Format("SELECT User.FirstName, User.SecondName, User.Aboutme, User.DOB, Pictures.picturepath FROM User LEFT JOIN Pictures ON User.UserID = Pictures.UserID WHERE User.UserID={0}" , 用户 ID);

    【讨论】:

      【解决方案4】:
       WHERE User.UserID = $UserID
      

      然后将一个名为“$UserID”的参数添加到您正在使用的 Command 对象中,它会在您执行查询时获取该值。

      请注意,我不确定您为 MySQL 使用的是什么驱动程序,我认为参数必须以 $ 为前缀,但我不能 100% 确定。在 SQL Server 中,它是 @

      【讨论】:

      • 这个问题被标记为MySQL。有用于 .NET 的托管 MySQL 驱动程序,我以前使用过。我假设海报使用的是 MySQL。
      • 是的。但是 $UserId 表示法是特定于 php 的,而不是 MySql 语法。 MySql 使用与其他 RDBM 相同的变量语法。例如:@UserId 更多信息请参见dev.mysql.com/doc/refman/5.0/en/user-variables.html
      • 它不是特定于 PHP 的。早在 1.1 天,由 MySQL AB 赞助的 MySQL 驱动程序需要的不是 @ 字符。我只是不记得是哪一个了。如果他们将其标准化为@,那就太好了。已经有一段时间了。
      • @kprobst:我会给你做个交易。如果您可以指向 any MySQL 文档,该文档使用 $ 符号表示不参与 php 字符串替换的变量,无论版本如何,那么我会很乐意吃乌鸦并改变我的投票。 ;)
      • 这不会发生,抱歉。我不太关心你的投票,浪费我的时间去挖掘你声称我正在编造的东西。干杯。
      猜你喜欢
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 2015-06-21
      • 2014-10-28
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多