Générateur de Base de Données





Le but de ce TP est de créer en PHP un générateur de script MySQL afin de créer les tables d'une base de données. On utilise un fichier au format XML qui contient la définition de la base de données comme suit :

  1. <database name="ccp">
  2.     <table name="client">
  3.         <field name="cl_id" type="int" primary_key="yes" />
  4.         <field name="cl_prenom" type="varchar" size="25" />
  5.         <field name="cl_nom" type="varchar" size="25" index="yes" />
  6.         <field name="cl_adresse" type="varchar" size="45" />
  7.         <field name="cl_email" type="varchar" size="45" />
  8.         <field name="cl_mot_de_passe" type="varchar" size="32" />
  9.     </table>
  10.    
  11.     <table name="produit">
  12.         <field name="pr_id" type="int" primary_key="yes" />
  13.         <field name="pr_libelle" type="varchar" size="40" index="yes" />
  14.         <field name="pr_prix_unitaire" type="float" />
  15.         <field name="pr_quantite" type="int" />
  16.     </table>
  17.    
  18.     <table name="commande">
  19.         <field name="co_id" type="int" primary_key="yes" />
  20.         <field name="co_date" type="varchar" size="8" index="yes" />
  21.         <field name="co_prix_total" type="float" />
  22.         <field name="co_cl_id" type="int" index="yes" />
  23.     </table>
  24.    
  25.     <table name="commprod">
  26.         <field name="cp_id" type="int" primary_key="yes" />
  27.         <field name="cp_co_id" type="int" />
  28.         <field name="cp_pr_id" type="int" />
  29.         <field name="cp_quantite" type="int" />
  30.     </table>
  31.    
  32.    
  33. </database>
  34.  

On veut parvenir à un fichier d'export XML sous la forme suivante :

  1. <!--
  2. - phpMyAdmin XML Dump
  3. - version 5.2.0
  4. - https://www.phpmyadmin.net
  5. -
  6. - Hôte : database:3306
  7. - Généré le : mer. 06 déc. 2023 à 03:44
  8. - Version du serveur : 8.0.31
  9. - Version de PHP : 8.0.27
  10. -->
  11. <pma_xml_export xmlns:pma="https://www.phpmyadmin.net/some_doc_url/" version="1.0">
  12. <!--
  13.    - Structure schemas
  14.     -->
  15. <pma:structure_schemas>
  16. <pma:database name="ccp" collation="utf8mb4_0900_ai_ci" charset="utf8mb4">
  17. <pma:table name="client"> CREATE TABLE `client` ( `cl_id` int NOT NULL AUTO_INCREMENT, `cl_nom` varchar(25) NOT NULL, `cl_prenom` varchar(25) NOT NULL, `cl_adresse` varchar(45) NOT NULL, `cl_email` varchar(45) NOT NULL, `cl_mot_de_passe` varchar(32) NOT NULL, PRIMARY KEY (`cl_id`), KEY `cl_nom` (`cl_nom`), KEY `cl_email` (`cl_email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; </pma:table>
  18. <pma:table name="commande"> CREATE TABLE `commande` ( `co_id` int NOT NULL AUTO_INCREMENT, `co_date` varchar(8) NOT NULL, `co_prix_total` float NOT NULL, `co_cl_id` int NOT NULL, PRIMARY KEY (`co_id`), KEY `co_date` (`co_date`), KEY `co_cl_id` (`co_cl_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; </pma:table>
  19. <pma:table name="commprod"> CREATE TABLE `commprod` ( `cp_id` int NOT NULL AUTO_INCREMENT, `cp_co_id` int NOT NULL, `cp_pr_id` int NOT NULL, `cp_quantite` int NOT NULL, PRIMARY KEY (`cp_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; </pma:table>
  20. <pma:table name="produit"> CREATE TABLE `produit` ( `pr_id` int NOT NULL AUTO_INCREMENT, `pr_libelle` varchar(40) NOT NULL, `pr_quantite` int NOT NULL, `pr_prix_unitaire` float NOT NULL, PRIMARY KEY (`pr_id`), KEY `pr_libelle` (`pr_libelle`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; </pma:table>
  21. </pma:database>
  22. </pma:structure_schemas>
  23. <!--
  24.    - Base de données : 'ccp'
  25.     -->
  26. <database name="ccp">
  27. <!--  Table client  -->
  28. <!--  Table commande  -->
  29. <!--  Table commprod  -->
  30. <!--  Table produit  -->
  31. </database>
  32. </pma_xml_export>
  33.  

Afin d'analyser le fichier XML de définition, on fait appel à différentes classes PHP comme DOMDocument et DOMXPath qui permettent respectivement de représenter un document au format XML et de l'analyser :

  1. <?php
  2.  
  3. $doc = new DOMDocument( '1.0', 'utf-8' );
  4. $doc->load("ccp.xml");
  5.  
  6. $xpath = new DOMXpath( $doc );
  7. // get all classes
  8. $xpath_tables = $xpath->query( "//table" );
  9.  
  10. // for each class
  11. foreach( $xpath_tables as $xpath_table ) {
  12.  
  13.     echo $xpath_table->getAttribute( "name" ) . "\n";
  14.  
  15.     $fields = $xpath_table->getElementsByTagName("field");
  16.     foreach( $fields as $field ) {
  17.         echo "field " . $field->getAttribute("name");
  18.         echo " " . $field->getAttribute("primary_key") . "\n";
  19.        
  20.     }
  21. }
  22.  
  23. ?>
  24.  
  25.