我怎样才能使它只有登录用户才能查看他自己的成绩?

Posted

技术标签:

【中文标题】我怎样才能使它只有登录用户才能查看他自己的成绩?【英文标题】:How can I make it so only the logged in user view his own grade? 【发布时间】:2019-07-21 14:42:01 【问题描述】:

This is the student info table where the student info comes from //这是用户的登录代码,它从学生信息表中获取用户登录信息。

private void btnlogin_Click(object sender, EventArgs e)

        i = 0;
        con.Open();
        mysqlCommand cmd = con.CreateCommand();

        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "select * from stdinfotable WHERE Username='" + textuser.Text + "' and Password= '" + textpass.Text + "'";
        cmd.ExecuteNonQuery();

        DataTable dt = new DataTable();
        MySqlDataAdapter dta = new MySqlDataAdapter(cmd);
        dta.Fill(dt);

        i = Convert.ToInt32(dt.Rows.Count.ToString());

        if(i==0)
        
            MessageBox.Show("Error");
        
        else
        
            this.Hide();
            StudentPage f = new StudentPage();
            f.Show();
            MySqlDataAdapter data = new MySqlDataAdapter("ViewAllGrades", con);
            data.SelectCommand.CommandType = CommandType.StoredProcedure;
            DataTable dtTable = new DataTable();

            data.Fill(dtTable);
            dtTable.Select("Last_Name");

            f.stdGrade.DataSource = dtTable;
            f.stdGrade.Columns[0].Visible = false;
        

        con.Close();

这是返回成绩信息的ViewlAllGrades存储过程

 CREATE DEFINER=`root`@`localhost` PROCEDURE `ViewAllGrades`()
 BEGIN
    SELECT * 
  FROM  Grades;

  END

我正在努力做到只有登录用户才能查看自己的成绩,而不是查看每个用户的成绩。所以我想知道我应该尝试在存储过程中还是在 Visual Studio 中做,我将如何实现这样的事情?此外,我的 ID 主键来自两个表都是自动递增的,所以我不一定要使用这些

【问题讨论】:

这个问题没有足够的信息,并且标签不正确,请更新您的问题添加更多细节。不要在数据库中存储普通密码,永远不要!谷歌关于该主题,例如散列密码。此外,您应该尝试更好地组织代码并为变量赋予有意义的名称。 @Manuel 怎么样?所有标签都是正确的,我使用的每个标签都与我的代码有关。另外,我还可以添加哪些其他详细信息? 像 mysql 和 mysql-workbench 之类的标签在这里并不是必需的,但是除了标签之外,您共享的代码似乎已经按照您所说的做了,在 else 语句中您已经填充了一个表,是代码没有产生预期的效果? @Manuel 没有代码工作,但不是我想要的方式。当用户使用他的凭据登录时,他应该只查看自己的成绩,而不是我需要帮助的其他所有人。我只是希望登录的用户能够查看他自己的信息。 我明白了,您需要按用户 ID 运行查询过滤。不要使用存储过程读取数据,使用 select 语句。当您对用户进行身份验证时,您会返回一个行列表,理论上应该只有一个。检查表 stdinfotable ,查找 ID 并使用该 ID 过滤表成绩 【参考方案1】:

现在您的存储过程正在选择所有成绩。首先要做的是参数化查询,接受用户作为输入,并使用 WHERE 子句仅查找该学生的成绩。如果没有看到您的表格,我无法确切地告诉您这会是什么样子,但举个例子:SELECT * FROM Grades WHERE StudentId = @StudentId;

您需要弄清楚的第二件事是如何获取当前用户的学生ID,然后将其传递给存储过程。再一次,没有看到你的桌子,我很难猜到。看来您已经拥有当前用户的用户名。您是否能够运行查询以从用户名中找到 studentId?如果是这样,那么您首先需要以用户名作为参数运行该过程以获取 studentId。

第三个问题是您的第一个查询。由于没有参数化,容易受到SQL注入攻击。这带来了重大的安全风险。如果有人恶意输入用户名或密码,他们可以转义您打算运行的 SQL 并删除所有表。

希望对您有所帮助!

【讨论】:

我刚刚放入了studentinfo表

以上是关于我怎样才能使它只有登录用户才能查看他自己的成绩?的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能使它在查看器放大和缩小时不会调整 Edit2D 线的大小?

UIImagePickerController 允许选择方形图像。但是我怎样才能使它成为 16:9?

我怎样才能得到卖家的产品

windows 窗体刷新 - 我怎样才能使它更平滑?

UICollectionView 太宽。我怎样才能使它成为设备的宽度?

PHP:Tank Auth,需要特定的电子邮件地址才能登录