Mysql / PhpMyAdmin - Like & Umlaute

Igäl

Erfahrenes Mitglied
Hallo Menschen

Lange habe ich versucht, viele Foreneinträge gelesen und einiges umgesetzt oder zumindest umzusetzen versucht. Das Problem hatten schon viele, aber irgendwie hat mir nichts geholfen.

Ich habe ein Textfeld, wo der User einen String eingeben kann. Mit "LIKE %EINGABE%" wird dann eine Tabelle, die Waren enthält durchsucht. Das funktioniert wunderbar, ausser ich suche etwas mit Umlauten.

Der Status quo sieht folgendermassen aus:
- meta-charset (HTML) ist auf "utf8";
- mysqli_set_charset (PHP) ist auf "utf8";
- alle Tabellen und Felder in der Datenbank sind auf "utf8mb4_unicode_ci";
- im entsprechenden Feld steht "Käse, Laib";

Wenn ich "Käse" suche, findet er den Eintrag "Käse, Laib" in der Tabelle nicht. Suche ich mit "Kase", findet er ihn ohne Probleme.

Die Daten sind via CSV (aus Excel exportiert) in die Datenbank importiert worden. Dateityp "CSV UTF-8 (durch Trennzeichen getrennt)".

Versucht habe ich schon "LIKE BINARY" (dann findet er gar nichts mehr) und mysqli_query(SET NAMES ...). Beides ohne Erfolg.

Wo also könnten noch Stolpersteine sein? Ich bin mit meinem latin1_bin am Ende.

Danke für Unterstützungsbemühungen und allen ein schönes Wochenende.

Gruss, Dä Igäl

PS: Was mir gerade noch auf- und eingefallen ist...
Waren kann ich auch über eine Maske auf der Homepage in die Datenbank eintragen. Waren, die so eingetragen worden sind, werden korrekt gefunden. Sprich: nur die Einträge, die via CSV importiert worden sind, bocken rum und deren Umlaute lassen sich nicht finden...

PSS: Was ich wohl noch anfügen muss...
Die Excel-CSV-Exportdatei habe ich jeweils im Notepad++ noch modifiziert. Namentlich habe ich die Spaltennamen herausgelöscht, dann abgespeichert und dann via Importfunktion von PhpMyAdmin in die Datenbank eingefügt. Habe ich damit evtl. eine Zeichencodierung der CSV-Datei zerstört?
 
Zuletzt bearbeitet:
Ich nehme an du meinst beim Import. Ja, da ist UTF8 standardmässig drin und ich habe das nicht geändert. Ich werde mal versuchen eine CSV-Datei zu generieren, die ich direkt einfügen kann, ohne dass Modifikationen notwendig werden.

Update:
Nun habe ich das Excel-CSV so angelegt, dass ich es nicht mehr mit Notepad++ editieren musste und es so direkt in die DB importiert. Das Ergebnis ist dasselbe.

Update 2:
Dem hier (https://www.rksoftware.de/support/ExcelCSV.pdf) folgend, habe ich Codierung noch auf "Unicode (UTF-8)" angepasst. Das Ergebnis ist weiterhin dasselbe, obwohl meine Tabellen die Kollation utf8mb4_unicode_ci aufweisen. Vermutlich sollte ich meine User anweisen auf Umlaute bei der Suche zu verzichten :)

Update 3:
Wenn ich mit der Suche von PhpMyAdmin arbeite und dort unter dem Suchfeld von "GoodName" LIKE "Käse%" eingebe, findet er es in der Tabelle. Das heisst es kann irgendwie nicht an der Datenbank liegen. Der Fehler muss also irgendwo ab dort liegen, wo der User "Käse" in das Suchfeld eingegeben hat und auf den "Suchen"-Button klickt...
 
Zuletzt bearbeitet:
Ach Leute... ich habe mir da echt mal wieder selber ein Bein gestellt --(o_O);-->

Der User-Input wird natürlich zuerst durch eine Kontrollfunktion gejagt und mit htmlentities() formatiert. Dann sind Umlaute natürlich &xuml; und nicht mehr die sauberen Umlaute. Selbstredend möchte ich den User-Input nicht unkontrolliert lassen, aber werde wohl ä, ö, und ü aus der Kontrolle ausnehmen.

PHP:
    public function check_user_input($input, $type) {
        $proper_input = false;

        switch($type) {
            case "int":        $proper_input = is_numeric($input) ? (int) $input : false;
                            break;
            case "float":    $proper_input = is_numeric($input) ? (float) $input : false;
                            break;
            case "text":    $proper_input = trim(htmlentities($input));
                            break;
        }

        return $proper_input;
    }

Sorry, dass ich eure Zeit verschwendet habe. Wenigstens habe ich jetzt aber überall saubere Kollationen und entsprechende Definitionen :D
 
Zuletzt bearbeitet:
Hat jemand eine Idee, wie ich htmlentities() nutzen kann, Umlaute aber von einer Umwandlung verschont bleiben? Oder ganz generell, wie ich User-Eingaben schützen kann und nur bspw. HTML-Tags ändere?

Ich arbeite bei der Ausgabe mit einer Funktion format_output() die ein $original-Array und ein $mutate-Array aufweist und dann die Zeichen anpasst.

PHP:
        $original = array("ä", "ö", "ü", "Ä", "Ö", "Ü", "\r\n", "\r", "\n", "[b]", "[/b]",
            "[i]", "[/i]", "[u]", "[/u]", "[hr]");
        $mutate = array("&auml;", "&ouml;", "&uuml;", "&Auml;", "&Ouml;", "&Uuml;", "&nbsp;<br />",
            "&nbsp;<br />", "&nbsp;<br />", "<b>", "</b>", "<i>", "</i>", "<u>", "</u>", "<hr />",
            );

        for($i=0; $i<count($original); $i++)    {
            $text = str_replace($original[$i], $mutate[$i], $text);
        }

Müsste ich demnach für den Input ebenfalls sowas machen oder gibt es eine einfachere Funktion?
 
Klasse, danke. Wenn man sich seit Jahren auf dieselben Funktionen verlässt, nur Deprecated-Dinge anpasst und neue Kenntnisse nicht einfliessen lässt, dann mündet das wohl in dumme Fragen mit offensichtlichen Antworten. Hatte die Funktionen nicht mehr auf dem Schirm, weil meine Controllerklassen noch in PHP4 geschrieben worden sind und ich die wohl damals nicht gekannt / im Einsatz hatte. Danke für den Denkanstoss. Ist wohl genau das, was ich gesucht habe.
 
Zurück