4311
Goto Top

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

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:
<?
$db_path = "abc.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', 'pass') 						    // Datenbankverbindung herstellen  
	or die('Keine Verbindung moeglich: ' . mysql_error());			  
$db_mysql = mysql_select_db('database', $db_link)					     // Datenbank auswählen  
	or die ('Kann Datenbank nicht benutzen : ' . mysql_error());  

##### Transfer in MySQL-Datenbank
for ($i = 1; $i < $maxdata; $i++)									   // Jeder Datensatz
	{
		$db_rec[$i] = dbase_get_record_with_names ($db_dbase, $rec_nr);		      // Wird in die Variable $db_rec geschrieben

                echo "Artikelname vor Uebergabe: ".$db_rec[$i]['ARTIKEL_NAME'];	      // Ausgabe zur Fehlersuche  
		
		##### Variablen übergeben
		$ARTIKEL_NR      = $db_rec[$i]['ARTIKEL_NR'];  
		$ARTIKEL_NAME = $db_rec[$i]['ARTIKEL_NAME'];  
		$PREIS                = $db_rec[$i]['PREIS'];  

                echo "Artikelname nach Uebergabe: ".$ARTIKEL_NAME;	      		     // Ausgabe zur Fehlersuche  

		##### Daten in Tabelle schreiben
		mysql_query("  
		INSERT INTO
			`DATENBANK` ( `ARTIKEL_NR`, `ARTIKEL_NAME`, `PREIS`)
		VALUES
			('$ARTIKEL_NR', 'ARTIKEL_NAME', '$PREIS')  
		");  
	}

##### DBase-Datei schliessen
dbase_close ($db_dbase);
?>

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

Content-Key: 38942

Url: https://administrator.de/contentid/38942

Printed on: April 19, 2024 at 03:04 o'clock

Member: JohnnyB
JohnnyB Aug 29, 2006 at 22:08:22 (UTC)
Goto Top
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.
Mitglied: 4311
4311 Aug 30, 2006 at 08:41:41 (UTC)
Goto Top
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
Member: Biber
Biber Aug 30, 2006 at 08:56:55 (UTC)
Goto Top
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
Mitglied: 4311
4311 Aug 30, 2006 at 09:08:06 (UTC)
Goto Top
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.
Member: JohnnyB
JohnnyB Aug 30, 2006 at 09:16:36 (UTC)
Goto Top
Hallo blueeye,

wenn Du in Deinem Skript in folgender Zeile:

echo "Artikelname vor Uebergabe: ".$db_rec[$i]['ARTIKEL_NAME'];  

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.
Mitglied: 4311
4311 Aug 30, 2006 at 09:44:03 (UTC)
Goto Top
...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?)
Member: JohnnyB
JohnnyB Aug 30, 2006 at 10:10:34 (UTC)
Goto Top
Hallo blueeye,

schau mal hier, vielleicht bringt dich das ja weiter:

http://de.php.net/iconv

Schönen Gruß,
Johnny.
Mitglied: 4311
4311 Aug 30, 2006 at 10:37:33 (UTC)
Goto Top
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
Member: JohnnyB
JohnnyB Aug 30, 2006 at 11:09:57 (UTC)
Goto Top
Freut mich, daß ich helfen konnte, ohne auch nur einen blassen Schimmer von PHP-Programmierung zu haben.

Johnny.
Member: iexplorer
iexplorer Feb 13, 2007 at 15:58:32 (UTC)
Goto Top
<?php

$db_path = "dbfdateiname.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 "Artikelname vor Uebergabe: ".$db_rec[$i]['NAME'];          // Ausgabe zur Fehlersuche  
        
        ##### Variablen übergeben 

        $DATUM      = iconv("850", "ISO-8859-1", $db_rec[$i]['DATUM']);  
        $KELLNER 	= iconv("850", "ISO-8859-1", $db_rec[$i]['KELLNER']);  
        $TISCH   	= iconv("850", "ISO-8859-1", $db_rec[$i]['TISCH']);  
        $KASSE      = iconv("850", "ISO-8859-1", $db_rec[$i]['KASSE']);  
		$KASSEN_KR  = iconv("850", "ISO-8859-1", $db_rec[$i]['KASSEN_KR']);  
		$DISPL_ORD  = iconv("850", "ISO-8859-1", $db_rec[$i]['DISPL_ORD']);  
		$ARTIKEL    = iconv("850", "ISO-8859-1", $db_rec[$i]['ARTIKEL']);  
		$NAME       = iconv("850", "ISO-8859-1", $db_rec[$i]['NAME']);  
		$WG         = iconv("850", "ISO-8859-1", $db_rec[$i]['WG']);  
		$SPARTE     = iconv("850", "ISO-8859-1", $db_rec[$i]['SPARTE']);  
		$MENGE      = iconv("850", "ISO-8859-1", $db_rec[$i]['MENGE']);  
        $PREIS      = iconv("850", "ISO-8859-1", $db_rec[$i]['PREIS']);  
        $MWST   	= iconv("850", "ISO-8859-1", $db_rec[$i]['MWST']);  
        $RABATT   	= iconv("850", "ISO-8859-1", $db_rec[$i]['RABATT']);  
        $KOMMENTAR  = iconv("850", "ISO-8859-1", $db_rec[$i]['KOMMENTAR']);  
		$BONTEXT    = iconv("850", "ISO-8859-1", $db_rec[$i]['BONTEXT']);  
		$GAESTE     = iconv("850", "ISO-8859-1", $db_rec[$i]['GAESTE']);  
		$RECHNUNG   = iconv("850", "ISO-8859-1", $db_rec[$i]['RECHNUNG']);  
		$ZEIT       = iconv("850", "ISO-8859-1", $db_rec[$i]['ZEIT']);  
		$RECORD_ID  = iconv("850", "ISO-8859-1", $db_rec[$i]['RECORD_ID']);  
		$TIME_STAMP = iconv("850", "ISO-8859-1", $db_rec[$i]['TIME_STAMP']);  
		$Z          = iconv("850", "ISO-8859-1", $db_rec[$i]['Z']);  
        $ZERO_QUOTE = iconv("850", "ISO-8859-1", $db_rec[$i]['ZERO_QUOTE']);  
        $CSLINK   	= iconv("850", "ISO-8859-1", $db_rec[$i]['CSLINK']);  
        $DRUCKER   	= iconv("850", "ISO-8859-1", $db_rec[$i]['DRUCKER']);  
        $GRP0  		= iconv("850", "ISO-8859-1", $db_rec[$i]['GRP0']);  
		$GRP1    	= iconv("850", "ISO-8859-1", $db_rec[$i]['GRP1']);  
		$GRP2     	= iconv("850", "ISO-8859-1", $db_rec[$i]['GRP2']);  
		$GRP3   	= iconv("850", "ISO-8859-1", $db_rec[$i]['GRP3']);  
		$GRP4       = iconv("850", "ISO-8859-1", $db_rec[$i]['GRP4']);  
		$GRP5  		= iconv("850", "ISO-8859-1", $db_rec[$i]['GRP5']);  
		$GRP6 		= iconv("850", "ISO-8859-1", $db_rec[$i]['GRP6']);  
		$GRP7      	= iconv("850", "ISO-8859-1", $db_rec[$i]['GRP7']);  
		$GAST_LNK 	= iconv("850", "ISO-8859-1", $db_rec[$i]['GAST_LNK']);  
		$STORNO_TYP = iconv("850", "ISO-8859-1", $db_rec[$i]['STORNO_TYP']);  

                echo "Artikelname nach Uebergabe: ".$NAME;                       // Ausgabe zur Fehlersuche  

        ##### Daten in Tabelle schreiben
        mysql_query("  
        INSERT INTO
            `tabellenname` ( `DATUM`, `KELLNER`, `	TISCH`, `KASSE`, `KASSEN_KR`, `DISPL_ORD`, `ARTIKEL`, `NAME`, `WG`, `SPARTE`, `MENGE`, `PREIS`, `MWST`, `RABATT`, `KOMMENTAR`, `BONTEXT`, `GAESTE`, `RECHNUNG`, `ZEIT`, `RECORD_ID`, `TIME_STAMP`, `Z`,	`ZERO_QUOTE`, `CSLINK`, `DRUCKER`, `GRP0`, `GRP1`, `GRP2`, `GRP3`, `GRP4`, `GRP5`, `GRP6`, `GRP7`, `GAST_LNK`, `STORNO_TYP`
)
        VALUES
            ('DATUM', 'KELLNER', '	TISCH', 'KASSE', 'KASSEN_KR', 'DISPL_ORD', 'ARTIKEL', 'NAME', 'WG', 'SPARTE', 'MENGE', 'PREIS', 'MWST', 'RABATT', 'KOMMENTAR', 'BONTEXT', 'GAESTE', 'RECHNUNG', 'ZEIT', 'RECORD_ID', 'TIME_STAMP', 'Z',	'ZERO_QUOTE', 'CSLINK', 'DRUCKER', 'GRP0', 'GRP1', 'GRP2', 'GRP3', 'GRP4', 'GRP5', 'GRP6', 'GRP7', 'GAST_LNK', 'STORNO_TYP')  
        ");  
    }

##### DBase-Datei schliessen
dbase_close ($db_dbase);
?>
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
Mitglied: 4311
4311 Feb 13, 2007 at 17:48:10 (UTC)
Goto Top
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?
Member: iexplorer
iexplorer Feb 13, 2007 at 19:37:29 (UTC)
Goto Top
ja nur das cker
Member: Biber
Biber Feb 13, 2007 at 20:22:20 (UTC)
Goto Top
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
Member: iexplorer
iexplorer Feb 13, 2007 at 21:28:08 (UTC)
Goto Top
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);
?>
Mitglied: 4311
4311 Feb 14, 2007 at 08:07:49 (UTC)
Goto Top
Kommt bei den Feldern 'KELNER', 'TISCH' und 'KASSE' auch die Ausgabe "CKER" raus??
Member: iexplorer
iexplorer Feb 14, 2007 at 11:16:40 (UTC)
Goto Top
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>";

?>
Member: iexplorer
iexplorer Feb 14, 2007 at 11:28:14 (UTC)
Goto Top
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