Groß-/ Kleinschreibung in der DB

  • also prinzipiell ist es ja auch bei ner suche ein ähnliches problem.
    man weiß nicht, was eingegeben wird und der suchende weiß nicht, wie es in der datenbank steht...
    von daher sollte man dafür sorge tragen, dass das was als 'parameter' in die sql-abfrage einfließt und das was verglichen wird beides im gleichen format vorliegt (zumindest für die prüfung)
    also beide seiten zb zu kleinbuchstaben machen mit lower() auf db-ebene und strtolower() auf php-ebene (alternativ auch mit upper() und strtoupper())
    so geht man dann auf jeden fall sicher, dass die zu vergleichenden strings das richtige vergleichsformat haben ;)

  • Und was soll an ihr unsauber und inperformant sein?

    Ich denke mal er meint damit das du viel mit PHP rumfrickeln musst obwohl es eigentlich gar nicht nötig bzw die Aufgabe hier ist (von PHP)

    Genau das. Es macht in diesem Fall keinen Sinn Daten vor dem Schreiben in die DB umzuwandeln und beim Auslesen dann jedesmal wieder zurück. Das ist einfach ein Pfuschlösung, die das Problem lediglich etwas aufschiebt. Wenn als nächstes irgendeine Volltextsuche aus ganzen Textabschnitten kommt funktioniert deine Lösung schon nicht mehr, da du dort schon nicht mehr weißt welche Wörter wieder groß geschrieben werden müssen und welche nicht.

    @ naggison: Wenn du beide Felder auf utf8_general_ci stehen hast und es trotzdem nicht klappt kann der Fehler nicht bei der DB liegen, dann kommt der Query nicht korrekt an. utf8_general_ci ist definitiv case-insensitive, dabei spielt es auch keine Rolle ob Datenbank und Datenbankverbindung über utf8_bin läuft.
    Änder mal folgendes in deinem Script und schau mal was dann kommt:

    PHP
    $result = mysql_query("SELECT * FROM enn_usr WHERE firstname='".$firstname."' AND surname='".$surname."'");
    
    
    // änder in:
    $sql = "SELECT * FROM enn_usr WHERE firstname='".$firstname."' AND surname='".$surname."'";
    echo $sql;
    mysql_query($sql) or die("<br/>".mysql_error());

    Probiert hast du es mit Max Mustermann? Oder evtl. nur mit anderen Namen in denen Umlaute o.ä. vorkommen? Dann könnte es auch noch am Format der php-Datei liegen.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook


  • @ naggison: Wenn du beide Felder auf utf8_general_ci stehen hast und es trotzdem nicht klappt kann der Fehler nicht bei der DB liegen, dann kommt der Query nicht korrekt an. utf8_general_ci ist definitiv case-insensitive, dabei spielt es auch keine Rolle ob Datenbank und Datenbankverbindung über utf8_bin läuft.
    Änder mal folgendes in deinem Script und schau mal was dann kommt:

    PHP
    $result = mysql_query("SELECT * FROM enn_usr WHERE firstname='".$firstname."' AND surname='".$surname."'");
    
    
    // änder in:
    $sql = "SELECT * FROM enn_usr WHERE firstname='".$firstname."' AND surname='".$surname."'";
    echo $sql;
    mysql_query($sql) or die("<br/>".mysql_error());

    Probiert hast du es mit Max Mustermann? Oder evtl. nur mit anderen Namen in denen Umlaute o.ä. vorkommen? Dann könnte es auch noch am Format der php-Datei liegen.


    Die Ausgabe ist: SELECT * FROM enn_usr WHERE firstname='Marian' AND surname='merek'
    Eingegeben hatte ich in die Adressleiste: .de/Marian.merek
    in der DB steht er als Marian Merek

    In der Regulaeren Ausgabe wurde dieser eintrag in der DB nicht gefunden weil ich "merek" klein geschrieben habe und er in der DB groß steht.

    Gaaaanz komischer Fehler ist das einfach.
    Ich weiss nicht weiter außer mir echt so ein komisches PHP gefrickel zu schreiben... :-/

  • SELECT * FROM enn_usr WHERE firstname='Marian' AND surname='merek' <-- hast du den Query mal direkt über phpmyadmin ausgeführt?

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • SELECT * FROM enn_usr WHERE firstname='Marian' AND surname='merek' <-- hast du den Query mal direkt über phpmyadmin ausgeführt?



    Oh wunder oh wunder... wenn ich das in die DB schreibe findet er es..
    Er findet werte mit Großbuchstaben obwohl ich im query alles klein habe.

  • Dann kommt, wie vermutet, die Anfrage nicht mehr korrekt bei der DB an. Damit ist es zumindest schonmal eingegrenzt.
    Schreib doch mal in deiner PHP-Datei folgendes:

    PHP
    // Das hier:
    $sql = "SELECT * FROM enn_usr WHERE firstname='".$firstname."' AND surname='".$surname."'";
    // ändern in:
    $sql = "SELECT * FROM enn_usr WHERE firstname='Marian' AND surname='merek'";


    Funktioniert es dann? Ansonsten kannst du auch nochmal versuchen die Zeichensatz-Formatierung deiner php-Dateien zu ändern.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Dann kommt, wie vermutet, die Anfrage nicht mehr korrekt bei der DB an. Damit ist es zumindest schonmal eingegrenzt.
    Schreib doch mal in deiner PHP-Datei folgendes:

    PHP
    // Das hier:
    $sql = "SELECT * FROM enn_usr WHERE firstname='".$firstname."' AND surname='".$surname."'";
    // ändern in:
    $sql = "SELECT * FROM enn_usr WHERE firstname='Marian' AND surname='merek'";


    Funktioniert es dann? Ansonsten kannst du auch nochmal versuchen die Zeichensatz-Formatierung deiner php-Dateien zu ändern.



    $sql = "SELECT * FROM enn_usr WHERE firstname='Marian' AND surname='merek'";
    while ($row = mysql_fetch_array($sql)) {

    $usr['firstname'] = $row['firstname'];
    $usr['surname'] = $row['surname'];

    }

    -> Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /pages/65/0b/d0005363/home/htdocs/xxx/xxx/xxx/xxx/login.php on line 77

    77 = while ($row = mysql_fetch_array($sql)) {


    Sorry, ich bin nicht mehr ganz fit, war heute nen bissl viel arbeit! :-/

  • Naja, da fehlt auch noch der mysql_query() ;)

    PHP
    $sql = "SELECT * FROM enn_usr WHERE firstname='Marian' AND surname='merek'"; 
    $res = mysql_query($sql) or die("Fehler mit Query:<br>$sql<br>".mysql_error());
    while ($row = mysql_fetch_array($res)) { 
      $usr['firstname'] = $row['firstname'];
      $usr['surname'] = $row['surname']; 
    }

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Mal ne ganz doofe Frage... Du gibst ja $usr['firstname'] und $usr['surname'] auch irgendwo aus um zu überprüfen ob was zurückkommt? ^^

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • hoffentlich kann ich nun was posten... o0
    ALSO: Ja, ich gebe die Variablen an JS weiter und JS dann per FlashVars an Actionscript... aber daran liegt es nicht. Testweise habe ich das ganze auch direkt mit einem echo ueber PHP ausgegeben. :D

    Und ich weiger mich gerade einfach den fuer meinen fall "unsinnigen" vorschlag von 100 abfragen und explode klamotten fuer das tool zu schreiben. Ich programmiere ja nicht erst seit gestern und das ist fuer mich einfach nicht das was ich moechte... :-/ .. und unsinnig jetzt bitte nicht falsch verstehen.

  • also ich werd jetzt meinen beitrag nicht rezitieren, aber für jemanden der programmieren kann ist das problem ja wohl unterste tischkante...
    die von mir gepostete und auch übliche herangehensweise kenne ich schon seit meiner zertifizierungs-vorbereitungen zum sun certified java programmer (das war 2005!!)

  • also ich werd jetzt meinen beitrag nicht rezitieren, aber für jemanden der programmieren kann ist das problem ja wohl unterste tischkante...
    die von mir gepostete und auch übliche herangehensweise kenne ich schon seit meiner zertifizierungs-vorbereitungen zum sun certified java programmer (das war 2005!!)



    Naja... wenn man das Problem nur umgehen will ist dein Vorschlag ok. Meiner Meinung nach wäre es aber wesentlich sinnvoller herauszufinden wieso die Queries nicht korrekt bei der DB ankommen. Denn in phpmyadmin direkt funktionieren sie ja.
    Deine Lösung ist praktikabel, wenn man zwangsweise mit (case-sensitiven) BIN-Kollationen arbeiten muss, aber nicht wenn man case-ignore-Kollationen verwendet.
    Da ich aber für eine Ferndiagnose hier momentan auch mit meinem Latein am Ende bin, kannst du es ja mal so probieren @ naggison:

    PHP
    $result = mysql_query("SELECT * FROM enn_usr WHERE LOWER(firstname)='".strtolower($firstname)."' AND LOWER(surname)='".strtolower($surname)."'");

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • naja genau genommen is ne ci-variante allein schon von der kollation her pfuscherei...

    Für beispielsweise Passwörter, die nicht gerade in eine Form verschlüsselt/gehasht werden, die sowieso nur Zahlen und Kleinbuchstaben ausspuckt, sollte selbstverständlich eine case-sensitive Kollation gewählt werden.
    Für beispielsweise Textfelder, über die Volltext-Suchen laufen sollen, würde ich die ci-Variante wählen.
    Es hat beides seine Vor- und Nachteile, die sollte man sich bewußt machen und dann anhand der Anforderungen problembezogen entscheiden. Ich finde nicht, dass es da allgemeingültig ein richtig oder falsch, sauber oder unsauber gibt.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Naja, ich danke euch allen sehr! Ich mein, 4 Seiten - Das bekommt man in einem anderen Forum nicht so schnell hin! Echt, Danke!
    Synaptic, ich habe nun deinen Rat befolgt. Ich habe bis jetzt keine andere Loesung gefunden. Ich begebe mich zu einem spaeteren Zeitpunkt auf Fehlersuche. So wie du es gesagt hast klappt es gut - ist aber recht bloed wie ich finde :-/ Was allerdings keine direkte Kritik an dich sein soll. Ich finde die Loesung einfach mist wenn es auch anders gehen muesste.

    Vielen Dank nochmal!

  • Das kann doch nicht so schwer sein , schau doch mal was wirklich an die DB übergeben wird mit zb nen DB Profiler

    Header setzen hilft vllt was

    mfg