Sie überprüfen eigentlich nie zu sehen, ob der Benutzername vorhanden ist.
Sie definieren eine Abfrage hier:
cmd2.CommandText = cmd.CommandText = "SELECT username, password FROM test2 WHERE username = '" & TextBox1.Text & "' and password = '" & TextBox2.Text & "'"
aber nie die Abfrage auszuführen. Stattdessen führen Sie einfach die INSERT
Abfrage:
dr = cmd.ExecuteReader
So wird die INSERT
immer durchgeführt. Und da eine INSERT
Zeilen nicht zurückgibt, sehen Sie das Meldungsfeld nicht.
Das erste, was der erste, fixieren Sie Ihre SQL-Injection-Schwachstelle. (Personal Politik, ich weiß nicht wie SQL-injizierbare Code in einer Antwort zu schreiben.) Verwenden Sie Abfrageparameter anstatt direkt verketten Benutzereingabe als Code:
cmd2.CommandText = "SELECT * FROM test2 WHERE username = @Username"
cmd2.Parameters.Add("@Username", SqlDbType.VarChar, 50).Value = TextBox1.Text
dr = cmd2.ExecuteReader
If dr.HasRows Then
MsgBox("You're already registered")
Return
End If
Hinweis ein paar Dinge hier:
- Die Verwendung eines Abfrageparameters. Ich musste den Typ und die Größe der Spalte in der Datenbank erraten, passen Sie sie gegebenenfalls an.
- Nur Ausführen dieser Abfrage. Versuchen Sie nicht, beide Abfragen gleichzeitig auszuführen, führen Sie die erste aus und führen Sie dann die zweite aus.
- Sie brauchen nicht, oder sogar wollen, um das Passwort in diese Abfrage aufzunehmen. Sie überprüfen, ob der Benutzername bereits existiert, das ist alles.
Return
nach dem Anzeigen der Nachricht, so dass der Rest der Funktion nicht ausgeführt wird.
Dann, nachdem das geschehen ist, können Sie die INSERT
Operation durchführen:
cmd.CommandText = "INSERT INTO test2(Username,Password) VALUES(@Username,@Password)"
cmd.Parameters.Add("@Username", SqlDbType.VarChar, 50).Value = TextBox1.Text
cmd.Parameters.Add("@Password", SqlDbType.VarChar, 50).Value = TextBox2.Text
cmd.ExecuteNonQuery()
Dies wird die INSERT
Operation durchführen. Also, wenn die Return
oben nie getroffen wurde, dann ist der Benutzername eindeutig und kann eingefügt werden.
auch: Sie sollten keine Benutzerkennwörter im Klartext sein zu speichern. Dies ist grob unverantwortlich an Ihre Benutzer und stellt ihre privaten Daten an Angreifer. Stattdessen obscure the password with a one-way hash, so dass es nicht in seiner ursprünglichen Form gelesen werden kann.
Ein paar andere Dinge:
- Verwenden Sie aussagekräftige Variablennamen. Der Grund, warum Sie dieses Problem hatten, war, dass Sie zwischen
cmd
und cmd2
verwirrt waren. Wenn Ihre Variablennamen eine semantische Bedeutung haben, ist Ihr Code viel einfacher zu lesen und zu verstehen.
- Verwenden Sie the
Using
block, wenn Sie verfügbare Ressourcen wie eine Datenbankverbindung haben. Im Allgemeinen möchten Sie eine Datenbankverbindung in einem möglichst kleinen Umfang öffnen, verwenden und schließen. Offene Verbindungen zu lassen ist eine schlechte Sache.
Zeichne keine Zeichenketten, um SQL zu erstellen. Verwenden Sie SQL-Parameter. Ihr Code stürzt bei allen irischen und französischen Namen ab (zB: 'Mike O'Toole',' Joan D'Arc') und ist anfällig für SQL-Injection. Passwörter nicht als Klartext speichern; Hasch und salze sie. Ist das alles was du von einem neuen Benutzer brauchst ist ein Name und PW? Keine Email? Keine PW-Wiederherstellungsfrage? – Plutonix
Zusätzlich zu was Plutonix schrieb: 1) Sie sollten nur überprüfen, ob der Benutzername bereits in der Datenbank ist. 2) Sie sollten 'cmd.ExecuteNonQuery()' erst verwenden, nachdem Sie überprüft haben, ob der Benutzername bereits existiert. 3) Sie scheinen 'cmd' anstelle von' cmd2' zu verwenden, um die Überprüfung durchzuführen. –
Mmm. Hash und Salz. –