Armin: Mysql daten vergleichen mit variable funkioniert nicht !

Hallo ,
ich hoffe ihr könnt mir helfen bin gerade am verzweifeln..
Also ich habe folgendes Problem :
Ich habe in meiner MySql Datenbank eine Spalte namens nick wo wenn sich jemand auf meiner Seite registriert sein Nick gespeichert wird , natürlich will ich keine doppelten Nicks auf meiner Homepage haben und deshalb will ich jede Spalte von nick mit dem neu registriereten Nick vergleichen und dem User dann mitteilen das er eine doppelten Nick verwenden will ! Jedoch funktioniert das genze nicht so wirklich !
So sieht mein Code aus:

mysql_select_db("impwar")or die ("Datenbank wurde nicht gefunden");  
		$abfrage="SELECT * FROM `User` WHERE 1";  
		$ergebnis = mysql_query($abfrage);  
		$bool=true;  
		while($row=mysql_fetch_object($ergebnis)){  
			$nickrow="$row->nick";  
			echo "$nickrow";  
			$mailrow="$row->email";  
			if($nick==$nickrow){//HIER LIEGT MEIN PROBLEM !Er //vergleicht und selbst wenn sie gleich sind tut er nichts !$bool ist //ständig true !  
				$bool=false;  
				$meldung="Sie wollen einen bereits bestehenden Nick verwenden";  
			}else if($mail==$mailrow){  
				$bool=false;  
				$meldung="Sie wollen eine bereits vorhandene E-Mail Adresse verwenden";  
			}  
		}  

Ich hoffe er versteht mein eigentlich relativ simples Problem und könnt mir helfen !
Danke schon im Vorraus !
Grüße
Armin !

  1. Hallo,

    Ich habe in meiner MySql Datenbank eine Spalte namens nick wo wenn sich jemand auf meiner Seite registriert sein Nick gespeichert wird , natürlich will ich keine doppelten Nicks auf meiner Homepage haben

    Statt alle Datensätze anzufordern und anschließend zu vergleichen, wäre es viel cleverer, nur die Datensätze anzufordern, die den gewünschten Benutzernamen enthalten. Sind dies keine, so gab es den Benutzer noch nicht.

    Statt

    $abfrage="SELECT * FROM User WHERE 1";

    verwende

    $abfrage="SELECT nick FROM User WHERE nick = '"
          . mysql_real_escape_string($nick) . "'";

    Besser ist der Zugriff auf die entsprechende superglobale Variable ($_POST)

    Gibt es mehr als 0 Datensätze, so gab es den Nick bereits ...

    Noch cleverer ist folgende Vorgehensweise:

    Füge zur Spalte nick einen UNIQUE Index hinzu, nun lässt MySQL in der Spalte nick keine doppelten Werte zu.
    Prüfe überhaupt nicht, ob der Nickname bereits vorhanden ist, sondern versuche gleich, den neuen Datensatz einzufügen.
    Rechne damit, dass es dabei zu Fehlern kommt.
    Tritt keiner auf, dann ist der Benutzer erfolgreich mit seinem Wunschnick angemeldet.
    Tritt ein Fehler auf und ist der aufgetretene Fehler eine Schlüsselverletzung in der Spalte nick, so wurde der Nick bereits registriert und Du kannst nun dem Benutzer die entsprechende Rückmeldung geben, dass er sich einen anderen Nick suchen muss.

    Freundliche Grüße

    Vinzenz

    1. Danke für die sehr hilfreiche Antwort , das ist genau was ich gesucht habe !

      Füge zur Spalte nick einen UNIQUE Index hinzu, nun lässt MySQL in der Spalte nick keine doppelten Werte zu.

      Arbeite erst seit 1 Woche mit Mysql und bin grad dabei mich einzulesen , deswegen bin ich mit dem ganzen noch nicht so vertraut !
      Und ja nochmal vielen Danke für die Antwort !:)

      Grüße

      Armin

      1. Hello,

        Danke für die sehr hilfreiche Antwort , das ist genau was ich gesucht habe !

        Füge zur Spalte nick einen UNIQUE Index hinzu, nun lässt MySQL in der Spalte nick keine doppelten Werte zu.

        Anders wäre es auch falsch, weil Du Dir damit eine Race-Condition bauen würdest.
        Diese führen dann unweigerlich irgendwann zur Inkonsistenz (ich wollte ebenh schon Inkontinenz schreiben) des Datenbestandes. Es darf ja in Deinem Anwendungsfall keine zwei User mit demselben Nick geben.

        Zwischen dem Select für die Kontrolle und dem anschließenden Insert vergeht aber Zeit. In dieser Zeit könnte schon ein anderer Prozess einen Eintrag gemacht haben, sodass Du dann nachher mehrere gleiche Einträge in der Tabelle hättest. Die Kontrolle und das Eintragen müssen daher atomar gebunden werden, also so, dass kein anderer  Prozess dazwischen schlüpfen kann. Das geht entweder mit zwei Statements, aber indem man die Tabelle solange sperrt für andere Prozesse, oder aber, wie Vinzenz es vollkommen richtig vorgeschlagen hat, indem man die Kontrollfunktion (Constraint) gleich dem DBMS überträgt, also in der Tabelle vermerkt, dass im Moment des Eintragens geprüft werden muss, ob er zulässig ist.

        Durch Abfrage des Results des Insertstatements und/oder des von der Datenbankmaschine gelieferten Statuswertes kann man dann feststellen, ob der Eintragswunsch gültig war, oder abgelehnt wurde.

        http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use
        http://en.wikipedia.org/wiki/Race_condition

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de