PHP/MySql wie überprüfen ob Nutzername bereits vergeben?
Wie würde ich das hier am besten mit einer If-Abfrage überprüfen bevor es etwas in die SQL Datenbank schreibt ?
<?php
$server = 'localhost';
$user = 'root';
$psw = null;
$dbName = 'TestDatenbank';
try {
$conn = new PDO('mysql:host='.$server.';dbname='.$dbName.';charset=utf8', $user, $psw);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// POST wird mit AJAX gesendet
$username = htmlspecialchars(stripslashes((trim($_POST["username"])))) ;
$password = password_hash(htmlspecialchars(stripslashes((trim($_POST["password"])))) ,PASSWORD_DEFAULT) ;
$cash = 100;
// Schreibt in die Datenbank
$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);
}catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
exit;
}
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.
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.
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
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.
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
Ich glaube ich lasse es bei UNIQUE in der Datenbank Das funktioniert schon.
In Sql und php bin ich nicht so fit
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.
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
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.
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
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.
Danke hab es mit Unique hinbekommen,
Das macht doch das htmlspecialchar(stripslashes(trim))) gerüst oder ist filter irgendwie besser ?