Beim Auslesen einer DBase-Datei mit PHP habe ich ein Umlautproblem

Mitglied: 4311

4311

29.08.2006, aktualisiert 14.02.2007, 11266 Aufrufe, 17 Kommentare

Mein Ziel ist es, Daten einer DBase-Datenbank in eine MySQL-Datenbank zu übertragen.

Wenn ich versuche die Datensätze von einer DBase-Datenbank in die MySQL-Datenbank zu schreiben, werden alle Umlaute durch hieroglyphen ersetzt. Da die Umlaute bei beiden Testausgaben schon nicht ausgegeben werden, muss das Problem wohl entweder an meinem Script, an dem Auslesen der Datei oder an PHP liegen.

Hier ein Auszug aus dem Script:

Danke schonmal für die Hilfe
Gruß
Blueeye

Änderung(en):
05.07.2007 22:10
Ich schließe den Thread da die Lösung gefunde ist und keine weiteren Kommentare nötig sind.
masterG
Moderator
Mitglied: JohnnyB
30.08.2006 um 00:08 Uhr
Kann es evtl. sein, daß auf Deinem System DBase, MySQL, PHP und Deine eigenen Umgebungsvariablen unterschiedliche Zeichensätze benutzen (Latin-1, ASCII, UTF-8, UTF-16, ...)?

Schönen Gruß,
Johnny.
Bitte warten ..
Mitglied: 4311
4311 (Level 1)
30.08.2006 um 10:41 Uhr
Den Ansatz hatte ich auch schon, aber da hab ich auch ein Problemchen.

  • Ich weiß, daß meine MySQL Datenbanken mit "latin1_swedish_ci" laufen, und könnte das auch abändern
  • Bei PHP bin ich mir nicht sicher, welches da die Zeichensätze sind. ich hab zwar über phpinfo(); ausgelesen, daß "iconv_encoding - ISO-8859" und "mbstring.internal_encoding - UTF-8" ist. Das sind die Standardwerte. Ob die nun richtig sind etc... kein Plan.
  • Und bei der DBase-Datei finde ich momentan keine Möglichkeit die Daten auszulesen.

Gruß
Blueeye
Bitte warten ..
Mitglied: Biber
30.08.2006 um 10:56 Uhr
Und bei der DBase-Datei finde ich momentan keine Möglichkeit die Daten auszulesen.
Aber Du weißt doch bestimmt, ob es eine dBaseIII (=definitiv nicht Windows!) oder dBaseIV oder höher ist.

Ich denke, Du kommst nicht umhin, die einzelnen Zeichen in der dBase-DB manuell umzucodieren ("Wechseln/ersetzen").

Gruß
Biber
Bitte warten ..
Mitglied: 4311
4311 (Level 1)
30.08.2006 um 11:08 Uhr
Aber Du weißt doch bestimmt, ob es
eine dBaseIII (=definitiv nicht Windows!)
oder dBaseIV oder höher ist.

hmmm.... ehrlich gesagt: NEIN. ;)

Ich bekomme diese Datei uber nen FTP eines Lieferanten und will die Daten halt per Cronjob direkt in einen Onlineshop einfügen.
Ok... Aber da diese Datei mit WinZIP bepackt ist, ist davon auszugehen, daß es eine Windows-Version ist.
Bitte warten ..
Mitglied: JohnnyB
30.08.2006 um 11:16 Uhr
Hallo blueeye,

wenn Du in Deinem Skript in folgender Zeile:


statt Uebergabe Übergabe eingibst, gibt es dann Übergabe oder irgendwas wie {|bergabe aus?
Wenn da das Ü richtig angezeigt wird, denke ich auch, daß es an der Kodierung der dBase-Daten liegt.
Bitte warten ..
Mitglied: 4311
4311 (Level 1)
30.08.2006 um 11:44 Uhr
...gibt es dann Übergabe oder irgendwas wie {|bergabe aus?

es Wird dann Übergabe (also korrekt geschrieben) ausgegeben.

ich hab mir mal den Spaß erlaubt und mal die Datei übers OpenOffice ein paar mal geöffnet (weil dort immer eine Abfrage nach dem Zeichensatz kommt) Im endeffekt wurde die Datenbank dann bei dem Zeichensatz: Westeuropa (DOS/OS2-850/International) richtig angezeigt.

muss ich dann jetzt beim Auslesen was abändern oder kann ich die Datenbank irgendwie konvertieren?
falls ich diese konvertieren muss, gibt es eine möglichkeit, dies automatisch zu machen (z.B. per Script?)

Bitte warten ..
Mitglied: JohnnyB
30.08.2006 um 12:10 Uhr
Hallo blueeye,

schau mal hier, vielleicht bringt dich das ja weiter:

http://de.php.net/iconv

Schönen Gruß,
Johnny.
Bitte warten ..
Mitglied: 4311
4311 (Level 1)
30.08.2006 um 12:37 Uhr
Spitze!!!
Es funktioniert.

Musste jetzt lediglich noch die Variablenübergabe abändern in:
$ARTIKEL_NAME = iconv("850", "ISO-8859-1", $db_rec[$i]['ARTIKEL_NAME]);

Danke allen für die Hilfe! Ich hätt mich sonst wohl noch zu tode gesucht.

Dann wünsch ich mal noch allen nen schönen Arbeitstag.
Gruß
Blueeye
Bitte warten ..
Mitglied: JohnnyB
30.08.2006 um 13:09 Uhr
Freut mich, daß ich helfen konnte, ohne auch nur einen blassen Schimmer von PHP-Programmierung zu haben.

Johnny.
Bitte warten ..
Mitglied: iexplorer
13.02.2007 um 16:58 Uhr
das mit dem Übertragen aus einer dbf datei in eine MYSQL db Funktioniert bei mir nicht ich erhalte immer
Artikelname vor Uebergabe: CKER
Artikelname nach Uebergabe: CKER
das einzige was in der datei steht ist Drucker dort wäre die endung cker zu finden hm
Bitte warten ..
Mitglied: 4311
4311 (Level 1)
13.02.2007 um 18:48 Uhr
Ich denk das liegt nicht an der Convertierung sondern direkt am Auslesen der Daten. ist das bei allem so, daß die ersten 3 Buchstaben abgeschnitten werden?
Bitte warten ..
Mitglied: iexplorer
13.02.2007 um 20:37 Uhr
ja nur das cker
Bitte warten ..
Mitglied: Biber
13.02.2007 um 21:22 Uhr
Moin iexplorer,

kommentiere doch bitte mal das ohnehin nicht funktionierende INSERT INTO-Statement aus.
Da bei den VALUEs komplett die $ vor den Variablennamen fehlen, ist das ja entbehrlich im Moment.

Und dann lass den Pre-Import noch mal laufen und poste mal bitte die ersten 10 Vorher/Nachher-Ausgaben.

Übrigens- Du brauchst natürlich nur die Werte konvertieren, die auch Umlaute enthalten können.

DBase ist zwar einen Tach älter, aber Umlaute in Datums- oder Zahlenfeldern konnten die auch damals schon abfangen.
Bzw. wenn in diesen numerischen oder Datumsfeldern inzwischen Umlaute stehen, dann lohnt es sich IMHO nicht mehr, diese Daten konvertiert in mySQL-Felder zu pressen, die für numerische bzw. Datumswerte gedacht sind.

Gruss
Biber
Bitte warten ..
Mitglied: iexplorer
13.02.2007 um 22:28 Uhr
ausgabe:
DATUM vor Uebergabe: CKER
DATUM vor Uebergabe: CKER
DATUM vor Uebergabe: CKER
DATUM vor Uebergabe: CKER
DATUM vor Uebergabe: CKER
DATUM vor Uebergabe: CKER
DATUM vor Uebergabe: CKER
DATUM vor Uebergabe: CKER
DATUM vor Uebergabe: CKER
DATUM vor Uebergabe: CKER
DATUM vor Uebergabe: CKER
DATUM vor Uebergabe: CKER
DATUM vor Uebergabe: CKER

script:
<?php

$db_path = "dat.dbf";

DBase Datei auslesen
$db_dbase = dbase_open($db_path, 0) dbase file öffnen
or die("Error! Konnte DBase-Datei '$db_path' nicht öffnen.");
$maxrow = dbase_numrecords ($db_dbase)
Anzahl der Datensätze auslesen
or die("Error! DBase-Datei '$db_dbase' scheint leer zu sein.");

MySQL-Datenbank öffnen
$db_link = mysql_connect('localhost', 'user', 'pw') Datenbankverbindung herstellen
or die('Keine Verbindung moeglich: ' . mysql_error());
$db_mysql = mysql_select_db('dbname', $db_link)
Datenbank auswählen
or die ('Kann Datenbank nicht benutzen : ' . mysql_error());

Transfer in MySQL-Datenbank
for ($i = 1; $i < $maxrow; $i++) Jeder Datensatz
{

$db_rec[$i] = dbase_get_record_with_names ($db_dbase, $rec_nr);
Wird in die Variable $db_rec geschrieben

echo "Datum vor übergabe: ".$db_rec[$i]['DATUM'].""; // Ausgabe zur Fehlersuche


};

DBase-Datei schliessen
dbase_close ($db_dbase);
?>
Bitte warten ..
Mitglied: 4311
4311 (Level 1)
14.02.2007 um 09:07 Uhr
Kommt bei den Feldern 'KELNER', 'TISCH' und 'KASSE' auch die Ausgabe "CKER" raus??
Bitte warten ..
Mitglied: iexplorer
14.02.2007 um 12:16 Uhr
Nein

KELLNER vor Uebergabe: 0
KELLNER vor Uebergabe: 0
KELLNER vor Uebergabe: 0

Tisch vor Uebergabe: 0
Tisch vor Uebergabe: 0
Tisch vor Uebergabe: 0
Tisch vor Uebergabe: 0

KASSE vor Uebergabe: 0
KASSE vor Uebergabe: 0
KASSE vor Uebergabe: 0
KASSE vor Uebergabe: 0

In der dbf steht auch etwas drinne:
Array
(
[DATUM] => 20060928
[KELLNER] => 3
[TISCH] => 1
[KASSE] => 1
[KASSEN_KR] => 1
[DISPL_ORD] => 0
[ARTIKEL] => 999
[NAME] => Zigaretten
[WG] => 9
[SPARTE] => 900
[MENGE] => 1
[PREIS] => 4
[RABATT] => 0
[KOMMENTAR] =>
[BONTEXT] =>
[GAESTE] => 0
[RECHNUNG] => 0
[ZEIT] => ^
[RECORD_ID] => 0
[TIME_STAMP] => 0
[Z] => 0
[ZERO_QUOTE] => 0
[CSLINK] => 0
[DRUCKER] => 0
[GAST_LNK] => 0
[STORNO_TYP] => 0
[deleted] => 0

script:
<?php

echo "<pre>";

$dbase_db = dbase_open('dateiname.dbf', 0);
$num = dbase_numrecords($dbase_db);
for ($i=1;$i<=$num;$i++)
{
$test = dbase_get_record_with_names($dbase_db, $i);
print_r($test);
}
if ($dbase_db) {
dbase_close($dbase_db);
}

echo "</pre>";

?>
Bitte warten ..
Mitglied: iexplorer
14.02.2007 um 12:28 Uhr
ich habs oh mann
$db_rec[$i] = dbase_get_record_with_names ($db_dbase, $rec_nr);
in
$db_rec[$i] = dbase_get_record_with_names ($db_dbase, $i); ändern
Bitte warten ..
Heiß diskutierte Inhalte
Windows Server
Infrastruktur für Firma
brainwashVor 1 TagFrageWindows Server8 Kommentare

Hallo zusammen, kurze Erklärung zu meinem Problem Wir sind eine kleine Firma mit zwei Standorten im Bereich Brandschutz. Zur Zeit nutzen wir für unsere ...

Server-Hardware
Verkaufe RX300 S7 Server von Fuijutsu
HolzBrettVor 1 TagAllgemeinServer-Hardware12 Kommentare

Hi, Ich wohne in Aachen und habe die Server von der Firma umsonst erhalten. Ich habe sie bereits überprüft (es geht alles). Ich möchte ...

Windows 10
Netzwerkzugriff intern extern blockiert nach Aufbau NordVPN Verbindung
Slavik-10Vor 1 TagFrageWindows 1029 Kommentare

hallo Leute, ich habe mir vor kurzem ein VPN Anbieter bestellt. Das Problem an der ganzen Sache ist, sobald eine VPN Verbindung zu einem ...

Netzwerkprotokolle
Proxy Zugang von Extern
gelöst Jannik2018Vor 1 TagFrageNetzwerkprotokolle17 Kommentare

Hallo zusammen, ich habe mir einen Squid Proxy auf einer Linux VM aufgesetzt und möchte das man aus allen netzen drauf zugreifen kann allerdings ...

Off Topic
Namenskonzept Kundengeräte
bitnarratorVor 17 StundenFrageOff Topic5 Kommentare

Hallo, ich möchte gerne einmal die Diskussion anstoßen, weil ich eine hier in diese Richtung noch nichts gefunden habe. Es geht um die Bennenung ...

Windows Server
Kein Internetzugriff bei einem Domänenclient
KerberoVor 1 TagFrageWindows Server14 Kommentare

Hallo community, ich habe ein ganz komisches Verhalten eines Clients bei mir. Ich habe eine kleine Domäne (6 Clients und ein Windows Server 2016 ...

Sicherheit
Verpackter Laptop entwendet
r0x3llVor 6 StundenFrageSicherheit9 Kommentare

Hallo. Mir wurde aus dem Büro ein noch verpackter Dell XPS Laptop mit einem Wert von ca 3.500€ gestohlen. Kann man da was orten? ...

LAN, WAN, Wireless
Verständnisfrage VPN Performance pfSense
flabsVor 1 TagFrageLAN, WAN, Wireless8 Kommentare

Moin Kollegen, ich betreibe 3 pfSense Firewalls an 3 Standorten. Zwischen Standort A und B gibt es einen IPSec Tunnel. Der läuft seit Jahren ...