begin process at 2012 02 12 18:50:47
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Base de données

 > EXPORTATION IMPORTATION DE BDD RESPECTANT LES RELATIONS ENTRE TABLES

EXPORTATION IMPORTATION DE BDD RESPECTANT LES RELATIONS ENTRE TABLES


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Base de données Classé sous :exportation, relationnel, mysql, importation, bdd Niveau :Initié Date de création :01/03/2007 Vu :6 899

Auteur : pifou25

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note


 Description

Avez vous jamais eu ce problème? il faut exporter des données de plusieurs tables mais tout en respectant l'id auto incrément de chaque table qui est repris dans une autre table... Evidemment il serait si simple de copier/coller les fichiers table, mais impossible si l'on souhaite ajouter des données à la suite en conservant les données déjà existantes!

voici le cas concret:
1 table mat_questionnaire (clé primaire: que_id)
==> liée à la table mat_rubrique (clé primaire: rub_id) par la jointure mat_questionnaire.que_id = mat_rubrique.que_id
   ==> liée à la table mat_question (clé primaire: qes_id) par la jointure mat_rubrique.rub_id = mat_question.rub_id
      ==> liée à la table mat_reponse (clé primaire: rep_id) par la jointure mat_question.qes_id = mat_reponse.qes_id

processus réccursif: exporter 1 ligne de mat_questionnaire; récupérer le LAST_INSERT_ID, insérer les lignes correspondantes dans mat_rubrique pour cet ID, puis les questions pour chaque ID de mat_rubrique, puis les réponses de chaque question... la définition de l'array permet de s'adapter à quasiment tout type de structure, la récursivité de la fonction fait le reste.
Comme il n'est pas forcément possible d'insérer directement dans 1 autre table (qui peut être une autre BDD...) j'ai choisis d'afficher les requetes qu'il faut ensuite copier/coller par exemple dans phpmyadmin. (on aurait pu aussi les exporter dans un ficher). Le script utilise la capacité de mySQL de déclarer des variables.

Source

  • <?php
  • // Information de connexion à la base de données locale
  • $database_local_addr = "localhost";
  • $database_local_name = "";
  • $database_local_user = "root";
  • $database_local_password = "";
  • if (!($link = @mysql_connect($database_local_addr,$database_local_user,$database_local_password))
  • OR (!@mysql_select_db($database_local_name)))
  • die("La base de données est indisponible.");
  • // exporter les données suivant leurs relations
  • $config = array('tbl' => 'mat_questionnaire', 'pk' => 'que_id',
  • 'que_id' => array( 'tbl' => 'mat_rubrique', 'pk' => 'rub_id', 'fk' => 'que_id',
  • 'rub_id' => array( 'tbl' => 'mat_question', 'pk' => 'qes_id', 'fk' => 'rub_id',
  • 'qes_id' => array( 'tbl' => 'mat_reponse', 'pk' => 'rep_id', 'fk' => 'qes_id')
  • ) ) );
  • echo '<pre>';
  • recurseexport( $config, 'que_id=2');
  • echo '</pre>';
  • // fonction récursive selon la définition de l'arg $array
  • // possibilité de filtrer sur la 1ere table définie par l'$array
  • function recurseexport($array, $filter='', $keyvalue= false ) {
  • // récupérer le last_id si besoin
  • if ($keyvalue) {
  • $keyname = '@id_'.$array['tbl'];
  • echo "SET $keyname := LAST_INSERT_ID();\n";
  • }
  • $sql = 'SELECT * FROM '.$array['tbl'];
  • if ($filter) $sql.=' WHERE '.$filter;
  • $result = mysql_query($sql) or die ('ERREUR '.$sql.' '.mysql_error());
  • while ($row = mysql_fetch_assoc($result)) {
  • // exporter la ligne:
  • if ($keyvalue)
  • echo 'INSERT INTO '.$array['tbl'].' '.export ($row, $array['pk'], $array['fk'], $keyname)."\n";
  • else
  • echo 'INSERT INTO '.$array['tbl'].' '.export ($row, $array['pk'])."\n";
  • // si la clé a une relation, exporter les dépendances:
  • if (isset($array[$array['pk']])) {
  • //
  • $tbl = $array[$array['pk']];
  • $fk = $tbl['fk'];
  • recurseexport( $tbl, $fk.'='.$row[$array['pk']], true);
  • }
  • }
  • }
  • // génere un INSERT (champs...) VALUES (valeurs...)
  • function export(&$row, $pkfield, $fkfield='', $fkname='') {
  • $listvalues = '';
  • $listfields = '';
  • foreach ($row as $field => $value) {
  • if ($field <> $pkfield) {
  • $listfields .= ', '.$field;
  • if ($field == $fkfield)
  • $listvalues.=", $fkname";
  • elseif (is_null($value))
  • $listvalues.=', NULL';
  • else
  • $listvalues.=", '".mysql_escape_string($value)."'";
  • }
  • }
  • return '('.substr($listfields, 1).') VALUES ('.substr($listvalues, 1).');';
  • }
<?php

// Information de connexion à la base de données locale
$database_local_addr = "localhost";
$database_local_name = "";
$database_local_user = "root";
$database_local_password = "";

if (!($link = @mysql_connect($database_local_addr,$database_local_user,$database_local_password)) 
	OR (!@mysql_select_db($database_local_name)))
  die("La base de données est indisponible.");


// exporter les données suivant leurs relations
$config = array('tbl' => 'mat_questionnaire', 'pk' => 'que_id', 
	'que_id' => array( 'tbl' => 'mat_rubrique', 'pk' => 'rub_id', 'fk' => 'que_id', 
		'rub_id' => array( 'tbl' => 'mat_question', 'pk' => 'qes_id', 'fk' => 'rub_id', 
			'qes_id' => array( 'tbl' => 'mat_reponse', 'pk' => 'rep_id', 'fk' => 'qes_id')
) ) );

echo '<pre>';
recurseexport( $config, 'que_id=2');
echo '</pre>';


// fonction récursive selon la définition de l'arg $array
// possibilité de filtrer sur la 1ere table définie par l'$array
function recurseexport($array, $filter='', $keyvalue= false ) {
	// récupérer le last_id si besoin
	if ($keyvalue) {
		$keyname = '@id_'.$array['tbl'];
		echo "SET $keyname := LAST_INSERT_ID();\n";
	}
	$sql = 'SELECT * FROM '.$array['tbl'];
	if ($filter) $sql.=' WHERE '.$filter;
	$result = mysql_query($sql) or die ('ERREUR '.$sql.' '.mysql_error());  
	while ($row = mysql_fetch_assoc($result)) {
		// exporter la ligne:
		if ($keyvalue)
			echo 'INSERT INTO '.$array['tbl'].' '.export ($row, $array['pk'], $array['fk'], $keyname)."\n";
		else
			echo 'INSERT INTO '.$array['tbl'].' '.export ($row, $array['pk'])."\n";
		
		// si la clé a une relation, exporter les dépendances:
		if (isset($array[$array['pk']])) {
			// 
			$tbl = $array[$array['pk']];
			$fk = $tbl['fk'];
			recurseexport( $tbl, $fk.'='.$row[$array['pk']], true);
		}
	}
}

// génere un INSERT (champs...) VALUES (valeurs...)
function export(&$row, $pkfield, $fkfield='', $fkname='') {
	$listvalues = '';
	$listfields = '';
	foreach ($row as $field => $value) {
		if ($field <> $pkfield) {
			$listfields .= ', '.$field;
			if ($field == $fkfield)
				$listvalues.=", $fkname";
			elseif (is_null($value))
				$listvalues.=', NULL';
			else
				$listvalues.=", '".mysql_escape_string($value)."'";
		}
	}
	return '('.substr($listfields, 1).') VALUES ('.substr($listvalues, 1).');';
}


 Conclusion

les champs 'pk' (clé primaire) sont supposé être en auto-incrément, leur valeur n'est donc pas exportée puisqu'elle sera récupéree dans une variable mySQL.. Les champs 'fk' sont la relation (clé étrangère) avec le champs 'pk' de la table liée. Pas testé dans le cas de relation d'1 table avec plusieurs ou bien de relations sur plusieurs champs...


 Sources du même auteur

CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT"

 Sources de la même categorie

Source avec Zip RECHERCHE DES DOUBLONS DANS UNE TABLE MYSQL EN SÉLECTIONNANT... par aladec2007
[CRON] INSERT ON DUPLICATE KEY UPDATE par pierreSabatier
Source avec Zip CLASS MYSQL 5/PHP5 AVEC GESTION DES EXCEPTION ET DES REQUÊTE... par devil_may_cry
Source avec Zip Source avec une capture MOTEUR DE RECHERCHE SUR BASE MYSQL FULLTEXT ET BOOLEAN AVEC ... par cod57
SYSTÈME DE PAGINATION AVEC BDD ET IMAGES (FICHIERS) par begueradj

 Sources en rapport avec celle ci

SYSTÈME DE PAGINATION AVEC BDD ET IMAGES (FICHIERS) par begueradj
Source avec Zip PHP5 CLASSE GÉNÉRIQUE GESTION ROUTINES MYSQL par oxxo
ENVOI MAIL AVEC TABLEAU RÉCAPILTULATIF DES OPTIMISATIONS FAI... par Epoc22
Source avec Zip EXPORTATION DE BASES ORACLE par bmwalido
Source avec Zip CLASSE BASE DE DONNEES , EX AVEC MYSQL & MSSQL [PHP5 & PHP4] par malalam

Commentaires et avis

Commentaire de JJDai le 03/03/2007 14:14:17

Bonjur
Je vais bientôt avoir le cas, je vais en profiter pour tester ça.

Commentaire de mitch73 le 12/04/2009 18:37:54 9/10

Bonjour

Je trouve bien ton code mais cela n'a pas résolu mon problème
voila
j'ai une base Mysql de ce type :
base TOTO
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(63) NOT NULL,
  `pass` varchar(8) NOT NULL,
  `mail` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `ID_2` (`id`)
);

et je voudrai créer  un fichier php
sous ce format (a partir des information de la base)
<? /* ***** PASSWORDS ***** */
$passwords = array (
  "name" => "pass",
  "name2" => "pass2",
);
/* ***** MAIL-ADDRESSES ***** */
$mail_addresses = array (
  "name" => "mail@nowhere.org",
  "name2" => "someone@world.net"
); ?>

Merci

Commentaire de pifou25 le 14/04/2009 22:20:24

Mitch > en effet ton problème n'a aucun rapport avec ce code. pour toi il suffit de faire un SELECT sur ta table, puis une boucle sur le résultat et écrire tes fichiers je suppose.

Commentaire de mitch73 le 14/04/2009 22:39:37

Merci de ta réponse Pifou

J'ai effectivement trouvé un code qui répond presque (haaaarg) à mon problème
le voici
<?php

$db_name = "toto";
$link = mysql_connect("localhost", "root", "") or die("Connexion impossible.");
$table_name = 'users';
$db = mysql_select_db($db_name, $link);
$query = "select * from " . $table_name;
$result = mysql_query($query) or die("Impossible d'interroger la base de données");
$num = mysql_num_rows($result);

if ($num != 0) { $file= fopen("account.php", "w");
while ($row = mysql_fetch_array($result))
$_xml ="<?\$password = array (\"" . $row['name'] . "\" => \"" . $row['pass'] . "\");?>\r\n";
//while ($row = mysql_fetch_array($result))
fwrite($file, $_xml);
fclose($file); echo "Le fichier est créé <a href=\"account.php\">Show source :).</a>"; }
else { echo "erreur"; }
?>

en fait avec while soit ça incrémente des valeur vide
soit j'ai la bonne valeur mais la dernière de la base (non incrémenté)

qu'est ce qui manque ??? je bloque :(

Commentaire de pifou25 le 14/04/2009 23:16:53

normal, dans ta boucle la variable $_xml est écrasée à chaque nouvelle valeur de la base ( = enregistrement = ligne de ta table). utilise .= au lieu de =  :
$_xml .= "blabla";

sinon, ici c'est les commentaires pour mon code :p les demandes d'aide pour un pb qu'a rien à voir, c'est sur les forums du site :D pour la peine tu peux au moins me mettre une bonne note ;)

Commentaire de mitch73 le 15/04/2009 06:07:56

Merci pour ton aide :D

je vais tester ça

je t'ai déjà mis une bonne note pour ton code ;)
c'est la moindre des  choses

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Importation BDD MySQL [ par Thienou ] Bonjour à tous,J'aimerais savoir comment importer une base de donnée enregistrée en .sql par un script php (donc pas de phpMyAdmin)Je n'ai pas trouvé Php Mysql [ par Bumcello ] Bonjour,J'ai déclaré dans ma master page " &lt;? require_once ('Commun\Connexion_base.php'); ?&gt; "Dans le " Connexion_base.php " il y a une fonction Problème affichage sur plusieurs colonnes [ par R3dDragon ] &lt;?php// connexion à la bdd$bdd = mysql_connect($sql_serveur, $sql_login, $sql_pass);  // selection de la table mysql_select_db($sql_bdd,$bdd);// re teste dans textarea [ par michmichman ] Voila je cherche a mettre des donn&#233;es recup&#233;r&#233;es de ma bdd dans un textarea voila le code:&lt;form name="form1" method="post" action="" BDD a caractere bizar ... [ par Teclis01 ] Bonjour,Voilà ma bdd contient ce genre de caractere: é pour éê pour êet je voulais savoir si il y avait un moyen de transformer tout le contenu de m base de donnee securisee ? [ par JoebarGlut ] Bonjour, je voulais stocker le mot de passe et le login de la bdd dans mon code source flash mais on m'as dis qu'il etait simple de decompiler un fich chercher un element ds une bdd MYSQL [ par tscmsi1982 ] salut à tous est ce que quelqu'un peut m'aider à realiser un script en PHP qui pemet de chercher un element ds une bdd  MySQL et comment mettre une image dans une bdd mysql ? [ par nicomilville ] salut comment faire pour mettre une image dans une bdd ?Merci insert into BDD d'un textarea [ par theboubourse ] bonjour je voudrais inseré dans ma BDD les donner qui se trouve dans mon textarea mais voila seul les donner des autres champs entre dans ma BDD (ce s IProbleme insertion dans BDD [ par Gregitou ] Bonjour,voilà j'ai un code qui permet de récupérer des infos d'un formulaire, puis de les insérer dans ma BDD.Ce code, a marché la premiere fois, et m


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,998 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales