Zum einen ist dieser Code anfällig für SQL-Injektion - Sie sollten stattdessen vorbereitete Anweisungen mit Platzhaltern verwenden. Sie holen auch das Ergebnis, das nicht verwendet wird - so können Sie die mysqli_fetch_assoc()
innerhalb dieser Funktion loswerden.
Ihr tatsächliches Problem ist jedoch ein Dollar-Zeichen fehlt vor Ihrer $sql
und die Logik hier if(!mysqli_num_rows($result) == 1) {
ist invers. Wenn es ein Ergebnis gibt, erhalten Sie im Grunde !1 == 1
, was falsch ist (wie !1
wird 0
, so erhalten Sie 0 == 1
). Der umgekehrte Operator !
hatte also das Ergebnis umgekehrt.
ein bisschen, Gereinigt die logische Ausgabe und hinzugefügt vorbereitete Anweisungen festgelegt, wie dies
function username_exists($username, $con){
$stmt = $con->prepare("SELECT * FROM admin WHERE username = ?");
$stmt->bind_param('s', $username);
$stmt->execute();
$stmt->store_result();
$num_rows = $stmt->num_rows;
$stmt->close();
return $num_rows == 1 ? true : false;
}
jetzt true
zurückkehren würde diese Funktion aussehen würde, wenn der Benutzername in der Datenbank gefunden wird. Sie sollten nun diese Funktion wie
if (!username_exists($_POST['username'], $con) {
/* Do the insert to the database here */
} else {
/* The username was taken!
Don't perform the INSERT query */
}
verwenden, wenn Sie den $username
Parameter an die Funktion übergeben, verwenden Sie den rohen Benutzername (nicht verwenden mysqli_real_escape_string()
auf es hier, da wir vorbereitete Anweisungen verwenden).
Vielleicht wollen Sie auch in Hinzufügen der UNIQUE
Einschränkung für Ihre Benutzernamen-Spalte in der Datenbank suchen.
Ich würde riskieren Sie die Argumente in der falschen Reihenfolge an Ihre Funktion sind vorbei. Sie können versuchen, die Verbindung zu tippen, um sicher zu sein: 'Funktion username_exists ($ username, mysqli $ con)' –