# String vergleichen auf Groß- und Kleinschreibung



## strolch_007 (18. März 2009)

hallo,

ich bin gerade dabei ein Passwort-vergessen Formular zu scheiben.  Alles funktioniert auch absolut fehlerfrei (auslesen aus der db, wenn schon vorhanden und und....).
Nur ein kleines Problemchen läßt sich nicht lösen. Habe ich z.B. in der DB "Berghexe" als Nickname gespeichert, so erkennt mir php auch "berghexe" (also klein geschrieben) als richtig an. Was ich natürlich nicht so haben will.

Mein php sieht so aus:


```
<?php
.
.
.

			//  username suchen bzw. auslesen
	
			$sql = "SELECT `username` FROM `xxxx` Where username = '".mysql_real_escape_string(trim($_POST['nickname']))."'";
			
	
	
			//  Resultat erzeugen oder Fehlerhinweis

			$result = mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
			$row = mysql_fetch_assoc($result); 
			
			
			// Wenn das eingegebene Passwort nicht in der Datenbank gefunden wird, dann Fehler

                  if(!$row)

                $pwmessage = "Dieser Nickname existiert nicht. Bitte prüfe auf evtl. Tippfehler!";

.
.
.

?>
```

Der in $_POST angebene "nickname" bezeichnet das input-Feld (eingabe des Users). 
Gibt es einen "Befehl" der php anweist bei ....if(!row) auch auf Groß-  und Kleinschreibung zu achten? 
int strcmp  ( string $str1  , string $str2  ) hab ich versucht einzubauen, klappt aber nicht. Eine Vergabe eines arrays und per if-Anweisung in_array abzufragen ist mir grundsätzlich klar. Ich möchte aber einen Vergleich mit meiner gebauten if-Anweisung hin bekommen.


----------



## Flex (18. März 2009)

Füge dem Feld das Attribut "Binary" zu, in MySQL.
Danach sind allerdings sämtliche Abfragen abhängig von der Groß- und Kleinschreibung.


----------



## Enumerator (19. März 2009)

Moin!

Die Aussage





			
				http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html hat gesagt.:
			
		

> Normally, if any expression in a string comparison is case         sensitive, the comparison is performed in case-sensitive         fashion.


...ist eine glatte Lüge :
	
	
	



```
mysql> SELECT "test" = "TEST" AS "passt";
+-------+
| passt |
+-------+
|     1 |
+-------+
```
Soviel zur einfachsten Form einer vergleichenden "Expression"... 



Felix Jacobi hat gesagt.:


> Füge dem Feld das Attribut "Binary" zu, in MySQL.
> Danach sind allerdings sämtliche Abfragen abhängig von der Groß- und Kleinschreibung.



Um Strings in MySQL case-sensitive zu vergleichen ohne der Spalte das Attribut BINARY geben zu müssen, benutzt man LIKE BINARY:
	
	
	



```
mysql> SELECT "test" LIKE BINARY "TEST" AS "passt";
+-------+
| passt |
+-------+
|     0 |
+-------+
```

Übrigens ist LIKE BINARY schneller als LIKE...


Greetz
Enum


----------



## jeipack (19. März 2009)

Ist ja nicht so, dass zwei Themen weiter unten es genau ums gleiche ginge:
http://www.tutorials.de/forum/relat...019-gross-kleinschreibung-bei-mysql-like.html



			
				Aba Assa hat gesagt.:
			
		

> Zitate sind so etwas wie Outsourcing des Geistes.


 lol


----------



## strolch_007 (19. März 2009)

hallo,

zuerst einmal vielen Dank für eure Antworten. Ich denk ich hab meinen Einführungsthread  etwas knöddelich geschrieben, soll heißen missverständlich.



> Füge dem Feld das Attribut "Binary" zu, in MySQL.
> Danach sind allerdings sämtliche Abfragen abhängig von der Groß- und Kleinschreibung.





> mysql> SELECT "test" = "TEST" AS "passt";





> mysql> SELECT "test" LIKE BINARY "TEST" AS "passt";



Es geht hier NICHT um ein Datenbankproblen, sprich Ausgabeproblem! In-und output funktionieren genau so wie ich das haben will in Klein- und Großschreibung! Habe auch die Datenbank auf BINARY gesetzt obwohl ich mir denke das das relativ überflüssig ist, da ja im Formular zur Datensicherung bereits hinreichend Abfragen auf Groß- und Kleinschreibung statt finden und eine entsprechende Speicherung in der Datenbank korekt läuft.
Wenn ich das mit dem obigen SELECT richtig sehe ist das DB Prüfung. Oder hab ich da was falsch verstanden?
Mal etwas ausführlicher. Man stelle sich vor das man sein Passwort vergessen hat, sein Nicknamen aber noch weiß. Nun tippe ich, im vorhandenen input-Feld,  meinen Nicknamen ein (z.B. Berghexe). Da "Berghexe" genau so in der Datenbank zu finden ist, wird ein neues Passwort (wegen md5) generiert und verschickt. So nun tippe ich aber statt "Berghexe" "berghexe" ein. Ups er sagt mir trotzdem alles richtig und generiert ein neues Passwort, was ja falsch ist wegen dem ersten Großbuchstaben (wobei natürlich auch Großbuchstaben während einem Wort erkannt werden sollen und müßen).  Wie bekomme ich es nun hin, dass bei der Eingabe bzw. der Vergleichsoperation genau auf Groß- und Kleinschreibung geachtet wird? - Eben genau so wie es auch in der DB steht und KORREKT in z.B. eine Tabelle ausgegeben wird.



> Ist ja nicht so, dass zwei Themen weiter unten es genau ums gleiche ginge:
> http://www.tutorials.de/forum/relati...ysql-like.html



Darf hier mal ein kleines Veto einlegen. Ich habe vor dem Schreiben natürlich hier im Forum rum geschaut, fand aber das es eine php Sache ist und nirgends zu finden war. Drum hab ich das auch bei php  eingetragen. Aber ok war ja selber schuld weils etwas merkwürdig geschrieben war.
Im Thema unten gehts übrigens nicht ums Gleiche, sondern um das Selbe. Kleines Spässle darf auch mal sein.

Gruss
strolch_007


----------



## Enumerator (20. März 2009)

Abend!

Ich glaube das wir alle sehr genau verstanden haben, wo Dein Problem liegt bzw. was Du wissen möchtest:
	
	
	



```
$sql = "SELECT `username` FROM `xxxx` Where username LIKE BINARY '".mysql_real_escape_string(trim($_POST['nickname']))."'";
```

Greetz
Enum


----------



## strolch_007 (20. März 2009)

hallo enum,

danke jetzt funktioniert es.Richtig. verstanden hab ich es zwar immer noch nicht warum das so und nur so funktioniert. Aber gut.  im Referenzhandbuch zu mysql ist das sehr kurz abgehandelt mit 1 und 0 woraus ich überhaupt nicht schlau werde. Eine andere (ausführliche) deutsche Erklärung zeigt mir google auch nicht. LIKE ist ausführlich erklärt aber nicht LIKE BINARY. SELFPHP zeigt NULL Suchergebnisse an. Hab jetzt stundenlang im Netz rum gewuschtelt und nix sinnvolles dazu gefunden. Jetzt mog i nimmer

Gute Nacht alle zusammen


----------



## jeipack (20. März 2009)

Hi strolch

Also weiss nicht genau, aber ich komme bei "like mysql" beim ersten suchtreffer auf:
http://dev.mysql.com/doc/refman/5.1/de/string-comparison-functions.html
(Such darin mal nach like binary - ist in 2 sätzen alles erklärt).



			
				strolch hat gesagt.:
			
		

> Darf hier mal ein kleines Veto einlegen. Ich habe vor dem Schreiben natürlich hier im Forum rum geschaut, fand aber das es eine php Sache ist und nirgends zu finden war. Drum hab ich das auch bei php eingetragen. Aber ok war ja selber schuld weils etwas merkwürdig geschrieben war.
> Im Thema unten gehts übrigens nicht ums Gleiche, sondern um das Selbe. Kleines Spässle darf auch mal sein.


Also damit hast du mich verwirrt 
Nach:
http://www.spiegel.de/kultur/zwiebelfisch/0,1518,311593,00.html
ist das das Gleiche sozusagen ein Klon und dasselbe ist wirklich genau die gleiche Sache. Ohne hier jetzt einen Krieg aus lösen zu wollen denke ich dass es doch das Gleiche und nicht dasselbe ist  Aber trozdem. Hier wird deine Problematik doch schön verdeutlicht:
http://www.tutorials.de/forum/relat...einschreibung-bei-mysql-like.html#post1741633

Aber LIKE BINARY ist natürlich einiges einfacher. Thx für den Befehl @ enum



Gruss


----------



## strolch_007 (24. März 2009)

hallo,

als erstes hab ich mal meine Datenbank in Ordnung gebracht., War nämlich nicht richtig auf UTF 8 ungestellt.  Dann beide Felder username und email auf BINARY umgestellt (es soll und muss ja IMMER zwischen Groß- und Kleinschreibung unterschieden werden). Somit erspar ich mir das mit dem LIKE BINARY. LIKE BINARY hab ich jetzt erst mal in die Tonne gekloppt, weil ich es trotz aller Surferei einfach nicht verstehe. Funktioniert jetzt auch so einwandfrei.


> Also weiss nicht genau, aber ich komme bei "like mysql" beim ersten suchtreffer auf:
> http://dev.mysql.com/doc/refman/5.1/...functions.html
> (Such darin mal nach like binary - ist in 2 sätzen alles erklärt).


Danke für die Seite, aber da treib ich mich ständig drauf rum. 
Ich kram das irgendwann mal wieder raus und dann wirds auch klappen. Genau wie mit fetch_assoc. Des hab ich auch nie kappiert und dann auf einmal gings.....

Och naja und um noch a weng Verwirrung zu stiften...



> Also damit hast du mich verwirrt
> Nach:
> http://www.spiegel.de/kultur/zwiebel...311593,00.html



Erst mal ist das keine allgemein und verbindliche/güttige Definition. 


> Der, die, das Gleiche besagt, dass sich zwei unterschiedliche Dinge aufs Haar gleichen.


Man könnte bei diesem Satz sagen: "Definiere unterschiedliche Dinge"....
Oder einfach die Frage stellen wo kommt denn zum Bleistift "dasselbe" her? War es das Opel-Werk 1924 (erster deutscher - damls größter deutsche Autobauer) der die Serienfertigung einführte)? Stichpunkt Opel Laubfrosch - und Dasselbe in grün. Oder die Bahn mit Ihren (damals noch grünen Fahrkarten)? Man weiß es nicht so ganz genau. Ist also mehr ein geflügeltes Wort als ein fix definierbarer Begriff. Naja und "Klon" ist auch nett, hat mit Definitionsversuchen aber recht wenig zu tun. Ähm und wenn ich mir das mathematisch betrachtet links und rechts jeweils eine 1 vorstelle und die vergleiche. Ist das dann genau das Gleiche oder mathematisch betrachtet dasselbe? . Heißt es Gleichung oder Selbung? Soso "unterschiedliche Dinge...
Die Zahlenkolone 1,2,5,3  im Vergleich zu 2,1,4,5 das Gleiche oder dasselbe, nämlich Zahlen? Daraus kann man, muß man aber nicht, eine Schnittmenge bilden. Wie jetzt? Dasselbe oder das Gleiche?
Ist nicht so einfach bei den thiudisk was zu definieren...zwinker
Man soll halt alles nicht so bierernst nehmen und  auch mal schmunzeln können/dürfen.
Damit beende ich dann aber auch meinen Ausflug in die unendlichen Weiten der Definitionen . Man soll es ja nicht übertreiben.

Gruss
strolch_007


----------



## Enumerator (24. März 2009)

Hey Jungens (nehm ich an ;-] )!

Also ich finde sowas sollte eher beim Verein Deutsche Sprache e.V. (http://www.vds-ev.de) geklärt werden - siehe da, in deren Forum taucht das Thema des Öfteren auf... - aber bestimmt nicht in "Programming/Relationale Datenbanksysteme"... lol.

Gruß
Enum


----------

