BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Programmieren (http://www.black-board.net/board.php?boardid=4)
--- PHP Firebird to Mysql (http://www.black-board.net/thread.php?threadid=22162)


Geschrieben von bomus am 16.05.2006 um 09:33:

  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? Zunge raus

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 Augenzwinkern



Geschrieben von LX am 16.05.2006 um 10:30:

Achtung 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?



Geschrieben von bomus am 16.05.2006 um 17:34:

 

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 Augen rollen
Noch etwas, Die mySQL Datenbank muss nicht nur einmal aktualisiert werden sondern periodisch.

Danke noch mal

Bomus



Geschrieben von LX am 16.05.2006 um 17:47:

Achtung

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.



Geschrieben von phlox81 am 16.05.2006 um 17:58:

 

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.



Geschrieben von bomus am 16.05.2006 um 18:25:

 

Zitat:
Original von Phlox
Oder sie löscht die exportierten Daten aus der Firebird Tabelle, könnte

Die Daten müssen in beide Datenbanken bleiben. Besser gesagt bestimmte Felder einer Tabelle müssen „immer“ gleich in beide Datenbanken sein. Also, kann ich nicht die exportierten Daten aus der Firebird löschen.

Zitat:
Original von Phlox
Die exportroutine sieht ziemlich gut aus, wäre evtl. recht einfach in ein Skript ein zu bauen

Wie gesagt würde ich gerne machen wenn ich wusste wie das geht... (oder wenn ich mehr Erfahrung mit php hätte Augenzwinkern )
Würde ich auch gerne lernen wenn ich etwas darüber finden könnte

Bomus



Geschrieben von phlox81 am 16.05.2006 um 18:49:

 

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?



Geschrieben von bomus am 16.05.2006 um 18:55:

 

Um das zu sagen muss ich auch nachfragen. Das wäre nur am Donnerstag möglich. Aber danke euch beide. Augenzwinkern

....

Also, bevor ich Phlox Frage antworten kann, wollte ich mal noch fragen:

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?



Geschrieben von phlox81 am 17.05.2006 um 08:55:

 

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



Geschrieben von bomus am 17.05.2006 um 09:07:

 

Danke erstmal,
Ich werde morgen nachfragen...

....

Also, ich sollte nur sagen:

Die Sache hat sich eigentlich erledigt. Wird
php:
1:
mysql_query 'TRUNCATE newtbl' );
benutzt auch wenn es nicht die Beste Lösung ist. (wichtig ist das ich auch verstanden habe warum es nicht am Besten wäre Augenzwinkern )

Danke auf jedem Fall für die Hilfe smile
Bomus


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH