PHP/MySql wie überprüfen ob Nutzername bereits vergeben?


25.07.2022, 18:50
So hab ich es mir vorgestellt

if(  Irgendwas...  ){
  $sql = "INSERT INTO user (username,password,cash) VALUES (:username,:password,:cash) ";
  $sqlvars = array("username" => $username,
  "password" => $password,
  "cash" => $cash);
  $Abfrage = $conn->prepare($sql);
  $Abfrage->execute($sqlvars);

}else{
echo "<script>alert("Bereits vergeben")</script> ";
}

3 Antworten

Am besten wäre es, wenn in deiner Datenbank das Feld "username" UNIQUE wäre, also die Datenbank selber prüfen kann, ob es den Namen schon mal gibt. Dann wird eine entsprechende PDOException geworfen. Auch könnte der Wert für Cash ein Default-Wert in der Tabellenstruktur sein.

Auch würde ich nicht $_POST verwenden, sondern mit filter_input() arbeiten und sehen, ob im Benutzernamen irgendwelche Zeichen stehen, die da nicht hingehören. Also nur Buchstaben, Zahlen und einige Sonderzeichen wie Bindestrich / Unterstrich zulassen.

Woher ich das weiß:Berufserfahrung – >10 Jahre Webentwickler
gfdsgsdgsdg 
Fragesteller
 25.07.2022, 19:10

Danke hab es mit Unique hinbekommen,

sondern mit filter_input() arbeiten und sehen, ob im Benutzernamen irgendwelche Zeichen stehen

Das macht doch das htmlspecialchar(stripslashes(trim))) gerüst oder ist filter irgendwie besser ?

0
Warpenstein  25.07.2022, 19:27
@gfdsgsdgsdg

Ja, sollte ausreichend sicher sein. Die filter_* Funktionen können aber viele Sachen so machen, ohne dass man x Funktionen aneinanderketten muss. Auch schmeißt dein Code eine Warning-Meldung, sollte $_POST['username'] mal nicht existieren. filter_input macht das nicht. Könnte auch sein, dass mal irgendein Linter deswegen meckert.

Auch ist die Change kleiner irgendwo eine Lücke zu bauen, z.B. weil man irgendwo spontan auf $_POST zugreift ohne Validierung. Wenn man immer filtert, hat man dieses Risiko nicht.

Ist aber halt eine Stil-Frage. Wie gesagt, dein Code sieht unbedenklich aus.

0
Wie würde ich das hier am besten mit einer If-Abfrage überprüfen bevor es etwas in die SQL Datenbank schreibt ?

Mit SELECT nach dem Nutzernamen suchen und in Abhängigkeit des Ergebnisses den Insert durchführen oder eben echo "User gibt es schon" ausgeben.

Alex

gfdsgsdgsdg 
Fragesteller
 25.07.2022, 18:59

Wie mache ich das ?

Also ich muss die ganze Spalte username aus der Tabelle user durchgehen und dann != $_POST["username"] oder wie ?
In Code würde ich das viel besser verstehen als in Komplizierten Sätzen, mir geht es nicht darum Code hier zu schnorren.

0
horsti98  25.07.2022, 19:06
@gfdsgsdgsdg

Naja SELECT * FROM users WHERE user LIKE (?) und der Parameter ist eben dein $_POST["username"] 

Dann anhand von num_rows überprüfen ob ein User mit dem Namen gefunden wurde

1
gfdsgsdgsdg 
Fragesteller
 25.07.2022, 19:12
@horsti98

Ich glaube ich lasse es bei UNIQUE in der Datenbank Das funktioniert schon.

In Sql und php bin ich nicht so fit

0

Die ID sollte das Attribut unique haben.

Ob ich mit SELECT ein Lookup auf dem Index mache, der dann wahr oder falsch ist, oder ob der Indexlookup als Teil der UNIQUE-Prüfung bei einem INSERT stattfindet, ist ziemlich egal.

Also Unique, einfach inserten und bei der Fehlerprüfung diesen Fall gesondert behandeln.

gfdsgsdgsdg 
Fragesteller
 26.07.2022, 01:55

Danke, Kannst du mir vielleicht noch bei einem passenden Login zu diesem code helfen ? Registrieren war ja noch vergleichsweise einfach.

Also wie genau vergleiche ich das jetzt ob username und password (gehasht mit salt) aus der Tabelle user

mit dem Post[username] password[password] übereinstimmen ?
dann muss ich doch erst password_verify(post[username], Password default) benutzen oder so ?
Und der rest ist auch sehr kompliziert

0
KarlRanseierIII  26.07.2022, 02:01
@gfdsgsdgsdg

Du kannst ein:

select password from users where id=....;

Da übergibst Du die übermittelt ID (bedenke Schutzmaßnahmen bezüglich injections).

Jetzt kannst Du das übermittelte Passwort und das Pwassworthash aus der DB an password_verify übergeben udn entsprechend agieren.

0
gfdsgsdgsdg 
Fragesteller
 26.07.2022, 02:10
@KarlRanseierIII

Wie meinst du das mit dem where id = …
Also bei einem Login System mit mehreren Usern glaub ich nicht das ich das so machen sollte

0
KarlRanseierIII  26.07.2022, 02:19
@gfdsgsdgsdg

Du führst ein query auf die DB mit der userid aus, um das pwhash zu erhalten. Danach prüfst Du das übermittelte Passwort gegen das Hash.

Anderfalls würdest Du das Passwort einer entsprechendne Funktion der DB übermitteln und diese das Hashen udn Vergleichen überlassen.

0