Doppelten Benutzer-Namen in Datenbank verhindern

Pilow

Neuer Benutzer
Beiträge
4
Auf meiner Website sollen Benutzer ihre persönlichen Daten in einem Formular ändern können - und zwar auch den Datenbank-Eintrag 'User', solange sie dort nicht den User-Namen eines anderen Benutzers eintragen. Nach der Eingabe soll dann überprüft werden, ob der eingegebene Name nicht schon in einem Datensatz vorkommt - außer dem des Benutzers natürlich. (Seine 'id' ist bekannt: $id.) Auch mit viel googelen bin ich nicht dahinter gekommen, was in folgendem Code bei den Fragezeichen stehen sollte:
PHP:
<?php   
if ($_SERVER['REQUEST_METHOD'] == 'POST'){
   $username=$_POST['user'];
   $sql="SELECT id FROM $members WHERE user='$username'";
   if ( ??????? ){       
      $error="Der neue Benutzername existiert bereits.";}
?>
 
Werbung:
Also angenommen in user / $username steht der neue Name.
Was wird dann in ID stehen, wenn das Select ausgeführt wird? Die ID eines existierenden Users.
Natürlich nur, wenn einer existiert.
Du musst also das SQL ausführen und prüfen, ob das Ergebnis leer ist (kein Datensatz) oder nicht.
Dann entsprechend der Prüfung weiter machen. Änderung akzeptieren oder abbrechen.
 
Wenn der Benutzer seinen Username nicht geändert hat, wird das Ergebnis sein, daß ein Datensatz mit $username besteht (nämlich der seinige).
 
Tja, anhand des Codeschnippsels kann ich das nicht beurteilen, Du hast bestimmt mehr davon.
Ich weiß nicht, was in username drin steht. Hätte angenommen, dass ein Dialog zur Änderung des Usernamens entweder einen leeren Usernamen ergibt oder eben einen neuen.
Aber egal, wenn alter und neuer Usernamen gleich sind, musst Du ja auch gar nichts machen.
 
Nach einigem Rumprobieren habe ich die (eigentlich recht simple) Lösung meines Problems gefunden. Hier der Code:
PHP:
$username=$_POST['user'];
$sql="SELECT id FROM $members WHERE user='$username'";
$result=mysqli_query($conn,$sql);
$row=$result->fetch_assoc();
if ($row['id']!==$id){
   $error.="Benutzer '".$username."' existiert bereits.<br>";}
Die Lösung steckt in der vorletzten Zeile.
 
Nach einigem Rumprobieren habe ich die (eigentlich recht simple) Lösung meines Problems gefunden.
… und hast gleich eine (bzw. zwei) Sicherheitslücke eingebaut: Daten dürfen nicht einfach in einen Query eingebaut werden, du musst Kontextwechsel behandeln! Ich würde zudem dazu raten PDO für den Datenbankzugriff zu verwenden, es gibt keinen Grund sich mit MySQLi zu quälen.
 
Vielen Dank für die Hinweise. Allein: Ich habe keine Ahnung von 'Kontextwechsel' und 'PDO' und zweifle, ob ich mir in meinem Alter (84) noch die nötige Kenntnis davon aneignen sollte.
 
Werbung:
Ich habe keine Ahnung von 'Kontextwechsel' und 'PDO' und zweifle, ob ich mir in meinem Alter (84) noch die nötige Kenntnis davon aneignen sollte.
PDO muss nicht unbedingt sein (auch wenn es einiges erleichtert), mit dem Thema Kontextwechsel solltest du dich aber dringend beschäftigen, mit nicht behandelten Kontextwechseln hast du ganz schnell eine Sicherheitslücke! Und nein, "keine Ahnung" ist kein Grund, es hat schon seinen Grund dass ich das Wort in #6 verlinkt habe.
 
Zurück
Oben