Aide - Recherche - Membres - Calendrier
Version complète : create table et boucle for probleme de... melange
Forum Développeur - Administration serveur, programmation et base de données > Programmation > PHP
fongus
bonjour,

voila les jeunes, je cherche à faire quelque chose de pas simple.
dans mons probleme je souhaite crée des tables sql de facon dynamique.
en gros
j'ai un tableau qui prend le nom de mes tables
il s'appelle $table[$i] $i etant la boucle qui permet de traverser mes données de mon tableau

j'ai un autre tableau qui récupère toute mes donnée pour mes tables.
$champ[$g] $g etant la boucle qui permet de traverser mes données de mon tableau.

les variables $temp_table et $temp_cx indique la fin de mes tableaux.

voila mon code qui parcour mes données dans mes tables. je souhaite insérer un create table avec une boucle for pour inserer mes données
est ce que c possible ????


CODE


for($i=0;$i<=$temp_table;$i++){

mysql_query("CREATE TABLE  $table[$i]("

 for($g=0;$g<=$temp_cx;$g++){

 

  "$champ[$g] varchar(50) NOT NULL)"



 }

 "TYPE=MyISAM;");  

}




j'aimerai faire en gros un truc dans ce genre la et je voulais savoir si s'était possible ou pas du tout????

merci de votre d'avance.
Ldo
oui ca doit etre possible mais pas comme ca
faut d'abord créer la table correctement
en définissant les champs et leur type...
ensuite seulement tu pourra remplir


par contre ton truc ca fait peur

kel genre d'application peut demander de créer des tables avec des boucle :shock:
la boucle est grande ? tu compte créer combien de table comme ca ?
qwix
+1 pour ldo

smile.gif
Thanh
QUOTE


kel genre d'application peut demander de créer des tables avec des boucle


Mon collègue fait ça pour une application de suivi de cas clinique. Je trouve ça aussi :shock: Mais ça marche ^^
fongus
re

en fait je dois lire un fichier xml
et à partir de ce fichier je dois crée un base de donnée donc je ne sais jamais combien je vais avoir de données ni de table, d'ou les boucle et les tableau
en fait quix on c mis a simplexml.
fongus
QUOTE
Mon collègue fait ça pour une application de suivi de cas clinique. Je trouve ça aussi icon_eek.gif Mais ça marche ^^


tu aurai pas l'exemple de comment il a fait que je vois comment ca marche.
qwix
Heu question bête.
Apparement tu souhaites pouvoir créer plein de tables à la volée je trouve ça bizarre mais si tu en a l'utilité, pourquoi pas wink.gif
Tu veux passer par XML, mais pourquoi tu ne fait pas simple un fichier csv et les données. Puisque de toute façon le but final, c'est de générer une requête, les données que tu as dans le XML proviennent bien d'un export au départ non ? Alors pourquoi ne pas tout simplement exporter le truc en Csv et toi après tu le réimporte ou tu as envie, en générant le requête, ça ira beaucoup plus vite qu'en passant par XML. A moins que tu aie besoin de fichier XML pour faire communiquer plusieurs choses en même temps via un webservice...

Bon, après relecture je me demande si c'est bien compréhensible ce que je dis là :oops:

smile.gif
Thanh
QUOTE
QUOTE
Mon collègue fait ça pour une application de suivi de cas clinique. Je trouve ça aussi icon_eek.gif Mais ça marche ^^


tu aurai pas l'exemple de comment il a fait que je vois comment ca marche.


Ce ne sera pas possible. Désolé(c'est un produit appartenant au taf). Mais je peux t'assurer qu'il est inutile de lire ce genre de script ^^ (y en qui ont essayé!!!)
fongus
QUOTE
Bon, après relecture je me demande si c'est bien compréhensible ce que je dis là


eeuuuuHHHH....non pas vraimment

en fait voici mon projet

on me donne un fichier XML (dedans il y a toutes les informations necessaire pour construire une base de donnée, table, donnée champ...)

moi ensuite avec mon programme php que je fais, je parse mon fichier xml,
récolte toutes les informations et crée une base de donnée sql à partir des donnée xml.

j'arrive à récupérer les tables pour l'instant dans un tableau.
je récupere aussi les noms de mes champs. et maintenant je voudrai juste tester avec l'exemple que je vous ai donnée plus haut.
la création des tables marches.
je cherche maintenant à insérer les champs apres (c pour plus tard) les données.
Ldo
et comment tu gère les différent type de champ leur valeurs, auto-incrment .... ?

tout est dans ton format xml ?
t'as un exemple a montrer ?
fongus
oui oui
voici un exemple

mais j'en suis pas encore a gérer les type de champs pour l'instant je veux juste que mes champs se mette bien dans ma table pour les type comme je le disais on verra apres.

voila une partie de mon fichier xml en tout il compte 9 tables et une tripoté de champs
mon fichier s'appelle dataxml2
CODE


<?xml version="1.0" encoding="iso-8859-1"?>



<TABLES>

 <TABLE Nom="TModPaie" Typ="TableRef">

  <CX Nom="Code" type="T" Largeur="3"/>

  <CX Nom="ModPaie" type="T"/>

  <DATA>

   <z:row Code="CH" ModPaie="Chèque Bancaire"/>

   <z:row Code="VIR" ModPaie="Virement"/>

   <z:row Code="" ModPaie="(Autre)"/>

  </DATA>

 </TABLE>

 <TABLE Nom="TFonction" Typ="TableRef">

  <CX Nom="Code" type="T" Largeur="5"/>

  <CX Nom="Fonction" type="T" Largeur="25"/>

  <DATA>

   <z:row Code="AUT"   Fonction="(Autre)"/>

   <z:row Code="ACH"   Fonction="Achats"/>

   <z:row Code="ADMIN" Fonction="Administration"/>

   <z:row Code="COM"   Fonction="Marketing-Communication"/>

   <z:row Code="DIR"   Fonction="Direction"/>

   <z:row Code="FIN"   Fonction="Finances"/>

   <z:row Code="PROD"  Fonction="Production"/>

   <z:row Code="QSE"   Fonction="QSE"/>

   <z:row Code="RH"    Fonction="Ressources Humaines"/>

  </DATA>

 </TABLE>

</TABLES>




j'utilise simple xml pour parser le fichier et récupérer les table et les données voici le code php

attention c un peu long mais bon si tu veux comprendre c mieux
CODE


<?php

//connexion à la base deonnée qui va etre crée par la suite

require ("config.inc.php");

$db = mysql_connect($dbserver,$nom,$password)or die("Impossible de se connecter : " . mysql_error());

$result = mysql_select_db($dbname,$db);



if (file_exists('data2.xml')) {

$xml = simplexml_load_file('data2.xml');

echo "<pre>";

$i=0;



//print_r($xml);

//creation des table dans un tableau

foreach($xml->children() as $tabl) {

    //echo "table : ".$tabl['Nom'];

 $table[$i]= $tabl['Nom'];

 $i++;

 //echo"<br>";

 $temp_table=$i;

}



//association des tables dans un champs

for($i=0;$i<$temp_table;$i++){

echo "table : ".$table[$i];

echo"<br>";

$j=0;

 foreach($xml->TABLE[$i]->children() as $cx) {

  //echo "champ : ".$cx['Nom'];

  $champ[$j]=$cx['Nom'];

  echo "champ : ".$champ[$j];

  $j++;

  echo"<br>";

  $temp_cx=$j;

 }

}

$temp_cx--;





      //creation des tables de facon dynamique(qui marche pas)

echo "</pre>";

for($i=0;$i<=$temp_table;$i++){

/*echo "i1 : ".$i;

echo"<br>";

echo "table : ".$table[$i];

echo"<br>";*/

mysql_query("CREATE TABLE  $table[$i]("

 for($g=0;$g<=$temp_cx;$g++){

  /*echo "g1 : ".$g;

  echo"<br>";

  echo"champ : ". $champ[$g];

  echo"<br>";*/

 

       "$champ[$g] varchar(50) NOT NULL)"



 }

 "TYPE=MyISAM;");  

}

}

else {

exit("Failed to open story.xml.");

}



?>
Ldo
QUOTE
mais j'en suis pas encore a gérer les type de champs pour l'instant je veux juste que mes champs se mette bien dans ma table pour les type comme je le disais on verra apres.


comment tu peut dire ca :shock:
il faut d'abord commencer par créer la table correctement avant de vouloir y inserer quoi que ce soir

la toute première chose a faire, c'est justement recupérer les types des champ pour pouvoir générer la requette qui va construire la table

en gros, il te faut en premier :
CODE
CREATE TABLE `table` (

 `id` int(10) unsigned NOT NULL auto_increment,

 `id_article` int(10) unsigned NOT NULL default '0',

 `id_comment` int(10) unsigned NOT NULL default '0',

 `propriete` varchar(20) NOT NULL default '',

 `valeur` varchar(100) NOT NULL default '',

 PRIMARY KEY  (`id`)

) TYPE=MyISAM


et seulement une fois que cette requette aura étée faite, tu pourra commencé a inserer dedans

ou alors on a pas le même vocabulaire, pour moi un type MySql c'est INT CHAR VARCHAR....
Ldo
our t'aider au niveau du xml pour les type, regarde dans phpmyadmin tu aura un aprecu de tous les attribut xml a utiliser

tu aurais un xml qui ressemble a ça :
CODE
<TABLE Nom="TModPaie">

  <CX Nom="id" type="INT" Attributs="UNSIGNED" Extra="auto_increment Key="primary" "/>

  <CX Nom="ModPaie" type="SMALLINT" Default="0" />

  <DATA>...</DATA>

</TABLE>
fongus
le probleme est que ce que je t'ai montré dans le fichier xml est juste un exemple.

je ne peux pas modifier le xml.
la facon dont le xml est fait sera toujours comme ca.
mon programme est un générateur de base de donnée à partir d'un fichier XML
je ne travail que sur la récupération des données.

bref
comme je le disais tout a l'heure mon but
est de pouvoir inserer des champs dans ma table
ce que j'appelle champs c les truc du type ID, num article, libelle_article...
les types sont = int varchar....
data= les données.
pour l'instant inserer leur type n'est pas important.
puisque la methode sera la meme que pour les champs. si j'arrive à inserer des champs j'arriverai tout aussi facilement a inserer mes types
les types seront une valeur dans un tableau. qui sera inserer de la meme facon que mes champs

c pour ca que je cherche a faire une boucle for dans un create table.
j'en suis pour l'instant en phase de test. je veux faire par etapes

c'est pour quoi je demandais comment mettre une boucle for dans un create table.
si cela est possible. comment faire ???? ou du moins si vous avez un endroit ou je puisse trouver un exemple ca maiderai beaucoup.
Ldo
ok, j'avais pas tilter dans l'exemple2 le code, que tu foutais des varchar partout

ben non ca ne pose pas de pbm, tu peut mettre tes boucles for autant que tu veut ou tu veut
puisque pour le moment tu ne fait que "construire" la requette sql
ca n'est que de l'assemblage de chaine de caractère

tu fait ce que tu veut

il est ou le pbm ?
Ldo
AH OKAYYYYYYYYYYYYYYY

non tu ne peut pas mettre une bloucle à l'interieur d'un mysql_query
elle vient de la ton erreur

il faut que tu construise entièrement ta requetes (qui n'est autre qu'une chaine)
et seulement a la fin tu envoi a mysql_query

biggrin.gif

je te ferais le code vite fait pour te montrer wink.gif
fongus
tu aurais pas exemple de comment on fait ???
parceque je patoge un peu.

à partir de l'exemple que j'ai donnée au début.
Ldo
essaye un peu ça :
QUOTE
<?php   ); [/color]());   [/color]); if ([/color])) {     [/color]);     foreach([/color]) {         [/color];         foreach([/color]) {             [/color];         }         [/color];     }     [/color]//maintenant que toutes les requetes ont été créee, on balance la purée     [/color]) {         [/color]);     } } else {     exit([/color]); } [/color]
par contre je peut pas tester vu que je suis au taff sad.gif
fongus
merci
je me suis inspiré de ce que tu m'as donnée
ca marche presque.
j'ai repris ce que j'avais fais au début en gros
il m'affiche presque tout, il manque juste le nom de la table et il y a un champ en trop.

CODE


for($i=0;$i<=$temp_table;$i++){

$requete1="CREATE TABLE ".$table[$i]."(";

 for($g=0;$g<=$temp_cx;$g++){

 $requete1.= $champ[$g]." varchar(50) NOT NULL,";

}

 $requete1.=") TYPE=MyISAM;";

   

}

echo"<br>";

echo $requete1;


voila le resulta de $requete1
CREATE TABLE (Code varchar(50) NOT NULL,Fonction varchar(50) NOT NULL, varchar(50) NOT NULL,) TYPE=MyISAM;
merci encore.
Ldo
une dernière question, pourquoi tu passe par toutes ces tables temporaire ?
fongus
yop

donc en fait j'ai virer les deux dernier for et je travail dans la deuxième double boucle.

au départ j'avait une troisieme double boucle pour etre sur de pas faire d'erreur.

bref
dans le code tu m'as filé ya un truc qui fait bugguer ma requete c au niveau du
$champ[$j]." varchar(50) NOT NULL,";

la virgule apparait à la fin de ma requete et ca fait planté ma requète.
m'enfin je trouverai bien.
Ldo
ouaip
en fait la dernière virgule ne serait pas génante si tu avait un index
tu rajouterais simplement avant le ") TYPE=MyISAM" un "PRIMARY KEY  (id)"

mais bon, t'as réussi a avancer c'est le principal
bon courage pour la suite wink.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2009 Invision Power Services, Inc.