Unabhängig davon: bitte mal einen Blick drauf werfen, ich hab' sicher noch den ein oder anderen Fehler drin.
Verbindung zur Datenbank in eigenes Skript auslagern, dieses einbinden.
Wird insgesamt kürzer und richtiger.
1a)
bei der Gelegenheit auch die Kodierung setzen.
The character set must be set either at the server level, or with the API function mysqli_set_charset()
Benutzernamen, Passwörter immer trimmen.
Benutzername immer in Kleinbuchstaben;
$query = sprintf(
"INSERT INTO users (username, password)
SELECT * FROM (SELECT '%s', '%s') as new_user
WHERE NOT EXISTS (
SELECT username FROM users WHERE username = '%s'
) LIMIT 1;",
$mysqli->real_escape_string($_POST['f']['username']),
$mysqli->real_escape_string($_POST['f']['password']),
$mysqli->real_escape_string($_POST['f']['username'])
);
$mysqli->query($query);
Hm.
$query = 'INSERT INTO users (
username,
password
) VALUES (
"'.$mysqli->real_escape_string($_POST['f']['username']).'",
"'.$mysqli->real_escape_string($_POST['f']['password']).'"'
);
$mysqli->query($query);
müsste reichen, denn wenn der Spalteindex unique ist, dann schmeisst mysqli einen auswertbaren Fehler. Ist für mich perfekt genug.
L)
Kann ich Dir meine Variante schicken (tar.gz)? Die ist zwar noch nicht perfekt, auch mit dem ungeliebten mysql- statt mysqli - funktioniert aber schon prächtig.
Ich erweitere die gerade um eine "Passwort-vergessen-Funktion" und um eine Funktion für die Prüfung der Komplexibilität.
Und nein. Ich benutze nicht crypt, sondern hash mit sha256 (liefert vertrauenserweckende, gegen openssl geprüfte, also in anderen Sprachen wiederholbare Ergebnisse - was mir wichtig ist) und einen Salt aus allen druckbaren ASCII-Zeichen mit einstellbarer Länge (default:32). Auch die Iterationen (default:50000) lege ich (oder der Anwender) fest.
Jörg Reinholz