Convertir base firebird en mysql--------------------------------
Url     : http://codes-sources.commentcamarche.net/source/53216-convertir-base-firebird-en-mysqlAuteur  : castelfrederic29Date    : 06/08/2013
Licence :
=========

Ce document intitul  Convertir base firebird en mysql  issu de CommentCaMarche
(codes-sources.commentcamarche.net) est mis  disposition sous les termes de
la licence Creative Commons. Vous pouvez copier, modifier des copies de cette
source, dans les conditions fixes par la licence, tant que cette note
apparat clairement.

Description :
=============

Voici une petit bout de code pour &quot;convertir&quot; une base Firebird en une
 base MySQL.
<br />Ce code permet:
<br /> - de cr&eacute;er une base MySQL ou 
d'&eacute;craser une existante
<br /> - de copier les tables Firebird dans MySQ
L
<br /> - d'importer les donn&eacute;es
<br />Ce code ne g&egrave;re pas: (un
 jour peut etre)
<br /> - les clefs des tables! 
<br />
<br />L'acc&egrave;s 
aux base ce fait via PDO.
<br />
<br />Dans mon cas j'avais juste besoin de cr
&eacute;er une base MySQL &agrave; partir d'une base Firebird, et de copier les 
donn&eacute;es.
<br />Je n'effectue aucune mise &agrave; jour sur ma base MySQL
 (d'o&ugrave; l&#8217;absence de gestion des clefs), sont unique but est d'&ecir
c;tre une copie de la base Firebird mise en ligne sur un futur site, puisque app
aremment tr&egrave;s peu d'h&eacute;bergeur propose la gestion de base Firebird.

<br />
<br /> 
<br />Ce code est une adaptation de : <a href='http://www.php
cs.com/codes/CONVERTISSEUR-INTERBASE-MYSQL_44643.aspx' target='_blank'>http://ww
w.phpcs.com/codes/CONVERTISSEUR-INTERBASE-MYSQL_44643.aspx</a>
<br />un grand m
erci &agrave; son auteur.
<br /><a name='source-exemple'></a><h2> Source / Exem
ple : </h2>

<br /><pre class='code' data-mode='basic'>
&lt;?php

##########
#############################################
#           SCRIPT DE CONVERSION 
DE BDD               #
#               INTERBASE -&gt; MYSQL                   
 #
#                                                     #
# original:       l
e 08/11/2007 par Silk              #
#               (trooper@libertysurf.fr)  
            # 
# adaptation      le 25/05/2011 par F CASTEL          #
#######
################################################
//source: <a href='http://www.
phpcs.com/codes/CONVERTISSEUR-INTERBASE-MYSQL_44643.aspx' target='_blank'>http:/
/www.phpcs.com/codes/CONVERTISSEUR-INTERBASE-MYSQL_44643.aspx</a>

#script
/*


<ul> <li> Fonction: Copier une base Firebird (existante) dans une base MySQL

</li> <li>           Copie des tables (sauf system) et des donnes
</li> <li>
           Crer la base MySQL ou craser celle existante</li></ul>
 *

<ul> 
<li> Config des Tests:
</li> <li>  - WampServer 2.0 (extension php_interbase : 
actif)
</li> <li>  - Windows 7
</li> <li>  - Firebird Server 2.5
</li> <li>  
- PHP 5.2
</li> <li>  - FireFox 4</li></ul>
 *

<ul> <li> pas de gestion des
 clefs des tables!!!!! TODO
</li> <li> gestion propre des erreurs : TODO
</li>
 <li>/</li></ul>

//chrono
$temps_debut = microtime(true);

//plus de limit
e de temps
set_time_limit(0); //pas tres classe mais sinon sa bloque si &gt; 30
sec
echo '&lt;div class=&quot;Titre&quot;&gt;&lt;h1&gt;' . 'Firebird vers MySQL
' . '&lt;/h1&gt;&lt;/div&gt;';

//CREER base MySQL
if ($_POST['MySQLNew'] == 
'new') {
	echo &quot;&lt;h2&gt;&quot; . 'Cration de la base MySQL' . &quot;&lt
;/h2&gt;&quot;;
	$pdo = new PDO('mysql:host=localhost', 'root', '', array(PDO::
ATTR_ERRMODE =&gt; PDO::ERRMODE_EXCEPTION));
	$requete = 'CREATE DATABASE ' . $
_POST['MySQLDBName'] . ' DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci'
;
	echo &quot;&lt;p&gt;&quot; . $requete . &quot;&lt;/p&gt;&quot;;
	$pdo-&gt;p
repare($requete)-&gt;execute();

}

echo &quot;&lt;h2&gt;&quot; . 'Les Bases
 de donnes' . &quot;&lt;/h2&gt;&quot;;

//PARAMETRES INTERBASE
$utilisateur_
interbase = $_POST['FirebirdUser'];
$passe_interbase = $_POST['FirebirdPassword
'];
$dsn_interbase = &quot;firebird:dbname=&quot; . $_POST['FirebirdHost'] . &q
uot;:&quot; . str_ireplace('\\', '\\\\', $_POST['FirebirdDBName']); //il faut do
ubler les \
$bdd_interbase = new PDO($dsn_interbase, $utilisateur_interbase, $p
asse_interbase);
//$bdd_interbase-&gt;exec(&quot;SET CHARACTER SET ISO8859_1&qu
ot;);
echo &quot;&lt;h3&gt;&quot; . 'Firebird' . &quot;&lt;/h3&gt;&quot;;
echo
 &quot;&lt;p&gt;&quot; . $dsn_interbase . &quot;&lt;/p&gt;&quot;;

//PARAMETRE
S MYSQL
$utilisateur_mysql = $_POST['MySQLUser'];
$passe_mysql = $_POST['MySQL
Password'];
$dsn_mysql = 'mysql:host=' . $_POST['MySQLHost'] . ';dbname=' .  $_
POST['MySQLDBName'];
$bdd_mysql = new PDO($dsn_mysql, $utilisateur_mysql,$passe
_mysql);
//$bdd_mysql-&gt;exec(&quot;SET CHARACTER SET latin1&quot;);
echo &qu
ot;&lt;h3&gt;&quot; . 'MySQL' . &quot;&lt;/h3&gt;&quot;;
echo &quot;&lt;p&gt;&q
uot; . $dsn_mysql . &quot;&lt;/p&gt;&quot;;

//RAZ base MySQL
if ($_POST['MyS
QLNew'] == 'erase') {
	echo &quot;&lt;h2&gt;&quot; . 'Supprimer toutes les tabl
es MySQL' . &quot;&lt;/h2&gt;&quot;;
	//	lister les tables
	$requete = 'SHOW T
ABLES FROM test1';
	$statement = $bdd_mysql-&gt;prepare($requete, array(PDO::AT
TR_CURSOR, PDO::CURSOR_FWDONLY));
	$statement-&gt;execute();
	$tables = $state
ment-&gt;fetchAll(PDO::FETCH_ASSOC );
	echo &quot;&lt;p&gt;&quot; . count($tabl
es) . ' Tables  traiter' . &quot;&lt;/p&gt;&quot;;

	//	virer chaque table
	
echo '&lt;p&gt;';
	foreach($tables as $table){
		$requete = 'DROP TABLE ' . $t
able['Tables_in_test1'];
		echo $requete . '&lt;br /&gt;';
		$bdd_mysql-&gt;ex
ec($requete);
	}
	echo '&lt;/p&gt;';
}

//LISTE TABLES FIREBIRD

//liste 
les tables de la BDD
$requete = 'SELECT DISTINCT rdb$relation_name FROM rdb$rel
ation_fields
WHERE rdb$view_context IS NULL
  AND rdb$system_flag = 0'; //Inje
ction de la requte permettant de rcuprer les tables
$statement = $bdd_interb
ase-&gt;prepare($requete, array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY));
$state
ment-&gt;execute();
$tables = $statement-&gt;fetchAll(PDO::FETCH_ASSOC );

//
traiter chaque table
echo &quot;&lt;h2&gt;&quot; . 'Creation des tables FIREBIR
D dans la base MySQL' . &quot;&lt;/h2&gt;&quot;;
echo &quot;&lt;p&gt;&quot; . c
ount($tables) . ' Tables  traiter' . &quot;&lt;/p&gt;&quot;;
foreach ($tables 
as $table) {
	//traiter une table
	echo &quot;&lt;h3&gt;&quot; . $table['RDB$R
ELATION_NAME'] . &quot;&lt;/h3&gt;&quot;;

	//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_fi
elds 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-&gt;prepare($requete, array(PDO::ATT
R_CURSOR, PDO::CURSOR_FWDONLY));
	$statement-&gt;execute();
	$res_struc_table 
= $statement-&gt;fetchAll(PDO::FETCH_ASSOC);

	//Construction de la requte de
 cration de la table dans MySQL
	$req_create_table = &quot;CREATE TABLE `&quot
;.trim($table['RDB$RELATION_NAME']).&quot;` (&quot;;
	$first = true;

	//pour
 chaque champ
	foreach ($res_struc_table as $field) {
		$struct_champ = TypeCh
amp($field['RDB$FIELD_TYPE'] ,$field['RDB$FIELD_LENGTH']);
		//si field 1 pas d
e virgule
		if (!$first) {
			$req_create_table .= &quot; , &quot;;
		}
		$f
irst = false; //c'est plus le 1er champ

		$req_create_table .= &quot;`&quot;.
trim($field['RDB$FIELD_NAME']).&quot;` &quot;.$struct_champ[0];
		if ($struct_c
hamp[1]) {
			$req_create_table .= &quot;(&quot;.$struct_champ[1].&quot;)&quot;
;
		}
		if ($field['RDB$NULL_FLAG'] == 0) {
			$req_create_table .= &quot; NU
LL&quot;;
		} else {
			$req_create_table .= &quot; NOT NULL&quot;;
		}
	}

	$req_create_table .=  &quot;) ENGINE = MyISAM&quot;; //clore instruction
	echo
 '&lt;p&gt;';
	print_r($req_create_table);
	echo '&lt;/p&gt;';

	//crer la 
table dans MySQL
	$bdd_mysql-&gt;exec($req_create_table);

}

//importer le
s donnes
if (isset($_POST['Import'])) {
	echo &quot;&lt;h2&gt;&quot; . 'Impor
t des donnes FIREBIRD dans la base MySQL' . &quot;&lt;/h2&gt;&quot;;
	foreach 
($tables as $table) {
		echo &quot;&lt;h3&gt;&quot; . $table['RDB$RELATION_NAME
'] . &quot;&lt;/h3&gt;&quot;;
		//selections des donnes firebird
		$requete =
 'SELECT * FROM ' . $table['RDB$RELATION_NAME'];
		$statement = $bdd_interbase-
&gt;prepare($requete, array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY));
		$stateme
nt-&gt;execute();
		$data = $statement-&gt;fetchAll(PDO::FETCH_ASSOC );
		echo
 '&lt;p&gt;' . count($data) . ' entres' . '&lt;/p&gt;';

		//Construction de 
la requte d'insertion des donnes
		foreach ($data as $row) { //chaque ligne d
e table
			$req_insert = &quot;INSERT INTO `&quot; . trim($table['RDB$RELATION_
NAME']) . &quot;` SET &quot;;
			$first = true;
			$key = key($row);
			$val 
= current($row);
			reset($row);
			while(list ($key, $val) = each ($row))	//c
haque champ
			{
				if (!$first) {
					$req_insert .= &quot; , &quot;;
			
	}
				$first = false;//c'est plus le 1er champ
				//Correction des valeurs t
exte
				$val = str_replace(&quot;'&quot;,&quot;\'&quot;,$val);
				//$val = u
tf8_decode($val);
				$req_insert .= &quot;`&quot; . $key . &quot;`='&quot; . a
ddslashes($val) . &quot;'&quot;;
			}
			//insert LA ligne dans MySQL
			$bdd
_mysql-&gt;exec($req_insert);
		}
	}

}

//FIN
echo '&lt;h1&gt;' . 'Scrip
t execut !' . '&lt;/h1&gt;';
$temps_fin = microtime(true);
echo '&lt;p&gt;&lt
;strong&gt;' . 'Temps d\'execution : '.round($temps_fin - $temps_debut, 0) . ' s
econdes' . '&lt;/strong&gt;&lt;/p&gt;';

?&gt;
&lt;/body&gt;
&lt;/html&gt;


&lt;?php

#FONCTIONS
function TypeChamp ($champ,$taille) {
	switch ($champ
) {
		case 7:
			return array('SMALLINT',$taille);
			break;
		case 8:
			r
eturn array('INT',$taille);
			break;
		case 16:
			return array('BIGINT',$ta
ille);
			break;
		case 10:
			return array('FLOAT','');
			break;
		case 1
1:
			//return 'D_Float';
			return 'erreur';
			break;
		case 27:
			retur
n array('DOUBLE','');
			break;
		case 9:
			//return 'Quad';
			return 'err
eur';
			break;
		case 14:
			return array('CHAR',$taille);
			break;
		cas
e 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

?&gt;
</pre>
