• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Suchproblem mit ü-ä-ö

Andreas200

Neues Mitglied
Hallo Zusammen,

folgendes Proiblem plagt mich!
Ich habe eine htm-Datei mit einem Textfeld für die Ortseingabe.
Wenn ich als Suchbegriff "mün", für münchen z.B., eingebe wird in der mysql-db kein datensatz gefunden. Gebe ich aber "mün" werden alle Datensätze wo "mün" drin vorkommt aufgelistet.

Die mysql-db habe ich unter Koallition: utf8_unicode_ci gespeichert.
Der Datensatz München steht in der DB als Müchen. Ich vermute mal das dies das Problem ist. Wenn ich aber München in die DB schreibe bekomme ich als ausgabe immer M?nchen.

Wär nett wenn mir jemand helfen kann.

Danke Andreas
 
AW. Suchproblem

Hallo Nochmal,

Pardon, hatte ich vergessen.

PHP:
<?php
            include("script2.php");
                                
                if(isset($_POST["senden"]))
                {
                    $liste = mysql_query("select ort, plz, vorwahl, bundesland from plzvw WHERE ort LIKE '%" . $_POST["ort"] . "%' order by id");
                    $num = mysql_num_rows($liste);
                    echo "$num Datensätze gefunden<p>";
                   echo "<table>";
                
                   // Überschrift
                   echo "<tr><th>Ort</th><th>PLZ</th><th>Vorwahl</th><th>Bundesland</th>";
                
                   while ($dsatz = mysql_fetch_assoc($liste))
                   {
                         echo "<tr>";
                      echo "<td>" . $dsatz["ort"] . "</td>";
                      echo "<td align=center>" . $dsatz["plz"] . "</td>";
                      echo "<td align=center>" . 0 . $dsatz["vorwahl"] . "</td>";
                      echo "<td>" . $dsatz["bundesland"] . "</td>";
                      echo "</tr>";
                   }
                
                   // Tabellenende
                   echo "</table>";
                
                }
                else
                      echo "Kein Datensatz gefunden";
            
            
            ?>
Andreas
 
In der Datenbank sollten "unformatierte" Daten stehen. Also "München" statt "M&uuml;nchen". Was die Ausgabe anbelangt, kannst du entweder

- das Encoding der Seite auf UTF-8 setzen oder
- die Daten aus der DB vor Ausgabe durch htmlentities() schicken.

Üblicherweise ist der erste Weg in Verbindung mit htmlspecialchars() zu empfehlen (siehe Doku):

PHP:
<?php

header('Content-Type: text/html; charset=UTF-8');

$dbDaten = '<h1>ÄÖÜ</h1>';
echo htmlspecialchars($dbDaten);

Edit: Eventuell zu beachten: Das Encoding der Quellcode-Seiten (.html, .php) sollte nach Möglichkeit ebenfalls UTF-8 sein (müsste sich im Editor einstellen lassen). Dann können im HTML-Code problemlos Umlaute eingesetzt werden, ohne auf &auml; und Co. ausweichen zu müssen.
 
interessant wäre das speichern der daten, ob da die werte durch eine funktion geschickt werden, die das umformatieren vornimmt. wenn ja, kannst du suchbegriffe ebenfalls durch diese funktion leiten.

genau genommen macht imho deine datenbank das eigentlich richtig und wandelt spezial-zeichen in gängige html zeichen um.

um komplette einheitlichkeit sicher zu stellen könnte man die werte noch durch http://at2.php.net/manual/de/function.utf8-encode.php auf ein einheitliches format umstellen.
http://at2.php.net/manual/de/function.utf8-decode.php wandelt das ganze wieder zuück um.
 
AW:

Ich danke für für Deine Hilfe, kriegs aber nicht gebacken.
Habe in der htm-, php Seite im head
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
drinstehen.
Die Seiten und die DB sind auch im Format utf-8 gespeichert.
Die Daten sind geändert, ohne &uuml; .

Gebe ich als Suche -groß- ein = 0 Datensätze, bei Suche -gro-= viele DS aber wenn im DS ein ß vorkommt schreibt er nicht weiter, also anstatt Groß Kugel steht nur Gro da.

Ich wei0 auch nicht wo das htmlspecialchars() im Code hinkommt.
In die $daten kommt dort die Abfrage rein???

Vielleicht hast Du noch einen Tipp für mich !

Danke Andreas
 
umwandeln musst du

PHP:
$liste = mysql_query("select ort, plz, vorwahl, bundesland from plzvw WHERE ort LIKE '%" . $_POST["ort"] . "%' order by id");

in
PHP:
$liste = mysql_query("select ort, plz, vorwahl, bundesland from plzvw WHERE ort LIKE '%" . htmlspecialchars($_POST["ort"]) . "%' order by id");
 
AW:

Hallo Sysop,

Danke für die schnelle Antwort.
Soweit funzt es, wenn ich aber als Suchbegriff "mü" oder "groß" eingebe bekomme ich keine Datensätze zurück geliefert.
Ist aber egal jetzt. Ich danke Euch herzlich für die Hilfe und will nicht Eure Zeit verplembern.

Danke Andreas
 
wäre str_replace auch eine lösungsmöglichkeit?
ich meine, dass man einfach alle ü, ä, ö durch &uuml;, &auml;, &ouml; ersetzt.

vielleicht so:
PHP:
$data = array(
'ö' => '&ouml;',
'ü' => '&uuml;',
'ä' => '&auml;',
'Ö' => '&Ouml;',
'Ü' => '&Uuml;',
'Ä' => '&Auml;',
		 );
						
$string = 
str_replace(array_keys($data), array_values($data), $_POST['ort']);
 
Das wäre ein dirty hack.

Im Prinzip ist das alles völlig unproblematisch, wenn alle Bestandteile auf UTF-8 basieren:

- Datenbank
- Datenbankverbindung
- Browserausgabe
- Edit: Und besser auch die Quelltextdateien selbst

Datenbank ist wohl passend eingestellt, Datenbankverbindung:
PHP:
<?php
mysql_set_charset('utf8'); // mysql ab PHP5.2.3
$mysqli->set_charset('utf8'); //mysqli ab PHP5.2.3
mysql_query("SET NAMES `utf8`"); // veraltet
?>
Ausgabe im Browser:
PHP:
<?php
header('Content-type: text/html; charset=utf-8');
Die Header-Angabe ist bei vielen Servern auf ISO-8859-1 eingestellt und überschreibt leider gerne eventuell gesetzte <meta>-Tags. Deshalb geht es häufig nur explizit mit diesem Befehl.

Informationen teilweise von hier kopiert: UTF-8 - Forum: phpforum.de

Noch ein Wort zum Thema Escaping:

1) Jede Benutzereingabe, die in einen SQL-String eingesetzt werden soll, muss escaped werden, um SQL Injection zu verhindern. Hierzu dient die Funktion mysql_real_escape_string.

2) Jede PHP-Variable, die als HTML-Code ausgegeben wird, sollte ebenfalls escaped werden, falls sie reservierte HTML-Syntaxzeichen (maßgeblich "<" und ">") enthalten könnte (-> XSS). Hierzu dient die Funktion htmlspecialchars.

Zusatz zu 2) Wird der HTML-Code nicht als UTF-8 ausgegeben (also, wenn etwa Umlaute auch escaped werden müssen, "ä" -> "&auml;"), sollte jede PHP-Variable escaped werden, die Umlaute oder reservierte HTML-Syntaxzeichen enthalten könnte. In diesem Fall per htmlentities.
 
Zuletzt bearbeitet:
Äh, ja, Offtopic:

was genau ist ein dirty hack?
Schlecht geschriebener Quelltext?

Ich hab's hier im Sinne von "oberflächliche Lösung" gebraucht. Man wählt den zu einem Zeitpunkt einfachsten Weg, um ein akutes Problem erstmal zu beheben.

Das ist nicht unbedingt negativ gemeint. Zum Beispiel bei so einer Forensoftware gibt es häufig Kleinigkeiten, die man gerne angepasst hätte, die der ursprüngliche Entwickler aber aus verschiedenen Gründen nicht "einfach anpassbar" programmiert hat oder die er nicht ändern will. In dem Fall versucht man nicht, den Entwickler dazu zu bringen, die Änderungen doch bitte irgendwie zu integrieren, sondern fügt schnell zwei drei Codezeilen im Originalcode des Forums hinzu. Diese Änderungen werden bei späteren Updates der Originalsoftware gerne wieder mit der neuen Originaldatei überschrieben, was den Update-Vorgang ganz schön kompliziert machen kann. Das wäre in diesem Fall der Nachteil einer simplen Lösung. (Nur hat man hier meist nicht die Wahl und muss den Originalcode "hacken".)

Für den Fall in diesem Thread würde dein Code zwar unter Umständen die Sache für Umlaute regeln, aber irgendwann kommt ein Ort mit einem "ß" oder einem "é" hinzu oder die Abfrage soll auf polnische Ortsnamen erweitert werden, die völlig andere Zeichen enthalten... Dann muss ewig diese Ersetzungsliste aktualisiert werden und die Gefahr bleibt bestehen, immer irgendwelche Zeichen zu übersehen -- wie du das "ß". ;) Deshalb ist es meist sinnvoller, eine nachhaltigere Lösung zu nutzen, wenn eine existiert.
 
Zurück
Oben