Umlaute in Domain und dann in SQL

kekskruemel

Angesehenes Mitglied
Hallo,

ich habe ein Formular, welches ich anderen Seiten anbiete. Nun können dort auch Suchbegriffe in das HTML Formular eingegeben werden mit Umlauten.

Das Formular ruft dann eine Datei auf meinem Server auf und übergibt die Variable "such" mit dem Wort und ggf. den Umlauten in diesem Wort.


Das Skript in der php Datei soll nun in meiner SQL Datenbank entsprechend suchen. Bei Wörtern ohne Umlaut funktioniert dies. Aber bei Wörtern mit Umlaut gibt es Probleme.

Wenn ich das Wort was übergeben wird per Echo ausgeben lasse, dann ist es auch korrekt dargestellt mittels Umlaute.

In meiner Datenbank ist es auch mittels Umlaute vorhanden.

Woran kann dies liegen?


grüße
 
Und die Kodierung der Website ist wie? - Denn danach richtet es sich, wie der String übergeben wird.

Ich vermute mal, die Website arbeitet auf mit UTF-8.
Wird das MySQL- oder MySQLi-Module von PHP verwendet?


Grundlegender Tipp: Nach Möglichkeit sollte einfach alles die gleiche Zeichenkodierung haben, sprich Website, PHP-Datei und DB.
 
Die Webseite nutzt UTF-8.
MySQL Modul wird genutzt.

Also sollte ich mal schauen, dass ich meine DB Tabelle umcodiere?
Dann müsste ich selber mal schauen, wie ich das mache ohne das dies Einfluss auf meine eigentliche Webseite hat, die diese DB nutzt.

 
Also das hört sich stark danach an, alternativ kannst Du versuchen die Zeichenkodierung für MySQL zu setzen:

CODE $db_handle = mysql_connect('localhost', 'username', 'password');
mysql_set_charset('latin1', $db_handle); // diese Zeile für PHP ab Version 5.2.3
mysql_query('SET NAMES latin1', $db_handle); // diese Zeile für PHP bis Version 5.2.3


Wobei Du für deutsche Umlaute vermutlich eher latin1_german_ci nutzen solltest in der Datenbank.

Aber wie gesagt, wenn Du es bewerkstelligen kannst, würde ich hier eine klare Zeichenkodierung durchziehen, denn alles andere kann sehr schnell mal zum Ausprobieren verkommen, damit es sauber arbeitet.
 
QUOTE (kekskruemel @ So 26.02.2012, 23:25)Die Webseite nutzt UTF-8.
MySQL Modul wird genutzt.

Also sollte ich mal schauen, dass ich meine DB Tabelle umcodiere?


Das Problem ist 100% das "manche" Nutzerseite nicht UTF sondern iso ist

also
Da Du an allen Orten "das selbe" machst
ist bei Dir alles richtig
Du mußt "falsch angelieferte Zeichensätze" nach "richtig" ändern


QUOTE (kekskruemel @ So 26.02.2012, 20:43)ich habe ein Formular, welches ich anderen Seiten anbiete.

Das Formular wird auf einer externen Seite ausgefüllt
und mit dem dort gültigen Zeichensatz an dich geschickt

ich hab für meinen URLcatcher (für Shoter und so ...)
nen Quick&Dirty Converter
(bei mir von UTF zu iso ... du müßtest das andersum machen)


oder etwas "suberer"
$Gtit=urldecode($_GET['Gtit']);

aber da kanns passieren das was umgewandelt wird das nicht umgewandelt werden soll

CODE
 $GETurl=$_GET['Gurl'];
 $GETtit=$_GET['Gtit'];
 $_GET['Gurl']=str_replace('%C3%A4', 'ä', $_GET['Gurl']);
 $_GET['Gurl']=str_replace('%C3%B6', 'ö', $_GET['Gurl']);
 $_GET['Gurl']=str_replace('%C3%BC', 'ü', $_GET['Gurl']);
 $_GET['Gurl']=str_replace('%C3%84', 'Ä', $_GET['Gurl']);
 $_GET['Gurl']=str_replace('%C3%96', 'Ö', $_GET['Gurl']);
 $_GET['Gurl']=str_replace('%C3%9C', 'Ü', $_GET['Gurl']);
 $_GET['Gurl']=str_replace('%C3%9F', 'ß', $_GET['Gurl']);
 $_GET['Gurl']=urldecode($_GET['Gurl']);
 
 $_GET['Gtit']=str_replace('%C3%A4', 'ä', $_GET['Gtit']);
 $_GET['Gtit']=str_replace('%C3%B6', 'ö', $_GET['Gtit']);
 $_GET['Gtit']=str_replace('%C3%BC', 'ü', $_GET['Gtit']);
 $_GET['Gtit']=str_replace('%C3%84', 'Ä', $_GET['Gtit']);
 $_GET['Gtit']=str_replace('%C3%96', 'Ö', $_GET['Gtit']);
 $_GET['Gtit']=str_replace('%C3%9C', 'Ü', $_GET['Gtit']);
 $_GET['Gtit']=str_replace('%C3%9F', 'ß', $_GET['Gtit']);

 $_GET['Gtit']=str_replace('%C5%9E', 'Ş', $_GET['Gtit']);
 $_GET['Gtit']=str_replace('%C5%9E', 'Ş', $_GET['Gtit']);
 $_GET['Gtit']=str_replace('%C5%9E', 'Ş', $_GET['Gtit']);
 $_GET['Gtit']=str_replace('%C3%A7', 'ç', $_GET['Gtit']);
 $_GET['Gtit']=str_replace('%C4%B0', 'İ', $_GET['Gtit']);

 $_GET['Gtit']=str_replace('%E2%80%9E', '„', $_GET['Gtit']);
 $_GET['Gtit']=str_replace('%E2%80%9C', '“', $_GET['Gtit']);
 $_GET['Gtit']=str_replace('%E2%80', '', $_GET['Gtit']);
 $_GET['Gtit']=str_replace('%C2', '', $_GET['Gtit']);

 $Gurl=          $_GET['Gurl'];
 $Gtit=urldecode($_GET['Gtit']);
 //$content.='<br>»»·· '.$Gurl;
 //$content.='<br>»»·· '.$Gtit;

 
Ich habe die Datenbank auch mal in UTF-8 umgebaut.
Funktioniert leider nicht!
sad.gif


Folgende Beispiele der "sendenden" Partnerseiten:
http://freisprit.de/auto_spritpreise.php
--> ruft meine Datei auf und übermittelt Köln als K%F6ln --> aber keine Ergebnisse

auch http://www.kfz-auskunft.de/info/benzinpreise.html ruft Umlaute in dieser Variante in die URL --> aber keine Ergebnisse bei Umlaut-Städten

dasselbe auch bei anderen Partnern.


Mein Skript:

CODE
<?php

// Datenbankverbindung per include

$content = "<html><head><title>Tankcheck.de</title><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><link href='style.css' rel='stylesheet' type='text/css' media='all'></head><body>";

// Kraftstoff
// die PLZ nach der wir suchen
$plz = mysql_real_escape_string($_GET['such']);
$plz = htmlentities($plz, ENT_QUOTES);
// Land



$sql_plz = mysql_query("SELECT //gekürzt
FROM // gekürzt
WHERE // gekürzt
City = '".$plz."'
") or die(mysql_error());

// Ausgabe
// gekürzt




 
QUOTE (kekskruemel @ Mo 27.02.2012, 10:58)[...] --> ruft meine Datei auf und übermittelt Köln als K%F6ln --> aber keine Ergebnisse [...]

Hier wird der Umlaut nach ISO-8859-1 übergeben, vermutlich nutzen andere Partner wieder UTF8 usw...

Ich frage mich aber, wieso man überhaupt beliebige Eingabedaten ohne mindestens einer Filterung nach nach der Zeichenkodierung verarbeitet.

Empfehlung wäre es die Zeichenkodierung zu ermitteln und dann umzuwandeln, je nachdem wie es ankommt:
http://www.php.net/rawurldecode
http://www.php.net/mb_detect_encoding
http://www.php.net/mb_convert_encoding

Oder den Partnern die Kodierung vorgeben und alles andere ablehnen, dafür müsstest Du Dir natürlich im Zweifeln einen eigenen Filter bauen.
 
Danke Sascha,
ich schaue mir das heute Abend mal an, wie ich das zu verwenden habe und teste es.

Wenn ich es richtig verstehe, kann ich also mit den php Funktionen die Variable testen in welcher Codierung diese ist und mir dann in meiner gewollten Codierung codieren?
 
Du kannst herausfinden welche Kodierung am ehesten passt, daher kann Du auch die Reihenfolge der Erkennung beeinflussen, denn gewisse Zeichen gleichen sich in den Zeichenkodierungen. Und mit der Letzten kannst Du es umwandeln.

Die erste Funktion dienst dazu, wenn Du url-kodierte Zeichen hereingebekommt, dieste um zu wandeln in die Zeichenkodierung.
 
QUOTE (kekskruemel @ Mo 27.02.2012, 11:58) Ich habe die Datenbank auch mal in UTF-8 umgebaut.
Funktioniert leider nicht!
sad.gif


Folgende Beispiele der "sendenden" Partnerseiten:

wie schon gesagt
Dein Problem ist nicht
* deine SIte
* deine SQL

Dein Problem ist die "Anlieferung" von z.B. freisprit.de/auto_spritpreise.php

CODE <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">


//EDIT
eigene Site & SQL können glaub auc ein Problem kriegen
im Falle das
* html Header einen Zeichensatz
* http Header anderen Zeichensatz

die freisprit hatte keinen HTTP-Header für den Zeichensatz
 
Ich habe es damit probiert. Bin leider damit auf keine Lösung gekommen.

Was ich seltsam finde ist, dass wenn z.B. wie oben dargestellt "Köln" gesucht wird und an meine Datei gesendet wird, dann geht es an diese Adresse in dem Aussehen:

http://tankcheck.de/partner/freisprit/tank...2&action=Suchen

Die Variable "such" wird dann direkt auch in der Überschrift der Seite ausgegeben und da steht es auf meiner UTF-8 formatierten Seite auch als korrektes Köln drin mit Umlaut.
So sollte es doch dann auch an meine Datenbank gehen oder?

Mit den Funktionen hatte ich es nicht hinbekommen.
Mein erster Versuch war so:

CODE
...
$plz = $_GET['such'];
if( mb_detect_encoding($plz,"UTF-8, ISO-8859-1")!="UTF-8" )
{
$plz = mb_convert_encoding($plz,'utf8','ISO-8859-1');
}
$plz = mysql_real_escape_string($plz);
$plz = htmlentities($plz, ENT_QUOTES);
...

 
Ich würde es wohl so versuchen:

CODE
$plz = $_GET['such'];


// weitere Checks, wie Zeilenumbrueche, Nullbytes usw.
// hier einfuegen


/* urlencoded String? */
if ( preg_match('/^((%[0-9A-F]{2})+|[a-zA-Z0-9]+)+$/m', $plz) )
{
  $plz = rawurldecode($plz);
}

// fuer ... weitere Kodierungen anfuegen
$encoding = mb_detect_encoding($plz, 'ISO-8859-1, UTF-8, ISO-8859-2, ISO-8859-3, ...', TRUE);



/* Variante 1 */
if ( $encoding != 'UTF-8' && $encoding == 'ISO-8859-1' )
{
  $plz = mb_convert_encoding($plz, 'UTF-8', 'ISO-8859-1');
}
else
{
  exit('Fehler: Diese Kodierung wird nicht unterstuetzt');
}

/* Variante 2
if ( $encoding != 'UTF-8' && in_array($encoding, mb_internal_encoding()) )
{
  $plz = mb_convert_encoding($plz, 'UTF-8', $encoding);
}
else
{
  exit('Fehler: Diese Kodierung wird nicht unterstuetzt');
}
*/



// Warum liegt hier Stroh?
//$plz = mysql_real_escape_string($plz);
//$plz = htmlentities($plz, ENT_QUOTES);

$plz_in_db = mysql_real_escape_string($plz);
$plz_output = htmlentities($plz, ENT_QUOTES);



// Debug-Ausgabe (nachher loeschen)
echo $_GET['such'] . '<br>'
echo $plz_output . '<br>';
echo $plz_in_db;

 
Ich habe nun Saschas Variante getestet:
Ich erhalte dann genau die Meldung, die im else Bereich steht.

Dann habe ich die Variante von Peter auf tanken.eu in dem Formular integriert gehabt als Partner. Dort ist das Problem nämlich genauso vorhanden und dort ist die Seite utf-8 und es geht ebenfalls nicht.
Auch wenn ich noch separat in dem form-Tag das charset auf utf-8 setzte.

 
QUOTE (kekskruemel @ Di 28.02.2012, 08:36) Vielen Dank,
ich habe es nun hinbekommen!

was möhten Sie jetzt tun
(A) die Lösung mitteilen
(B) den Thread löschen, der nächste kann dann von vorne fragen
?
 
Der Tipp von Sascha hat so funktioniert mit der Variante 1.

Damit konnte ich alle Seiten abfangen, die in ISO-8859-1 senden.
Zudem habe ich den Code nun so geändert, das das Formular für Partner auch nun vorgibt in was es gesendet wird.
Da es einige gab, die in UTF-8 senden aber trotzdem nicht funktioniert hatten, selbst wenn ich dort im Form-Tag UTF-8 zwangsfestlege, habe ich nun im form Tag ISO-8859-1 festgelegt und das wird dann bei mir in UTF-8 durch den Code von Sascha umgearbeitet.
So funktioniert es nun bei allen Partnerseiten, egal was die Seite für eine Codierung nutzt.
 
Zurück
Oben