Transférer le contenu d'une table ACCESS vers MYSQL

Le cas est bien connu : on a une base toute faite sur ACCESS et on ne veut pas tout se retaper à la main sur PhpMyAdmin.

Que faire dans ce cas ?

Eh bien, écrire un programme (de préférence en PHP) qui effectuera tout le travail à votre place.

Les lignes qui suivent vous dévoilent l'alchimie secrète d'un tel programme.

Pour commencer, vous devez avoir PHP installé sur votre machine. Si vous en êtes encore à la version 3, la dll php3_odbc doit être configurée pour se lancer automatiquement. Ce n'est pas le cas par défaut, donc, dans le fichier php3.ini, situé dans le répertoire Windows, après la ligne ;Windows Extensions, enlevez le point virgule devant la ligne ;extension=php3_odbc.dll.

Créez un DSN système via le panneau de configuration > Sources de données ODBC 32 bits. Dans la boîte de dialogue DSN système, sélectionnez votre base et donnez un nom à votre DSN.

Vous devez créer une table dans votre base MySql contenant le même nombre de champs (les noms des champs n'ont pas besoin d'être identiques) dans le même ordre que ceux de la table Access.
Attention aux types de champs : N'essayez-pas d'insérer une chaîne de caractères dans un champ auto-incrémenté, par exemple !

Info : Un bon exercice consisterait à écrire vous-même une fonction pour créer cette table. Si vous n'en avez pas le courage, vous pourrez toujours utiliser celle que je vous fournirai bientôt.

Vous êtes prêts...

Nous allons à présent étudier en détail la fonction loadDataInFile. Cette fonction permet de créer un fichier contenant toutes les données d'une table, chaque champ séparé par un " ;". Ce fichier sera importé par la suite dans MySql grâce à la fonction "import".

5 paramètres sont requis en entrée : le nom du dsn, l'identifiant de connexion, le mot de passe (ces 2 derniers peuvent être une chaîne vide), le nom de la table, le nom du fichier résultat.

<? 
Function loadDataInFile ($dsn, $uid, $pwd, $table, $filename) 
{

Création d'un identifiant de connexion.

$obj_cnx = Odbc_Connect($dsn, $uid, $pwd);

Création de la requête SQL de sélection. Vous devez sélectionner tous les champs.

		$sql_query = "SELECT * FROM nom_table";

Création d'un tableau contenant toutes les données récupérées par le Select.

		# Charger toutes les données de la table dans un tableau
		$ary_data = Odbc_Exec($obj_cnx , $sql_query);

Ouverture du fichier en écriture. S'il n'existe pas, PHP le crée automatiquement.

		$fp = fopen($filename, "w+");

Boucle parcourant toutes les lignes de la table

		while($n = Odbc_Fetch_Into($ary_data, &$fields))
		{

Boucle parcourant tous les champs de la table

			for ($i=0; $i < Odbc_Num_Fields ($ary_data); $i++)
			{

Remplissage du tableau

			$data = $fields[$i];

Echappe les apostrophes pour la requête SQL d'importation dans MYSQL (voir plus bas).

			# Echapper les apostrophes par \'
			$data = ereg_replace("'", "\\'", $data);

Ajoute un point virgule après chaque champ.

			$data.= ";";

Ecrit le contenu du tableau dans le fichier

		# Ecrire dans le fichier…
     		fputs ($fp, $name);
     		}

Ajoute un caractère "fin de ligne(new line : \n)" délimiteur à la fin de chaque enregistrement.

		fputs ($fp, "\n");
     	}

Ferme le pointeur de fichier (nécessaire).

	fclose($fp);

On ferme la connexion et on libère les ressources (toujours).

    Odbc_Close($obj_cnx);
    Odbc_Free_Result($ary_data);
    }

Appel de la fonction

loadDataInFile("test","uid","pwd","nom_table","fichier_resultat");
?>

Requête d'importation (SQL) du fichier de données (format standard CSV) à éxécuter en ligne de commande (mysql > requête) ou par l'intermédiaire d'un script PHP. En SQL, les apostrophes doivent être doublées ou échappées par un anti-slash, l'apostrophe servant de délimiteur de chaîne.

LOAD DATA LOCAL INFILE 'nom_fichier' INTO TABLE nom_table 
FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'

Tout hébergeur digne de ce nom doit vous proposer un outil dans son tableau de bord permettant d'éxécuter des requêtes SQL sur votre base de données (ex : PhpMyAdmin).