Benutzername nich Doppelt (Regist.)

VanHellsehn

Erfahrenes Mitglied
Hi,
Ich habe mir ein kleines Registrations Script gebastellt nur leider bekomme ich es nicht hin das ein Benutzername nur einmal Vorkommen darf.
Ich habe es mal mit folgendem Script versucht :

PHP:
$abfrage=mysql_query("SELECT Nickname FROM benutzerdaten WHERE Nickname = $benutzer[0]['Nickname']");
$ergebnis=mysql_num_rows($abfrage);
if($ergebnis == 0){

Nur leider erscheint dort der Error :
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /usr/export/www/vhosts/funnetwork/hosting/vanhellsehn/3.php on line 47

Line 47 = $ergebnis=mysql_num_rows($abfrage);

Habt ihr ne Idee woran es liegen kann ?
Oder habt ihr noch ne andere IDee wie man es machen könnte ?

Mfg,
Marv
 
Zuletzt bearbeitet:
PHP:
"SELECT Nickname FROM benutzerdaten WHERE Nickname = '".mysql_real_escape_string($benutzer[0]['Nickname'])."'"
 
Sorry aber ich bin erstens ein bisschen schwer von Begriff zweitens weiß ich nich was du meinst.
PHP:
$abfrage=mysql_query("SELECT Nickname FROM benutzerdaten WHERE Nickname = '".mysql_real_escape_string($benutzer[0]['Nickname'])."'"  ;
$ergebnis=mysql_num_rows($abfrage);
 
Um es mal zu verdeutlichen - Folgendes ist gültig:
SQL:
SELECT Nickname FROM benutzerdaten WHERE Nickname = 'gewählter Name'
Das hier jedoch nicht:
SQL:
SELECT Nickname FROM benutzerdaten WHERE Nickname = gewählter Name

Wie du am Highlighting siehst, ist das schon nen großer Unterschied.
Das liegt an der Grammatik von MySQL, die vorschreibt, dass Strings und andere Eingaben mit einfachen Quotationmarks zu kennzeichnen sind. Dies trifft nicht auf numerische Indizies, Zahlenwerte (optional, bei numerischen Werten auf numerischen Indizies jedoch Pflicht - Siehe SET oder ENUM) und Schlüsselwörter zu.

Weiterhin würde ich eher COUNT empfehlen, da die Abfrage vermutlich durch den Optimizer schneller ablaufen kann und zudem auch weniger Daten zurückgegeben werden müssen, was es nochmals effektiver macht.
PHP:
$result = mysql_query( "SELECT COUNT(*) FROM benutzerdaten WHERE Nickname = 'gewählter Name';" );
list( $ergebnis ) = mysql_fetch_row( $result );
 
Das was du angesprochen hattest mit Nickname nur einmal in der Tabelle vorkommen.
Setz das Nickanme-Feld ind er Tabelle einfach auf UNIQUE.
Schon kann der eintrag in der Spalte nur einmal existieren ;)
 
Wenn ich das jetzt mit
PHP:
$result = mysql_query( "SELECT COUNT(*) FROM benutzerdaten WHERE Nickname = '$nickname';" );
list( $ergebnis ) = mysql_fetch_row( $result );

mache dann ist doch in der Variablen $ergebnis die anzahl der Leute die den gleichen namen haben oder ?
 
Korrekt. Ich empfehle dir, wie Gumbo es auch schon indirekt getan hat, zur Verwendung von [phpf]mysql_real_escape_string[/phpf] auf $nickname, da ein ungeprüfter Wert zu nicht mehr funktionierenden Queries führen kann.

Gabriel: Selbst dann müsste wenigstens ein Errorcode abgefangen und überprüft werden, so gesehen ist die UNIQUE-Kennzeichnung eher für MySQL-interne Operationen sinnvoll (zB on duplicate key update) als für Abfragen von außen, bei denen absichtlich ein Fehler provoziert wird. Nicht nur dass eine Rückverfolgung auf den ursprünglichen Fehler schwerer ist, füllen sich eventuelle Fehlerlogs, die Platz rauben und die Ausführung ausbremsen durch das Schreiben ins Filesystem, und letztenendes hat man doch mehr Kontrolle via ordentlicher Abfrage.
 
Zurück