有什么办法可以修复 VBNET 中的这个错误?

时间:2021-04-17 16:13:04

标签: mysql vb.net

我正在开发一个不和谐的机器人。

我目前正在处理登录面板(经典的 MySQL 登录方式,使用 SELECT 语句。)。

但是我已经开始做一个叫做 2FA 的事情,它的工作方式如下:如果登录成功,应用程序应该将 readytotwofactor 列(在 MySQL 中)设置为 {{1} }.如果为真,discord bot 会生成一个 10 个字母的代码,该代码出现在 true 列中。 BOT 通过观察登录时在 TextBox 中输入的用户名知道将消息发送给谁。它在 MySQL 中查找,并且每列(注册用户名)都与一个不和谐 ID 相关联。基于此,BOT 知道将 MySQL 列中检查的代码发送给谁,应用程序可以识别代码是否正确。发送代码后,twofactorcode 列将自动更改为 readytotwofactor,而我编写的代码应该将 false 列中的值更改为 twofactorcode

不过,我的问题是它不起作用。

这是源代码:(0 是登录表单,Form3 是 2FA 表单。)。

Form4

Imports MySql.Data.MySqlClient

Public Class Form3

    Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
        Dim connection As New MySqlConnection("just the login stuff")

        Dim command As New MySqlCommand("SELECT * FROM karolyguilogin WHERE username=@username AND pass=@password", connection)

        command.Parameters.Add("@username", MySqlDbType.VarChar).Value = TextBox1.Text

        command.Parameters.Add("@password", MySqlDbType.VarChar).Value = TextBox2.Text

        Dim command1 As New MySqlCommand("UPDATE `karolyguilogin` readytotwofactor SET readytotwofactor=@readytotwofactor WHERE username=@username", connection)

        Dim Adapter As New MySqlDataAdapter(command)

        Dim table As New DataTable()

        Adapter.Fill(table)

        connection.Open()
        If TextBox1.Text = "" Then
            MessageBox.Show("írj be valamit!")
            Me.Close()
        End If

        If TextBox2.Text = "" Then
            MessageBox.Show("írj be valamit!")
            Me.Close()
        End If




        If table.Rows.Count() <= 0 Then

            MessageBox.Show("Helytelen felhasználónév, vagy jelszó!")


        Else


            command1.Parameters.Add("@readytotwofactor", MySqlDbType.VarChar).Value = "true"


            MessageBox.Show("Hamarosan megkapod a 2FA kódod!")

            Me.Hide()

            Form4.Show()

            Me.Close()

            End If

        connection.Close()

    End Sub
End Class

1 个答案:

答案 0 :(得分:0)

首先,密码不应以纯文本形式存储。我希望您为简洁起见省略了加密代码。

在 ADO.net 中,需要处理连接和命令,而不仅仅是关闭。即使出现错误,Using 块也会为您处理此问题。

不要拉下整个记录。你只需要知道它是否存在。您不需要 DataAdapter 来执行此操作。

在创建任何数据库对象之前,请在 Using 块之外进行验证。另外,当您关闭表单时,您如何期望用户“输入内容”?

对第二个查询使用相同的命令,只需更改 CommandText。请注意,我们已经有了 @username 参数,不需要 @readytotwofactor 参数,因为它可以硬编码在 sql 字符串中。

为什么隐藏表单然后在两行之后关闭它?

也许您的代码不起作用,因为您从未执行过第二个命令。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    'Validate first before the database code
    If TextBox1.Text = "" OrElse TextBox2.Text = "" Then
        MessageBox.Show("írj be valamit!")
        Exit Sub
    End If
    Dim ReturnCount As Integer
    Using connection As New MySqlConnection("datasource=sql11.freemysqlhosting.net;port=3306;username=sql11396664;password=eG1IbxNzLR;database=sql11396664"),
            command As New MySqlCommand("SELECT Count(*) FROM karolyguilogin WHERE username=@username AND pass=@password", connection)
        command.Parameters.Add("@username", MySqlDbType.VarChar).Value = TextBox1.Text
        command.Parameters.Add("@password", MySqlDbType.VarChar).Value = TextBox2.Text
        connection.Open()
        ReturnCount = CInt(command.ExecuteScalar())
        If ReturnCount = 0 Then
            MessageBox.Show("Helytelen felhasználónév, vagy jelszó!")
        Else
            command.CommandText = "UPDATE `karolyguilogin` readytotwofactor SET readytotwofactor='true' WHERE username=@username"
            command.ExecuteNonQuery()
            MessageBox.Show("Hamarosan megkapod a 2FA kódod!")
            Form4.Show()
            Me.Close()
        End If
    End Using 'Closes and disposes both the command and the connection
End Sub

readytotwofactor 设置为 true 时,我假设数据库中有某种触发器。

您意识到您的更新会将 karolyguilogin 表中的所有记录设置为字符串“NULL”,而不仅仅是尝试登录的用户。如果这是一个多用户数据库,这可能会导致问题。

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    If TextBox1.Text = "" Then
        MessageBox.Show("írj be valamit!")
        Exit Sub
    End If
    Dim ReturnCount As Integer
    Using connection As New MySqlConnection("datasource=sql11.freemysqlhosting.net;port=3306;username=sql11396664;password=eG1IbxNzLR;database=sql11396664"),
        command As New MySqlCommand("SELECT Count(*) FROM karolyguilogin WHERE twofactorcode = @twofactorcode", connection)
        command.Parameters.Add("@twofactorcode", MySqlDbType.VarChar).Value = TextBox1.Text
        connection.Open()
        ReturnCount = CInt(command.ExecuteScalar())
        If ReturnCount = 0 Then
            MessageBox.Show("A kódod helytelen, próbálkozz újra!")
        Else
            command.CommandText = "UPDATE `karolyguilogin` SET twofactorcode='NULL' WHERE twofactorcode <> 'NULL';"
            MessageBox.Show("A kódod helyes! Beléphetsz a felületre!")
            Form1.Show()
            Me.Close()
        End If
    End Using 'Closes and disposes both the command and the connection
End Sub

我在翻译匈牙利语消息框时玩得很开心,所以我可以更好地理解您的代码。