我正在开发一个不和谐的机器人。
我目前正在处理登录面板(经典的 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
答案 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
我在翻译匈牙利语消息框时玩得很开心,所以我可以更好地理解您的代码。