Convertir base firebird en mysql

Description

Voici une petit bout de code pour "convertir" une base Firebird en une base MySQL.
Ce code permet:
- de créer une base MySQL ou d'écraser une existante
- de copier les tables Firebird dans MySQL
- d'importer les données
Ce code ne gère pas: (un jour peut etre)
- les clefs des tables!

L'accès aux base ce fait via PDO.

Dans mon cas j'avais juste besoin de créer une base MySQL à partir d'une base Firebird, et de copier les données.
Je n'effectue aucune mise à jour sur ma base MySQL (d'où l’absence de gestion des clefs), sont unique but est d'être une copie de la base Firebird mise en ligne sur un futur site, puisque apparemment très peu d'hébergeur propose la gestion de base Firebird.


Ce code est une adaptation de : http://www.phpcs.com/codes/CONVERTISSEUR-INTERBASE-MYSQL_44643.aspx
un grand merci à son auteur.

Source / Exemple :


<?php

#######################################################
#           SCRIPT DE CONVERSION DE BDD               #
#               INTERBASE -> MYSQL                    #
#                                                     #
# original:       le 08/11/2007 par Silk              #
#               (trooper@libertysurf.fr)              # 
# adaptation      le 25/05/2011 par F CASTEL          #
#######################################################
//source: http://www.phpcs.com/codes/CONVERTISSEUR-INTERBASE-MYSQL_44643.aspx

#script
/*

  • Fonction: Copier une base Firebird (existante) dans une base MySQL
  • Copie des tables (sauf system) et des données
  • Créer la base MySQL ou écraser celle existante
*
  • Config des Tests:
  • - WampServer 2.0 (extension php_interbase : actif)
  • - Windows 7
  • - Firebird Server 2.5
  • - PHP 5.2
  • - FireFox 4
*
  • pas de gestion des clefs des tables!!!!! TODO
  • gestion propre des erreurs : TODO
  • /
//chrono $temps_debut = microtime(true); //plus de limite de temps set_time_limit(0); //pas tres classe mais sinon sa bloque si > 30sec echo '<div class="Titre"><h1>' . 'Firebird vers MySQL' . '</h1></div>'; //CREER base MySQL if ($_POST['MySQLNew'] == 'new') { echo "<h2>" . 'Création de la base MySQL' . "</h2>"; $pdo = new PDO('mysql:host=localhost', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); $requete = 'CREATE DATABASE ' . $_POST['MySQLDBName'] . ' DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci'; echo "<p>" . $requete . "</p>"; $pdo->prepare($requete)->execute(); } echo "<h2>" . 'Les Bases de données' . "</h2>"; //PARAMETRES INTERBASE $utilisateur_interbase = $_POST['FirebirdUser']; $passe_interbase = $_POST['FirebirdPassword']; $dsn_interbase = "firebird:dbname=" . $_POST['FirebirdHost'] . ":" . str_ireplace('\\', '\\\\', $_POST['FirebirdDBName']); //il faut doubler les \ $bdd_interbase = new PDO($dsn_interbase, $utilisateur_interbase, $passe_interbase); //$bdd_interbase->exec("SET CHARACTER SET ISO8859_1"); echo "<h3>" . 'Firebird' . "</h3>"; echo "<p>" . $dsn_interbase . "</p>"; //PARAMETRES MYSQL $utilisateur_mysql = $_POST['MySQLUser']; $passe_mysql = $_POST['MySQLPassword']; $dsn_mysql = 'mysql:host=' . $_POST['MySQLHost'] . ';dbname=' . $_POST['MySQLDBName']; $bdd_mysql = new PDO($dsn_mysql, $utilisateur_mysql,$passe_mysql); //$bdd_mysql->exec("SET CHARACTER SET latin1"); echo "<h3>" . 'MySQL' . "</h3>"; echo "<p>" . $dsn_mysql . "</p>"; //RAZ base MySQL if ($_POST['MySQLNew'] == 'erase') { echo "<h2>" . 'Supprimer toutes les tables MySQL' . "</h2>"; // lister les tables $requete = 'SHOW TABLES FROM test1'; $statement = $bdd_mysql->prepare($requete, array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY)); $statement->execute(); $tables = $statement->fetchAll(PDO::FETCH_ASSOC ); echo "<p>" . count($tables) . ' Tables à traiter' . "</p>"; // virer chaque table echo '<p>'; foreach($tables as $table){ $requete = 'DROP TABLE ' . $table['Tables_in_test1']; echo $requete . '<br />'; $bdd_mysql->exec($requete); } echo '</p>'; } //LISTE TABLES FIREBIRD //liste les tables de la BDD $requete = 'SELECT DISTINCT rdb$relation_name FROM rdb$relation_fields WHERE rdb$view_context IS NULL AND rdb$system_flag = 0'; //Injection de la requête permettant de récupérer les tables $statement = $bdd_interbase->prepare($requete, array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY)); $statement->execute(); $tables = $statement->fetchAll(PDO::FETCH_ASSOC ); //traiter chaque table echo "<h2>" . 'Creation des tables FIREBIRD dans la base MySQL' . "</h2>"; echo "<p>" . count($tables) . ' Tables à traiter' . "</p>"; foreach ($tables as $table) { //traiter une table echo "<h3>" . $table['RDB$RELATION_NAME'] . "</h3>"; //lire la structure de la table $requete = 'SELECT rel_field.rdb$field_position, rel_field.rdb$field_name, field.RDB$FIELD_TYPE, field.RDB$FIELD_LENGTH, rel_field.RDB$NULL_FLAG FROM rdb$relations rel JOIN rdb$relation_fields rel_field ON rel_field.rdb$relation_name = rel.rdb$relation_name JOIN rdb$fields field ON rel_field.rdb$field_source = field.rdb$field_name WHERE rel.rdb$relation_name = \'' .$table['RDB$RELATION_NAME'] .'\' ORDER BY rel_field.rdb$field_position, rel_field.rdb$field_name'; $statement = $bdd_interbase->prepare($requete, array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY)); $statement->execute(); $res_struc_table = $statement->fetchAll(PDO::FETCH_ASSOC); //Construction de la requête de création de la table dans MySQL $req_create_table = "CREATE TABLE `".trim($table['RDB$RELATION_NAME'])."` ("; $first = true; //pour chaque champ foreach ($res_struc_table as $field) { $struct_champ = TypeChamp($field['RDB$FIELD_TYPE'] ,$field['RDB$FIELD_LENGTH']); //si field 1 pas de virgule if (!$first) { $req_create_table .= " , "; } $first = false; //c'est plus le 1er champ $req_create_table .= "`".trim($field['RDB$FIELD_NAME'])."` ".$struct_champ[0]; if ($struct_champ[1]) { $req_create_table .= "(".$struct_champ[1].")"; } if ($field['RDB$NULL_FLAG'] == 0) { $req_create_table .= " NULL"; } else { $req_create_table .= " NOT NULL"; } } $req_create_table .= ") ENGINE = MyISAM"; //clore instruction echo '<p>'; print_r($req_create_table); echo '</p>'; //créer la table dans MySQL $bdd_mysql->exec($req_create_table); } //importer les données if (isset($_POST['Import'])) { echo "<h2>" . 'Import des données FIREBIRD dans la base MySQL' . "</h2>"; foreach ($tables as $table) { echo "<h3>" . $table['RDB$RELATION_NAME'] . "</h3>"; //selections des données firebird $requete = 'SELECT * FROM ' . $table['RDB$RELATION_NAME']; $statement = $bdd_interbase->prepare($requete, array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY)); $statement->execute(); $data = $statement->fetchAll(PDO::FETCH_ASSOC ); echo '<p>' . count($data) . ' entrées' . '</p>'; //Construction de la requête d'insertion des données foreach ($data as $row) { //chaque ligne de table $req_insert = "INSERT INTO `" . trim($table['RDB$RELATION_NAME']) . "` SET "; $first = true; $key = key($row); $val = current($row); reset($row); while(list ($key, $val) = each ($row)) //chaque champ { if (!$first) { $req_insert .= " , "; } $first = false;//c'est plus le 1er champ //Correction des valeurs texte $val = str_replace("'","\'",$val); //$val = utf8_decode($val); $req_insert .= "`" . $key . "`='" . addslashes($val) . "'"; } //insert LA ligne dans MySQL $bdd_mysql->exec($req_insert); } } } //FIN echo '<h1>' . 'Script executé !' . '</h1>'; $temps_fin = microtime(true); echo '<p><strong>' . 'Temps d\'execution : '.round($temps_fin - $temps_debut, 0) . ' secondes' . '</strong></p>'; ?> </body> </html> <?php #FONCTIONS function TypeChamp ($champ,$taille) { switch ($champ) { case 7: return array('SMALLINT',$taille); break; case 8: return array('INT',$taille); break; case 16: return array('BIGINT',$taille); break; case 10: return array('FLOAT',''); break; case 11: //return 'D_Float'; return 'erreur'; break; case 27: return array('DOUBLE',''); break; case 9: //return 'Quad'; return 'erreur'; break; case 14: return array('CHAR',$taille); break; case 37: return array('VARCHAR',$taille); break; case 40: //return 'CString'; return 'erreur'; break; case 13: return array('TIME',''); break; case 12: return array('DATE',''); break; case 35: return array('TIMESTAMP',''); break; case 261: return array('BLOB',''); break; } } #FIN FONCTIONS ?>

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.