CONVERTISSEUR INTERBASE -> MYSQL

cs_gohan971 Messages postés 2 Date d'inscription mardi 11 janvier 2005 Statut Membre Dernière intervention 15 novembre 2007 - 15 nov. 2007 à 21:28
cs_gerald57 Messages postés 6 Date d'inscription mercredi 16 janvier 2008 Statut Membre Dernière intervention 21 mai 2008 - 21 mai 2008 à 14:57
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/44643-convertisseur-interbase-mysql

cs_gerald57 Messages postés 6 Date d'inscription mercredi 16 janvier 2008 Statut Membre Dernière intervention 21 mai 2008
21 mai 2008 à 14:57
Purée par contre chez moi a partir de la 72 eme tables il me remet:
string(22) "RDB$CHARACTER_SET_NAME" string(15) "RDB$FORM_OF_USE" Insertion impossible : Unknown column 'IDTYPEPOUDRE' in 'field list'
Requete : INSERT INTO `TYPEPOUDRE` SET `IDTYPEPOUDRE`='1' , `LIBELLETYPEPOUDRE`='Coussinet'


C PAS ENCOR FINI AHAHAHAH
Lomendil Messages postés 17 Date d'inscription samedi 23 août 2003 Statut Membre Dernière intervention 21 mai 2008
21 mai 2008 à 14:10
Super :)

et merci pour ceux que ?a pourrait interesser. (je laisse tomber les accents, apparemment j'ai pas de succes avec eux :p)
cs_gerald57 Messages postés 6 Date d'inscription mercredi 16 janvier 2008 Statut Membre Dernière intervention 21 mai 2008
21 mai 2008 à 08:27
Voici le code retouché, j ai juste adapté la connexion pour une connexion ODBC et j'ai utilisé COLUMN NAME pour réccuperer le nom des colonnes.

<?php
#######################################################
# SCRIPT DE CONVERSION DE BDD #
# INTERBASE -> MYSQL #
# le 19/05/2008 par Gérald GAIGA #

#######################################################
#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
#PARAMETRES
//C'est ici que vous devez entrer les paramètres de connexions aux BDD InterBase et MySQL
//Assurez-vous d'avoir un serveur InterBase (ex: Firebird) et MySQL (ex: EasyPHP, WAMP) en activité.
//PARAMETRES INTERBASE

$hote = 'SIC'; //nom du dsn
$utilisateur = 'SYSDBA'; //User par défaut
$passe ='syscreas'; //Pass par défaut
$bdd_interbase = odbc_connect($hote, $utilisateur, $passe, 'IscDbc'); //Connexion
//PARAMETRES MYSQL
$hote_mysql = 'localhost';
$utilisateur_mysql = 'admin';
$passe_mysql = '123456';
$nom_mysql = 'test'; //Nom de la BDD MySQL
$bdd_mysql = mysql_connect($hote_mysql,$utilisateur_mysql,$passe_mysql);
mysql_select_db($nom_mysql,$bdd_mysql);
#FIN PARAMETRES
//ON PARCOURT LA BDD INTERBASE
$requete = 'SELECT DISTINCT rdb$relation_name FROM rdb$relation_fields
WHERE rdb$view_context IS NULL
AND rdb$system_flag = 0 and rdb$relation_name <> \'RECEPTIONCOLIS\' and rdb$relation_name <> \'REUNION\'and rdb$relation_name <> \'SOCIETE\'and rdb$relation_name <> \'STATUT_ACTEUR\'and rdb$relation_name <> \'STOCKAGE\'and rdb$relation_name <> \'SUITHABILITATION\'and rdb$relation_name <> \'TASKS\''; //Injection de la requête permettant de récupérer les tables
$resultat = odbc_do($bdd_interbase, $requete);
//Récupérer le noms des champs
//Initialisation
$k=0;
//Connection
$result = odbc_columns($bdd_interbase, $hote, "", "%");

//Récupération du nom des colonnes
while (odbc_fetch_row($result)) {
$tablechamp[$k]= odbc_result($result,"COLUMN_NAME");
$k++;

}





//Boucle
$i=0;
while ($ligne = odbc_fetch_array($resultat)) {

foreach ($ligne AS $table) {
echo "
".$table."
";
$req_struc_table = 'SELECT *
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.'\'
ORDER BY rel_field.rdb$field_position, rel_field.rdb$field_name';
$res_struc_table = odbc_do($bdd_interbase,$req_struc_table);
//initialisation

//Construction de la requête de création de la table




$req_create_table = "CREATE TABLE `".trim($table)."` (";

while ($tab_struc_table = odbc_fetch_array($res_struc_table) ) {
$struct_champ = TypeChamp($tab_struc_table['RDB$FIELD_TYPE'],$tab_struc_table['RDB$FIELD_LENGTH']);
if ($prem) {
$req_create_table .= " , ";
} else { $prem = 1; }
echo($tablechamp[$i]);
$req_create_table .= "`".trim($tablechamp[$i])."` ".$struct_champ[0];
if ($struct_champ[1]) {
$req_create_table .= "(".$struct_champ[1].")";
}
if ($tab_struc_table['RDB$NULL_FLAG'] == 0) {
$req_create_table .= " NULL";
} else {
$req_create_table .= " NOT NULL";

}
$i++;
}


$req_create_table .") ENGINE MyISAM";

unset($prem);
mysql_query($req_create_table) or die ("Impossible de créer la table : ".mysql_error()."
Requete : ".$req_create_table);

odbc_free_result($res_struc_table);
$requete2 = 'SELECT * FROM '.$table; //On récupère les champs de la table et leurs valeurs
$resultat2 = odbc_do($bdd_interbase, $requete2);
while ($ligne2 = odbc_fetch_array($resultat2)) {
//Construction de la requête d'insertion des données
$req_insert = "INSERT INTO `".trim($table)."` SET ";
foreach ($ligne2 AS $champ => $valeur) {
if ($prem) {
$req_insert .= " , ";
} else { $prem = 1; }
#Correction des valeurs texte
$valeur = str_replace("\'","'",$valeur);
$valeur = utf8_decode($valeur);
$req_insert .= "`".$champ."`='".addslashes($valeur)."'";
}
unset($prem);
mysql_query($req_insert) or die ("Insertion impossible : ".mysql_error()."
Requete : ".$req_insert);

}
odbc_free_result($resultat2);
}
}
odbc_free_result($resultat);
odbc_close($bdd_interbase);
?>
cs_gerald57 Messages postés 6 Date d'inscription mercredi 16 janvier 2008 Statut Membre Dernière intervention 21 mai 2008
20 mai 2008 à 19:24
bonjour,

Je crois bien avoir trouvé le probleme, des demain je poste ma soluce je pense
Lomendil Messages postés 17 Date d'inscription samedi 23 août 2003 Statut Membre Dernière intervention 21 mai 2008
20 mai 2008 à 17:58
Le meilleur conseil que je puisse te donner est de faire des echo un peu partout pour rep?rer ? quel endroit ?a coince vraiment.

Dis moi ensuite si c'est bien un probl?me d'interpr?tation de variable (texte brut au lieu du contenu de la variable), nous pourrons ensuite voir comment solutionner le probl?me.
cs_gerald57 Messages postés 6 Date d'inscription mercredi 16 janvier 2008 Statut Membre Dernière intervention 21 mai 2008
20 mai 2008 à 09:28
salut urbanik,

Merci beaucoup pour cette solution mais je suis obligé de gérer cela avec un script car je suis connecté à interbase par ODBC et en fait à chaque ouverture de ma base mysql mon script doit effacer toute les tables mysql et réimporter les nouvelles depuis interbase.
Il me faut donc impérativement résoudre le probleme du script.
En tout cas merci pour ta réponse
urbanik Messages postés 3 Date d'inscription mardi 19 novembre 2002 Statut Membre Dernière intervention 20 mai 2008
20 mai 2008 à 08:57
Salut, alors moi j'ai trouvé une autre solution, c'est un logiciel qui s'appelle FULLCONVERT (si tu veux contact moi et je te fourni le logiciel)
cs_gerald57 Messages postés 6 Date d'inscription mercredi 16 janvier 2008 Statut Membre Dernière intervention 21 mai 2008
20 mai 2008 à 08:24
bonjour lomendil et merci d'avoir répondu,

J'ai testé avec les accolades mais toujours rien, peux tu essayé de m'aider stp car je débute et ton script est important pour mon stage.
Lomendil Messages postés 17 Date d'inscription samedi 23 août 2003 Statut Membre Dernière intervention 21 mai 2008
19 mai 2008 à 12:14
Ce script m'est un peu sorti de la t?te, mais je pense qu'il faut regarder autour de $tab_struc_table['RDB$FIELD_NAME'].

Peut-?tre que tu peux solutionner le probl?me avec des accolades ({}) pour ?tre s?r que le nom du champ est bien appel? plut?t que ce soit g?r? en texte brut.
cs_gerald57 Messages postés 6 Date d'inscription mercredi 16 janvier 2008 Statut Membre Dernière intervention 21 mai 2008
19 mai 2008 à 10:44
Bonjour,


Lorque j'execute le script, dans le nom des champs il me met RDB$557,RDB$558...
et pourtant ma connexion est bonne.
Lomendil Messages postés 17 Date d'inscription samedi 23 août 2003 Statut Membre Dernière intervention 21 mai 2008
12 févr. 2008 à 20:36
Est-ce que tu as pu vérifier que la connexion à Interbase et MySQL se faisait bien ?

Et sinon, peux-tu en dire plus ?
urbanik Messages postés 3 Date d'inscription mardi 19 novembre 2002 Statut Membre Dernière intervention 20 mai 2008
12 févr. 2008 à 11:26
Ne marche pas !

Lorsqu'il crée la table, il met des RDB$7 au lieu des noms de champs
cs_gohan971 Messages postés 2 Date d'inscription mardi 11 janvier 2005 Statut Membre Dernière intervention 15 novembre 2007
15 nov. 2007 à 21:28
Tres bonne idée!!!
Rejoignez-nous