|
|
|
|
Firebird to Mysql |
bomus
Aufsteiger
Dabei seit: 03.11.2004
Beiträge: 53
|
|
Firebird to Mysql |
|
Hallo zusammen,
Ich hab ein Problem. Ich hab ein kleines php Skript geschrieben aber habe keine Möglichkeit um es zu testen. Da das ich nur wenig Erfahrung mit PHP habe, ich will nur mal fragen ob es funktionieren würde oder ob total falsch geschrieben ist… und wenn falsch ist… bin ich zumindest auf dem richtigen weg?
Der Skript sollte Daten aus eine Firebird Datenbank holen und sie in eine mysql Datenbank schreiben.
php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
|
<?php
$firebirdhost = '000.000.000.000:C:/path/firebirddb.fdb';
$firebirdusername = 'username';
$firebirdpass = 'pass';
$dbh = ibase_connect ( $firebirdhost , $firebirdusername , $firebirdpass ) or die ("error in db connect");
$stmt="Select * from mytbl";
$info=array();
while ($query=ibase_fetch_array($stmt))
{ $info[]=array($query['feld1'],$query['feld2'],$query['feld3'],$query['feld4'],$query['feld5']); }
ibase_close($dbh);
$mysqlhost = ''
$mysqlusername = ''
$mysqlpass = ''
$conn = mysql_connect( $mysqlhost , $mysqlusername , $mysqlpass ) or die ("error in db connect");
foreach ($info as $x)
mysql_query("INSERT INTO newtbl ('feld1','feld2','feld3','feld4','feld5')
VALUES ('". mysql_escape_string($x['feld1']) ."',
'". mysql_escape_string($x['feld2']) ."',
'". mysql_escape_string($x['feld3']) ."',
'". mysql_escape_string($x['feld4']) ."',
'". mysql_escape_string($x['feld5']) ."')");
mysql_close ($conn);
?> |
|
Danke
__________________ Durch Fehler lernt man viel (es sollte auch für mein Deutsch gelten
)
|
|
16.05.2006 09:33 |
|
|
LX
El Comandante en Jefe
Dabei seit: 25.11.2001
Beiträge: 5.372
Herkunft: Berliner Bronx
|
|
RE: Firebird to Mysql |
|
Zwischen Zeile 9 und 11 hast du vergessen, den Query auch auszuführen. Statt
php: |
1:
2:
3:
4:
|
$stmt="Select * from mytbl";
$info=array();
while ($query=ibase_fetch_array($stmt)) |
|
sollte da also
php: |
1:
2:
3:
4:
|
$stmt=ibase_query("Select * from mytbl");
$info=array();
while ($query=ibase_fetch_array($stmt)) |
|
stehen. Statt ibase_fetch_array() würde ich dir auch ibase_fetch_assoc() empfehlen, zumal es die andere Funktion laut PHP-Manual gar nicht gibt *g* Der Rest des Codes bleibt davon aber unabhängig.
Im mySQL-Part gehört zwischen Zeile 20 und 22 noch die Auswahl der Datenbank:
php: |
1:
|
mysql_select_db ( 'dbname' ); |
|
Ansonsten haut das schon so in etwa hin. Zu beachten ist natürlich auch, dass in mySQL die entsprechende Tabelle mit gleichen Datentypen wie die alte Tabelle bereits angelegt sein muss.
Gibt es eigentlich einen besonderen Grund, dass du das mittels PHP-Script machen willst und nicht einfach eine Exportroutine für Firebird nutzt, die dir SQL-Code ausspuckt, den du dann in mySQL importieren kannst?
__________________ JS-Games.de - Misled Scripting Skills Gone Mad | Meine Filmkritiken | Urban Photography
Kommt mal in den IRC-Channel: irc.eu.freenode.net | Port 6667 | #blackboard
"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett
|
|
16.05.2006 10:30 |
|
|
bomus
Aufsteiger
Dabei seit: 03.11.2004
Beiträge: 53
Themenstarter
|
|
Hi Lx und danke,
Zitat: |
Zu beachten ist natürlich auch, dass in mySQL die entsprechende Tabelle mit gleichen Datentypen wie die alte Tabelle bereits angelegt sein muss. |
Ich hab mir gedacht weil die Tabelle nur einmal gemacht sein muss es separat machen.
Zitat: |
Gibt es eigentlich einen besonderen Grund, dass du das mittels PHP-Script machen willst und nicht einfach eine Exportroutine für Firebird nutzt, die dir SQL-Code ausspuckt, den du dann in mySQL importieren kannst? |
Der Grund wäre das ich gar nix über Firebird Datenbanken kenne. Auch wenn ich ein Bisschen in google gesucht habe und auch ein wenig darüber gelesen, habe ich nichts gefunden was man als Exportroutine bezeichnen könnte. Die Idee wäre natürlich schön wenn ich es wüsste wie man das macht
Noch etwas, Die mySQL Datenbank muss nicht nur einmal aktualisiert werden sondern periodisch.
Danke noch mal
Bomus
__________________ Durch Fehler lernt man viel (es sollte auch für mein Deutsch gelten
)
|
|
16.05.2006 17:34 |
|
|
LX
El Comandante en Jefe
Dabei seit: 25.11.2001
Beiträge: 5.372
Herkunft: Berliner Bronx
|
|
Wenn du die Datenbanken periodisch synchronisieren willst, solltest du aber die mySQL-Datenbank vor jedem Durchlauf leeren, da sich sonst die Einträge doppeln, gelöschte Einträge nicht entfernt werden oder es zu Schlüsselkollisionen kommen kann.
Ein
php: |
1:
|
mysql_query ( 'TRUNCATE newtbl' ); |
|
sollte bereits ausreichen dafür.
Wegen der Exportroutine: Ich hab keine Ahnung von Firebird-Datenbanken, ging aber davon aus, dass es etwas ähnliches wie mysqldump auch dafür gibt. Offenbar ist dem nicht so, aber ich habe hier etwas gefunden, was zumindest die Daten einer Firebird-Datenbank als SQL-Datei exportieren kann. Je nach dem, wie gut der Output davon ist, könnte man das dem PHP-Weg vorziehen.
__________________ JS-Games.de - Misled Scripting Skills Gone Mad | Meine Filmkritiken | Urban Photography
Kommt mal in den IRC-Channel: irc.eu.freenode.net | Port 6667 | #blackboard
"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett
|
|
16.05.2006 17:47 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
Zitat: |
Original von LX
Wenn du die Datenbanken periodisch synchronisieren willst, solltest du aber die mySQL-Datenbank vor jedem Durchlauf leeren, da sich sonst die Einträge doppeln, gelöschte Einträge nicht entfernt werden oder es zu Schlüsselkollisionen kommen kann.
|
Oder sie löscht die exportierten Daten aus der Firebird Tabelle, könnte
sinnvoller sein, wenn die Daten in der MySQL tabelle länger vorgehalten werden sollen.
Die exportroutine sieht ziemlich gut aus, wäre evtl. recht einfach in ein Skript
ein zu bauen, welches dann die Daten automatisch ex/importiert.
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
16.05.2006 17:58 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
Dann musst du sicherstellen, das keine Datensätze doppelt eingetragen werden.
Da wäre es sinnvoll evtl. mal was über die Struktur der Tabelle zu wissen.
Gibts da eine art Timestamp wo man sehen kann, wann ein Datensatz geschrieben wurde?
Dann könnte man das benutzen, um festzustellen, welche Datensätze
neu sind, und nach mysql übertragen werden müssen.
Wie groß ist denn die Tabelle?
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
16.05.2006 18:49 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
Zitat: |
Original von bomus
So wie ich es verstehe
php: |
1:
|
mysql_query ( 'TRUNCATE newtbl' ); |
|
sollte erstmal alles aus der neue Tabelle löschen.
Dann alle Daten aus Firebird (inklusive die Daten die bereits aus der MySQL gelöscht wurden aber die immer noch in Firebird sind) werden wider in MySQL geschrieben.
Hab ich das richtig verstanden? |
Ja, alles wird dann immer wieder rüber geschrieben.
Ich glaube das macht keinen Sinn, jedes mal die ganze Tabelle zu kopieren.
Das sind ja irgendwann mal ein paar GB evtl.
Deshalb ja auch die Frage nach dem Timestamp, wenns keinen gibt, frag mal
vorsichtig nach, ob man da nicht einen einbauen könnte, wäre auch interessant
zu wissen wo die daten genau herkommen, ob die nicht direkt in die mysql geschmissen werden können z.b.
phlox
__________________ Intelligenz ist eine Illusion des Menschen
phlox81.de | codenode.de
|
|
17.05.2006 08:55 |
|
|
bomus
Aufsteiger
Dabei seit: 03.11.2004
Beiträge: 53
Themenstarter
|
|
|
17.05.2006 09:07 |
|
|
|
|
|
|