SQL Abfrage unabhängig von Groß- und Kleinschreibung

bu1137 schrieb:
Zeig doch mal das Schema/CREATE der Tabelle. Wie gesagt, es dürfte keine Unterscheidung machen.

Ich hab noch nicht viel Ahnung :D
Meinst du wie die Tabelle aufgebaut ist?
Ich benutze PHPMYADMIN
Da habe ich ne Tabellenstruktur... ich müsste aber nen Screenshot davon machen wenn du das wissen möchtest..

oder ist das die Kollation?
da benutze ich latin1_german2_ci und wenn ich da drauf gehe dann blendet der mir
"Deutsch(Telefonbuch), case-insensitive" ein... :D

case-insensitive heißt ja quasi dass das unempfindlich ist... daher schon komisch das der da noch unterschiede macht
 
Zuletzt bearbeitet:
Bestimmt... aber wer weiß was

also der Quelltext, der prüfen soll, ob der benutzername schon vergeben ist oder nicht sieht so aus
Code:
if(strlen($_POST['username']) >= 3)
{
	connect();
	$sql_search_username = mysql_query("SELECT username FROM user WHERE username='".mysql_real_escape_string($_POST['username'])."' LIMIT 1") or die(mysql_error()." Abfrage sql_search_username gescheitert.");
	$obj_search_username = mysql_fetch_object($sql_search_username);
	if($_POST['username'] == $obj_search_username->username) $errorusername = '<label class="errormessage">&lArr; Benutzername schon vergeben!</label>';
}
aber da sehe ich meinen Fehler nicht sondern ich hab bestimmt irgendeine einstellung in phpmyadmin falsch gemacht oder übersehen...

Hier Bild von meiner Tabellenstruktur

lg
 
Zuletzt bearbeitet:
lol eh... dein Fehler liegt im PHP-Code

du kannst doch sagen: Wenn es einen Treffer gibt, dann gibts den User schon... wieso der sinnlose Vergleich noch, ob die Usernamen übereinstimmen?
 
Zur Erklärung: PHP string comparison ist case sensitive.

Und ja, dein code ist etwas fragwürdig :freak:
 
Wobei ich jetzt selbst verwirrt bin... aber ich würde über die Ergebnis-Menge gehen... soll heißen: Gibt es ein Ergebnis ist der Name ungültig...

Aber klar... er holt ja den Namen in der Art und Weise, wie er in der Datenbank steht, und vergleicht dann in PHP case-senstive ob der Name gleich dem eingegebenen ist... klar ist dann der große Max nicht gleich wie der kleine max...
 
Zuletzt bearbeitet:
Uebrigens: Das ganze ist so oder so nicht ganz sauber. Wenn zwischen deiner Abfrage/Suche und dem Insert ein anderer Insert dazwischenkommt... Du müsstest die table locken.
Aber was ne idee wäre: Unique index aufn username, dann würde ein Insert fehlschlagen wenn Eintrag schon vorhanden.
 
jow stimmt hast recht...

ich suche erst den Username aus dem $_POST in der Datenbank
und wenn der übereinstimmt, dann vergleiche ich quasi das gleiche nochmal in php was natürlich nix bringt :D

Boar manchmal könnt ich mich echt selbst haun :D
Ergänzung ()

bu1137 schrieb:
Uebrigens: Das ganze ist so oder so nicht ganz sauber. Wenn zwischen deiner Abfrage/Suche und dem Insert ein anderer Insert dazwischenkommt... Du müsstest die table locken.
Aber was ne idee wäre: Unique index aufn username, dann würde ein Insert fehlschlagen wenn Eintrag schon vorhanden.

Du meinst wenn jemand genau im gleichen Moment wo ich das eintragen will jemand den gleichen benutzernamen regristrieren will?
 
es kann im schlimmsten fall passieren, dass zwei user den selben usernamen registrieren, wenn dies quasi gleichzeitig (aber nicht ganz ^^) passiert, also wenn die prüfung, ob der name erlaubt ist, zeitlich unmittelbar vor dem insert des anderen users kommt...
 
Ja gut :D
wenn irgendwann son großer useransturm kommt, könnte das ja durchaus passieren, obwohl das für mich ja ne wunschvorstellung wäre

Und wenn ich nen Unique-Index für den Usernamen erstelle, dann spuckt der nur in diesem fall den fehlercode aus? wäre ja auch unschön wenn ich so dauernd ne fehlermeldung bekommen würde wenn der username schon vergeben ist.
 
Zuletzt bearbeitet:
1668mib schrieb:
Wobei ich jetzt selbst verwirrt bin... aber ich würde über die Ergebnis-Menge gehen... soll heißen: Gibt es ein Ergebnis ist der Name ungültig...

Ich hab den Qelltext jetzt so verändert, aber das ist auch falsch :D
Code:
if(strlen($_POST['username']) >= 3)
{
	connect();
	$sql_search_username = mysql_query("SELECT username FROM user WHERE username='".mysql_real_escape_string($_POST['username'])."' LIMIT 1") or die(mysql_error()." Abfrage sql_search_username gescheitert.");
	if($sql_search_username) $errorusername = '<label class="errormessage">&lArr; Benutzername schon vergeben!</label>';
		}
Abfrage = Vergleicht den Benutzername mit dem usernamen in der Tabelle
Wenn Abfrage "erfolgreich", dann fehlercode schreiben

aber genau das ist das problem... ich glaub der guckt jetzt ob die abfrage ausgeführt werden konnte und dann schreibt der $errorusername
d.h. soviel wie ich bekomme so jetzt immer den fehlercode das der benutzer vergeben ist egal was der rein schreibt...

also soll ich die COUNT() funktion einbringen?
ich zähle alle datensätze zusammen, die in der tabelle stehen und gleich dem benutzernamen sind und speicher das in einer neuen spalte ab und wenn der mind. einen datensatz gezählt hat, dann ist der username schon vergeben und ich kann die fehlermeldung schreiben...
oder gibts da noch ne elegantere idee?
Ergänzung ()

Jo klappt so mit COUNT() :) *juhu* :D

Code:
if(strlen($_POST['username']) >= 3)
{
	connect();
	$sql_search_username = mysql_query("SELECT COUNT(username) AS useranz FROM user WHERE username='".mysql_real_escape_string($_POST['username'])."' LIMIT 1") or die(mysql_error()." Abfrage sql_search_username gescheitert.");
	$obj_search_username = mysql_fetch_object($sql_search_username);
	if($obj_search_username->useranz >= 1) $errorusername = '<label class="errormessage">&lArr; Benutzername schon vergeben!</label>';
}

Danke nochmal für die gute Hilfe... auch wenn ich es euch nicht leicht gemacht habe, obwohl es an sich leicht war :D
 
COUNT() / mysql_num_rows() sind zwei verschiedene paar schuhe, die kannst du so nicht vergleichen.

mysql_num_rows ist ja eine php funktion, welche dir lediglich sagt, wieviele resultate deine sql abfrage geliefert hat.
 
Zurück
Oben