Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung PHP

Mitglied: 4311

4311 (Level 1)

29.08.2006, aktualisiert 14.02.2007, 10095 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:
01.
<? 
02.
$db_path = "abc.dbf";  
03.
 
04.
##### DBase Datei auslesen 
05.
$db_dbase = dbase_open($db_path, 0) 								  // dbase file öffnen 
06.
	or die("Error! Konnte DBase-Datei '$db_path' nicht öffnen."); 
07.
$maxrow = dbase_numrecords ($db_dbase) 							      // Anzahl der Datensätze auslesen 
08.
	or die("Error! DBase-Datei '$db_dbase' scheint leer zu sein.");  
09.
 
10.
##### MySQL-Datenbank öffnen 
11.
$db_link = mysql_connect('localhost', 'user', 'pass') 						    // Datenbankverbindung herstellen 
12.
	or die('Keine Verbindung moeglich: ' . mysql_error());			 
13.
$db_mysql = mysql_select_db('database', $db_link)					     // Datenbank auswählen 
14.
	or die ('Kann Datenbank nicht benutzen : ' . mysql_error()); 
15.
 
16.
##### Transfer in MySQL-Datenbank 
17.
for ($i = 1; $i < $maxdata; $i++)									   // Jeder Datensatz 
18.
19.
		$db_rec[$i] = dbase_get_record_with_names ($db_dbase, $rec_nr);		      // Wird in die Variable $db_rec geschrieben 
20.
 
21.
                echo "Artikelname vor Uebergabe: ".$db_rec[$i]['ARTIKEL_NAME'];	      // Ausgabe zur Fehlersuche 
22.
		 
23.
		##### Variablen übergeben 
24.
		$ARTIKEL_NR      = $db_rec[$i]['ARTIKEL_NR']; 
25.
		$ARTIKEL_NAME = $db_rec[$i]['ARTIKEL_NAME']; 
26.
		$PREIS                = $db_rec[$i]['PREIS']; 
27.
 
28.
                echo "Artikelname nach Uebergabe: ".$ARTIKEL_NAME;	      		     // Ausgabe zur Fehlersuche 
29.
 
30.
		##### Daten in Tabelle schreiben 
31.
		mysql_query(" 
32.
		INSERT INTO 
33.
			`DATENBANK` ( `ARTIKEL_NR`, `ARTIKEL_NAME`, `PREIS`) 
34.
		VALUES 
35.
			('$ARTIKEL_NR', 'ARTIKEL_NAME', '$PREIS') 
36.
		"); 
37.
38.
 
39.
##### DBase-Datei schliessen 
40.
dbase_close ($db_dbase); 
41.
?>
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
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
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:

01.
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.
Bitte warten ..
Mitglied: 4311
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
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
01.
<?php 
02.
 
03.
$db_path = "dbfdateiname.dbf";  
04.
 
05.
##### DBase Datei auslesen 
06.
$db_dbase = dbase_open($db_path, 0)                                   // dbase file öffnen 
07.
    or die("Error! Konnte DBase-Datei '$db_path' nicht öffnen."); 
08.
$maxrow = dbase_numrecords ($db_dbase)                                   // Anzahl der Datensätze auslesen 
09.
    or die("Error! DBase-Datei '$db_dbase' scheint leer zu sein.");  
10.
 
11.
##### MySQL-Datenbank öffnen 
12.
$db_link = mysql_connect('localhost', 'user', 'pw')                             // Datenbankverbindung herstellen 
13.
    or die('Keine Verbindung moeglich: ' . mysql_error());             
14.
$db_mysql = mysql_select_db('dbname', $db_link)                         // Datenbank auswählen 
15.
    or die ('Kann Datenbank nicht benutzen : ' . mysql_error()); 
16.
 
17.
##### Transfer in MySQL-Datenbank 
18.
for ($i = 1; $i < $maxrow; $i++)                                       // Jeder Datensatz 
19.
20.
        $db_rec[$i] = dbase_get_record_with_names ($db_dbase, $rec_nr);              // Wird in die Variable $db_rec geschrieben 
21.
 
22.
                echo "Artikelname vor Uebergabe: ".$db_rec[$i]['NAME'];          // Ausgabe zur Fehlersuche 
23.
         
24.
        ##### Variablen übergeben  
25.
 
26.
        $DATUM      = iconv("850", "ISO-8859-1", $db_rec[$i]['DATUM']); 
27.
        $KELLNER 	= iconv("850", "ISO-8859-1", $db_rec[$i]['KELLNER']); 
28.
        $TISCH   	= iconv("850", "ISO-8859-1", $db_rec[$i]['TISCH']); 
29.
        $KASSE      = iconv("850", "ISO-8859-1", $db_rec[$i]['KASSE']); 
30.
		$KASSEN_KR  = iconv("850", "ISO-8859-1", $db_rec[$i]['KASSEN_KR']); 
31.
		$DISPL_ORD  = iconv("850", "ISO-8859-1", $db_rec[$i]['DISPL_ORD']); 
32.
		$ARTIKEL    = iconv("850", "ISO-8859-1", $db_rec[$i]['ARTIKEL']); 
33.
		$NAME       = iconv("850", "ISO-8859-1", $db_rec[$i]['NAME']); 
34.
		$WG         = iconv("850", "ISO-8859-1", $db_rec[$i]['WG']); 
35.
		$SPARTE     = iconv("850", "ISO-8859-1", $db_rec[$i]['SPARTE']); 
36.
		$MENGE      = iconv("850", "ISO-8859-1", $db_rec[$i]['MENGE']); 
37.
        $PREIS      = iconv("850", "ISO-8859-1", $db_rec[$i]['PREIS']); 
38.
        $MWST   	= iconv("850", "ISO-8859-1", $db_rec[$i]['MWST']); 
39.
        $RABATT   	= iconv("850", "ISO-8859-1", $db_rec[$i]['RABATT']); 
40.
        $KOMMENTAR  = iconv("850", "ISO-8859-1", $db_rec[$i]['KOMMENTAR']); 
41.
		$BONTEXT    = iconv("850", "ISO-8859-1", $db_rec[$i]['BONTEXT']); 
42.
		$GAESTE     = iconv("850", "ISO-8859-1", $db_rec[$i]['GAESTE']); 
43.
		$RECHNUNG   = iconv("850", "ISO-8859-1", $db_rec[$i]['RECHNUNG']); 
44.
		$ZEIT       = iconv("850", "ISO-8859-1", $db_rec[$i]['ZEIT']); 
45.
		$RECORD_ID  = iconv("850", "ISO-8859-1", $db_rec[$i]['RECORD_ID']); 
46.
		$TIME_STAMP = iconv("850", "ISO-8859-1", $db_rec[$i]['TIME_STAMP']); 
47.
		$Z          = iconv("850", "ISO-8859-1", $db_rec[$i]['Z']); 
48.
        $ZERO_QUOTE = iconv("850", "ISO-8859-1", $db_rec[$i]['ZERO_QUOTE']); 
49.
        $CSLINK   	= iconv("850", "ISO-8859-1", $db_rec[$i]['CSLINK']); 
50.
        $DRUCKER   	= iconv("850", "ISO-8859-1", $db_rec[$i]['DRUCKER']); 
51.
        $GRP0  		= iconv("850", "ISO-8859-1", $db_rec[$i]['GRP0']); 
52.
		$GRP1    	= iconv("850", "ISO-8859-1", $db_rec[$i]['GRP1']); 
53.
		$GRP2     	= iconv("850", "ISO-8859-1", $db_rec[$i]['GRP2']); 
54.
		$GRP3   	= iconv("850", "ISO-8859-1", $db_rec[$i]['GRP3']); 
55.
		$GRP4       = iconv("850", "ISO-8859-1", $db_rec[$i]['GRP4']); 
56.
		$GRP5  		= iconv("850", "ISO-8859-1", $db_rec[$i]['GRP5']); 
57.
		$GRP6 		= iconv("850", "ISO-8859-1", $db_rec[$i]['GRP6']); 
58.
		$GRP7      	= iconv("850", "ISO-8859-1", $db_rec[$i]['GRP7']); 
59.
		$GAST_LNK 	= iconv("850", "ISO-8859-1", $db_rec[$i]['GAST_LNK']); 
60.
		$STORNO_TYP = iconv("850", "ISO-8859-1", $db_rec[$i]['STORNO_TYP']); 
61.
 
62.
                echo "Artikelname nach Uebergabe: ".$NAME;                       // Ausgabe zur Fehlersuche 
63.
 
64.
        ##### Daten in Tabelle schreiben 
65.
        mysql_query(" 
66.
        INSERT INTO 
67.
            `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` 
68.
69.
        VALUES 
70.
            ('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'
71.
        "); 
72.
73.
 
74.
##### DBase-Datei schliessen 
75.
dbase_close ($db_dbase); 
76.
?>
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
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
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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
PHP
gelöst HTML Dropdownmenü auslesen und in PHP als Variable übergeben (35)

Frage von ITFlori zum Thema PHP ...

PHP
gelöst Externe XML-Datei in PHP auslesen (18)

Frage von Akrosh zum Thema PHP ...

VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...