Unique Usernames
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abschicken
aufgefallen
eintragen
ende
extra
fehlermeldung
formular
hinsicht
kleinbuchstaben
langsamer gehen
nutzen
reagieren
rechenzeit
registrierung
sorgen
spalte
spalten
tabelle
verwendung
vorteil
-
In MySQL-Tabellen kann man Spalten ya als "unique" deklarieren, mir ist aber aufgefallen, dass diese Option Case-Sensitive ist. Das ist ein bisschen unpraktisch, weil wenn ich einen User "KarlHeinz" habe, könnte sich ein anderer unter dem Namen "karlheinz" anmelden. Gibt es da eine einfache MySQL-Lösung für, oder muss ich dazu per PHP ein Script erstellen, dass erst alle Datensätze einzelnt auf Übereinstimmung prüft ?
Liebe Grüße
- VampireSilence -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Kommt auf die Kollaktion der DB an:
"_cs" ist case-sensitive, "_ci" case-insensitive.
Also latin1_general_ci bräuchteste dann, oder? -
Ansonsten kannst du auch einfach den Benutzernamen bei der Registrierung vor dem Eintragen in die Datenbank mit strtolower() eben in Lower Cases umwandeln, und hast dann nur Kleinbuchstaben in der gesamten Benutzernamen-Spalte. Dann wird das Ganze auch unique.
Ich halte das aber insgesamt für keine gute Idee, was du vorhast.
Vielmehr würde ich beim Abschicken des Registrierungsformulars ein Query an die DB senden und bei 0 Rückgabewerten eben keinen Fehler ausgeben (= der Name ist noch nicht belegt).
Natürlich kann dann dabei das Feld auch noch unique sein, muss aber nicht.
Auch da solltest du dich dann aber auf Lower Cases einigen.
gruß
ferdinand24 -
Genau das hatte ich ya befürchtet. Also deine zweite Idee. Ich würde eigtl schon gerne Großbuchstaben ermöglichen, aber ich hatte gehofft, da gibt es eine elegantere Lösung. Dann teste ich das einfach mal.
EDIT: Habe die User-Spalte nun in die Kollation "utf8_general_ci" umgewandelt. Das funktioniert soweit eigtl genau wie ich mir das vorstelle, also werde ich das erstmal so lassen.
Liebe Grüße
- VampireSilence
Beitrag zuletzt geändert: 25.5.2009 0:37:58 von vampiresilence -
Solange deine Collation "ci" ist, solltest du einfach vor dem Eintragen bei der Formular-Überprüfung einfach mit LIKE und ohne extras auf den Namen prüfen. CI hat ja gerade den Vorteil das man nicht erst toLowerCase oder ähnliches nutzen muss. Wichtig nur das keine Leerzeichen vorne und hinten mitgeliefert wurden ;)
Wenn du unbedingt auf "unique" noch gehen willst, dann bekommst beim einfügen eh eine Fehlermeldung auf die du reagieren solltest. -
Wichtig nur das keine Leerzeichen vorne und hinten mitgeliefert wurden ;)
Klar, alle Namen sind grundsätzlich getrimmt, sonst könnte ya auch nen " karlheinz " daher kommen. Ne ne, dafür ist gesorgt. ;)
Solange deine Collation "ci" ist, solltest du einfach vor dem Eintragen bei der Formular-Überprüfung einfach mit LIKE und ohne extras auf den Namen prüfen.
Aber wozu "LIKE" ? Habs grade mit "=" drin und es funzt genau so wie es soll.
CI hat ja gerade den Vorteil das man nicht erst toLowerCase oder ähnliches nutzen muss.
TLC wollte ich ya gezielt vermeiden, um hier keine Rechenzeit zu vergeuden.
Wenn du unbedingt auf "unique" noch gehen willst, dann bekommst beim einfügen eh eine Fehlermeldung auf die du reagieren solltest.
Ich hab bis auf zwei Fälle schon alles abgefangen. Das einzige was am Ende noch bleibt ist, dass die DB-Server down sind, oder das eben gegen eine unique-coloumn verstoßen wird, das passt schon.
Liebe Grüße
- VampireSilence -
@like: Klar geht es auch mit =, bin halt LIKE gewohnt bei Strings zu nutzen wobei halt = auch funktioniert und meist sogar schneller sein sollte.
-
Die verwendung von LIKE ist sinnvoll. Da man so bei "falscher" konfiguartion der Tabellen auch die regulären werte zurück bekommt.
Ob man dadurch nun wirklich langsamer ist bei der abfrage ist fraglich. -
Ich bin mir recht sicher, dass LIKE langsamer ausgeführt wird als ein normaler Vergleichsoperator. Aber das hängt am Ende nur davon ab, ob de Datenbankoptimierer erkennt, dass mit einer Konstante verglichen wird. Wenn ja, wird er es wohl zu einem = herausoptimieren. Ansonsten wird die LIKE-Variante wohl langsamer gehen.
-
nikic schrieb: Ich bin mir recht sicher, dass LIKE langsamer ausgeführt wird als ein normaler Vergleichsoperator. Aber das hängt am Ende nur davon ab, ob de Datenbankoptimierer erkennt, dass mit einer Konstante verglichen wird. Wenn ja, wird er es wohl zu einem = herausoptimieren. Ansonsten wird die LIKE-Variante wohl langsamer gehen.
Yap, ist richtig.
deineagentur schrieb: Die verwendung von LIKE ist sinnvoll. Da man so bei "falscher" konfiguartion der Tabellen auch die regulären werte zurück bekommt.
In der Hinsicht ist meine DB ziemlich ausgereift, daher mache ich mir deswegen eher weniger sorgen.
Liebe Grüße
- VampireSilence
Beitrag zuletzt geändert: 26.5.2009 16:40:37 von vampiresilence -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage