PHP ET SimpleXML – TP et solutions php-xml
PHP ET SimpleXML – TP et solutions php-xml
Exercice 1:
Créez un fichier XML nommé iut.xml, dont l’élément racine est <iut>.
Les éléments principaux nommés <etudiant> ont comme attributs id (numéro d’inscription) et nom. Chaque élément <etudiant> peut contenir autant d’éléments <uv> que désiré. Chaque UV doit avoir un nom, une durée et une note enregistrés dans des sous-éléments. Visualisez ce fichier dans un navigateur pour vérifier qu’il est bien formé.
Les éléments principaux nommés <etudiant> ont comme attributs id (numéro d’inscription) et nom. Chaque élément <etudiant> peut contenir autant d’éléments <uv> que désiré. Chaque UV doit avoir un nom, une durée et une note enregistrés dans des sous-éléments. Visualisez ce fichier dans un navigateur pour vérifier qu’il est bien formé.
Solution
Exemple de fichier iut.xml :
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<iut>
<etudiant id="123" nom="Lemaire">
<uv>
<nom>Programmation PHP 5</nom>
<durée>4 semaines</durée>
<note>14</note>
</uv>
<uv>
<nom>MySQL</nom>
<durée>6 semaines</durée>
<note>16</note>
</uv>
</etudiant>
<etudiant id="345" nom="Legros">
<uv>
<nom>Programmation PHP 5</nom>
<durée>4 semaines</durée>
<note>12</note>
</uv>
<uv>
<nom>SQLite</nom>
<durée>6 semaines</durée>
<note>16</note>
</uv>
</etudiant>
<etudiant id="456" nom="Legrand">
<uv>
<nom>Programmation PHP 5</nom>
<durée>5 semaines</durée>
<note>14</note>
</uv>
<uv>
<nom>SQLite</nom>
<durée>3 semaines</durée>
<note>15</note>
</uv>
</etudiant>
<etudiant id="567" nom="Lebeau">
<uv>
<nom>Programmation PHP 5</nom>
<durée>5 semaines</durée>
<note>17</note>
</uv>
<uv>
<nom>MySQL</nom>
<durée>6 semaines</durée>
<note>13</note>
</uv>
</etudiant>
</iut>
Exercice 2:
Lisez les éléments et les attributs du fichier iut.xml, et affichez-les dans un tableau HTML.
Solution
<?php
$xml=simplexml_load_file("iut.xml");
echo "<table border=\"1\" width=\"80%\">";
foreach ($xml->etudiant as $valeur)
{
echo " <tr><th>Nom de l'étudiant : ",$valeur['nom'],"</th>
<th>Identifiant :",$valeur['id'],"</th></tr>";
foreach ($valeur->uv as $valeur)
{
echo "<tr><td> Nom de l'UV : </td><td>",$valeur-
>nom,"</td></tr>";
echo "<tr><td> Durée de l'UV : </td><td>",$valeur-
>duree,"</td></tr>";
echo "<tr><td> Note pour l'UV : </td><td>",$valeur-
>note,"</td></tr>";
echo "<tr colspan=2 ><td></td></tr>";
}
}
echo "</table>";
?>
Résultat obtenu :
Exercice 3:
Créez un formulaire permettant d’insérer des données dans le fichier iut.xml. Le script doit permettre la visualisation éventuelle du fichier après l’insertion.
Solution
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/REC-html40/strict.dtd">
<html>
<head>
<title>Enregistrement en XML</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-
8859-1">
</head>
<body>
<form action= "<? $_SERVER['PHP_SELF'] ?>" method="post"
enctype="application/x-www-form-urlencoded">
<fieldset>
<legend><b>Saisie de données</b></legend>
<table><tbody>
<tr colspan=2><th>Etudiant</th></tr>
<tr>
<td>Identifiant : </td>
<td><input type="text" name="id" /></td>
</tr>
<tr>
<td>Nom de l'étudiant : </td>
<td><input type="text" name="nomet" /></td>
</tr>
<tr colspan=2><th>UV 1</th></tr>
<tr>
<td>Nom de l'UV 1 : </td>
<td><input type="text" name="nomuv1" /></td>
</tr>
<tr>
<td>Durée de l'UV 1 : </td>
<td><input type="text" name="duree1" /></td>
</tr>
<tr>
<td> Note de l'UV 1</td>
<td><input type="text" name="note1" /></td>
</tr>
<tr colspan=2><th>UV 2</th></tr>
<tr>
<td>Nom de l'UV 2 : </td>
<td><input type="text" name="nomuv2" /></td>
</tr>
<tr>
<td>Durée de l'UV 2 : </td>
<td><input type="text" name="duree2" /></td>
</tr>
<tr>
<td> Note de l'UV 2</td>
<td><input type="text" name="note2" /></td>
</tr>
<tr>
<td>
<input type="submit" name="envoi" value="Enregistrer"/>
<a href="ch17exo2.php"><button type="button"> VOIR </button></a>
</td>
</tr>
</tbody></table>
</fieldset>
</form>
</body>
</html>
<?php
//Enregistrement d'un étudiant
if(isset($_POST['envoi'])&& !empty($_POST['id'])&&
!empty($_POST['nomet']))
{
$id= htmlspecialchars($_POST['id']);
$nomet= htmlspecialchars($_POST['nomet']);
$xml=simplexml_load_file("iut.xml");
$chxml = $xml->asxml();
$chxml = str_replace("</iut>", "", $chxml);
$chxml.= "<etudiant id=\"$id\" nom=\"$nomet\">\n";
//Enregistrement de l'UV 1
if(!empty($_POST['nomuv1'])&& !empty($_POST['duree1']) &&
!empty($_POST['note1']))
{
$nomuv1= htmlspecialchars($_POST['nomuv1']);
$duree1= htmlspecialchars($_POST['duree1']);
$note1= htmlspecialchars($_POST['note1']);
$chxml.= "<uv>\n <nom>$nomuv1</nom>\n <duree>$duree1</duree>\n
<note>$note1</note>\n</uv>\n";
}
//Enregistrement de l'UV 2
if(!empty($_POST['nomuv2'])&& !empty($_POST['duree2']) &&
!empty($_POST['note2']))
{
$nomuv2= htmlspecialchars($_POST['nomuv2']);
$duree2= htmlspecialchars($_POST['duree2']);
$note2= htmlspecialchars($_POST['note2']);
$chxml.= "<uv>\n <nom>$nomuv2</nom>\n <duree>$duree2</duree>\n
<note>$note2</note>\n</uv>\n";
}
//Fermeture des éléments <etudiant> et <iut>
$chxml.=" </etudiant>\n</iut>\n";
$verif=file_put_contents("iut.xml",$chxml);
echo $verif;
}
?>
Exercice 4:
Créez un formulaire de recherche permettant d’afficher à la demande les noms des étudiants par ordre alphabétique, ainsi que la liste des UV et leur nom.
Solution
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/REC-html40/strict.dtd">
<html>
<head>
<title>Bibliographie XML</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-
8859-1">
</head>
<body>
<form action= "<? $_SERVER['PHP_SELF'] ?>" method="post"
enctype="application/x-www-form-urlencoded">
<fieldset>
<legend><b>Recherche</b></legend>
<table><tbody>
<tr>
<td>Rechercher tous les : </td>
<td>
<select name="choix">
<option value="/iut/etudiant/@nom">Etudiants</option>
<option value="etudiant/uv/nom">Nom des UV</option>
</select>
</td>
<input type="submit" name="envoi" value="OK"/>
</td>
</tr>
</tbody></table>
</fieldset>
</form>
</body>
</html>
<?php
if(isset($_POST['envoi']))
{
$choix= $_POST['choix'];
$xml=simplexml_load_file("iut.xml");
$result= $xml->xpath($choix);
//Eliminer les doublons
$result=array_unique($result);
echo "<h3>Résultats de la recherche</h3>";
//Affichage sous forme de liste
echo "<ol>";
foreach($result as $valeur)
{
echo "<li> $valeur </li>";
}
echo "</ol>";
}
?>
Exercice 5:
Transférez toutes les données de la base voitures créée aux chapitres 14 et 15 dans un fichier XML d’abord en utilisant phpMyAdmin puis en écrivant un script PHP. La répartition des données dans des attributs ou comme contenu des éléments est libre.
Solution
Exportation réalisée avec phpMyAdmin (fichier voitures.xml)
<?xml version="1.0" encoding="iso-8859-1" ?>
<!--
-
- phpMyAdmin XML Dump
- version 2.6.0-rc3
- http://www.phpmyadmin.net
-
- Serveur: localhost
- Généré le : Dimanche 26 Décembre 2004 à 00:09
- Version du serveur: 4.0.21
- Version de PHP: 5.0.2
-->
<!--
- Base de données: `voitures`
-->
<voitures>
<!-- Table cartegrise -->
<cartegrise>
<id_pers>1</id_pers>
<immat>178ZRX</immat>
<datecarte>2004-05-15</datecarte>
</cartegrise>
<cartegrise>
<id_pers>2</id_pers>
<immat>179ZRX</immat>
<datecarte>2004-05-17</datecarte>
</cartegrise>
<cartegrise>
<id_pers>2</id_pers>
<immat>188ZRX</immat>
<datecarte>2004-05-27</datecarte>
</cartegrise>
<cartegrise>
<id_pers>3</id_pers>
<immat>180ZRX</immat>
<datecarte>2004-05-18</datecarte>
</cartegrise>
<cartegrise>
<id_pers>4</id_pers>
<immat>181ZRX</immat>
<datecarte>2004-05-19</datecarte>
</cartegrise>
<cartegrise>
<id_pers>4</id_pers>
<immat>182ZRX</immat>
<datecarte>2004-05-20</datecarte>
</cartegrise>
<cartegrise>
<id_pers>5</id_pers>
<immat>181ZRX</immat>
<datecarte>2004-05-19</datecarte>
</cartegrise>
<cartegrise>
<id_pers>5</id_pers>
<immat>183ZRX</immat>
<datecarte>2004-05-22</datecarte>
</cartegrise>
<cartegrise>
<id_pers>6</id_pers>
<immat>184ZRX</immat>
<datecarte>2004-05-23</datecarte>
</cartegrise>
<cartegrise>
<id_pers>7</id_pers>
<immat>185ZRX</immat>
<datecarte>2004-05-24</datecarte>
</cartegrise>
<cartegrise>
<id_pers>7</id_pers>
<immat>189ZRX</immat>
<datecarte>2004-05-28</datecarte>
</cartegrise>
<cartegrise>
<id_pers>8</id_pers>
<immat>186ZRX</immat>
<datecarte>2004-05-25</datecarte>
</cartegrise>
<cartegrise>
<id_pers>8</id_pers>
<immat>187ZRX</immat>
<datecarte>2004-05-25</datecarte>
</cartegrise>
<cartegrise>
<id_pers>9</id_pers>
<immat>200XJR</immat>
<datecarte>2004-11-23</datecarte>
</cartegrise>
<!-- Table modele -->
<modele>
<id_modele>17C92853AZ</id_modele>
<modele>Citroën C5</modele>
<carburant>diesel</carburant>
</modele>
<modele>
<id_modele>178524ER45</id_modele>
<modele>Citroën Picasso</modele>
<carburant>essence</carburant>
</modele>
<modele>
<id_modele>7499RF5679</id_modele>
<modele>Renault Mégane Scénic</modele>
<carburant>diesel</carburant>
</modele>
<modele>
<id_modele>33356677PO</id_modele>
<modele>Peugeot 206</modele>
<carburant>électrique</carburant>
</modele>
<modele>
<id_modele>563339GH56</id_modele>
<modele>Citroën C3</modele>
<carburant>essence</carburant>
</modele>
<modele>
<id_modele>83321TY455</id_modele>
<modele>Renault Espace</modele>
<carburant>diesel</carburant>
</modele>
<modele>
<id_modele>AZER67455T</id_modele>
<modele>Peugeot 307</modele>
<carburant>essence</carburant>
</modele>
<modele>
<id_modele>FHT55432GH</id_modele>
<modele>Renault Twingo</modele>
<carburant>essence</carburant>
</modele>
<modele>
<id_modele>DSQS455674</id_modele>
<modele>Renault Adventime</modele>
<carburant>diesel</carburant>
</modele>
<modele>
<id_modele>485228FGD7</id_modele>
<modele>Volkswagen Golf</modele>
<carburant>diesel</carburant>
</modele>
<modele>
<id_modele>ZER627864K</id_modele>
<modele>Ferrari GT 40</modele>
<carburant>essence</carburant>
</modele>
<modele>
<id_modele>QSDFGH7777</id_modele>
<modele>Renault Modus</modele>
<carburant>essence</carburant>
</modele>
<!-- Table proprietaire -->
<proprietaire>
<id_pers>1</id_pers>
<nom>Zulgru</nom>
<prenom>Mickey</prenom>
<adresse>23 rue Newton</adresse>
<ville>Paris</ville>
<codepostal>75006</codepostal>
</proprietaire>
<proprietaire>
<id_pers>2</id_pers>
<nom>Algout</nom>
<prenom>Michel</prenom>
<adresse>562 rue Pascal</adresse>
<ville>Paris</ville>
<codepostal>75018</codepostal>
</proprietaire>
<proprietaire>
<id_pers>3</id_pers>
<nom>Dupont</nom>
<prenom>Jean</prenom>
<adresse>3 Rue d'Alésia</adresse>
<ville>Paris</ville>
<codepostal>75015</codepostal>
</proprietaire>
<proprietaire>
<id_pers>4</id_pers>
<nom>Azerty</nom>
<prenom>Paulo</prenom>
<adresse>5 Rue Compoint</adresse>
<ville>Paris</ville>
<codepostal>75018</codepostal>
</proprietaire>
<proprietaire>
<id_pers>5</id_pers>
<nom>Azerty</nom>
<prenom>Marie</prenom>
<adresse>5 Rue Compoint</adresse>
<ville>Paris</ville>
<codepostal>75018</codepostal>
</proprietaire>
<proprietaire>
<id_pers>6</id_pers>
<nom>Duval</nom>
<prenom>Emilie</prenom>
<adresse>543 avenue Foché</adresse>
<ville>Paris</ville>
<codepostal>75016</codepostal>
</proprietaire>
<proprietaire>
<id_pers>7</id_pers>
<nom>Zouk</nom>
<prenom>Julia</prenom>
<adresse>56 Boulevard Nez</adresse>
<ville>Paris</ville>
<codepostal>75011</codepostal>
</proprietaire>
<proprietaire>
<id_pers>8</id_pers>
<nom>Val</nom>
<prenom>Phil</prenom>
<adresse>34 rue des Champs</adresse>
<ville>Paris</ville>
<codepostal>75017</codepostal>
</proprietaire>
<proprietaire>
<id_pers>9</id_pers>
<nom>Zébulon</nom>
<prenom>Alfred</prenom>
<adresse>Place de la Concorde</adresse>
<ville>Paris</ville>
<codepostal>75008</codepostal>
</proprietaire>
<!-- Table voiture -->
<voiture>
<immat>200XJR</immat>
<id_modele>17C92853AZ</id_modele>
<couleur>foncée</couleur>
<datevoiture>2003-03-19</datevoiture>
</voiture>
<voiture>
<immat>178ZRX</immat>
<id_modele>17C92853AZ</id_modele>
<couleur>claire</couleur>
<datevoiture>2002-09-15</datevoiture>
</voiture>
<voiture>
<immat>179ZRX</immat>
<id_modele>178524ER45</id_modele>
<couleur>foncée</couleur>
<datevoiture>2004-05-17</datevoiture>
</voiture>
<voiture>
<immat>188ZRX</immat>
<id_modele>FHT55432GH</id_modele>
<couleur>moyenne</couleur>
<datevoiture>2004-05-27</datevoiture>
</voiture>
<voiture>
<immat>180ZRX</immat>
<id_modele>178524ER45</id_modele>
<couleur>claire</couleur>
<datevoiture>2004-05-18</datevoiture>
</voiture>
<voiture>
<immat>181ZRX</immat>
<id_modele>7499RF5679</id_modele>
<couleur>claire</couleur>
<datevoiture>2004-05-19</datevoiture>
</voiture>
<voiture>
<immat>182ZRX</immat>
<id_modele>485228FGD7</id_modele>
<couleur>foncée</couleur>
<datevoiture>2001-11-25</datevoiture>
</voiture>
<voiture>
<immat>183ZRX</immat>
<id_modele>33356677PO</id_modele>
<couleur>moyenne</couleur>
<datevoiture>2004-05-22</datevoiture>
</voiture>
<voiture>
<immat>184ZRX</immat>
<id_modele>563339GH56</id_modele>
<couleur>foncée</couleur>
<datevoiture>2004-05-23</datevoiture>
</voiture>
<voiture>
<immat>185ZRX</immat>
<id_modele>83321TY455</id_modele>
<couleur>claire</couleur>
<datevoiture>2004-05-24</datevoiture>
</voiture>
<voiture>
<immat>186ZRX</immat>
<id_modele>AZERT67455</id_modele>
<couleur>moyenne</couleur>
<datevoiture>2004-05-25</datevoiture>
</voiture>
<voiture>
<immat>187ZRX</immat>
<id_modele>DSQS455674</id_modele>
<couleur>foncée</couleur>
<datevoiture>2004-05-25</datevoiture>
</voiture>
<voiture>
<immat>189ZRX</immat>
<id_modele>ZER627864K</id_modele>
<couleur>claire</couleur>
<datevoiture>2004-05-28</datevoiture>
</voiture>
</voitures>
En utilisant un script, nous pouvons choisir librement la répartition des champs des tables MySQL en tant qu’attributs ou éléments du document XML. Dans la base « voitures » la table « modele » porte le même nom que le champ « modele » qu’elle contient.
Ceci ne posait pas de problème avec MySQL et permettait de montrer que la notation modele.modele dans une requête SQL donnait bien accès à la colonne modele de la table modele sans risque de confusion. En revanche, en XML il risque d’y avoir une confusion si deux éléments de structure différente portent le même nom. Nous avons donc choisi de créer un élément <modeles> et un élément <modele> imbriqué dans le précédent.
<?php
include("connex.inc.php");
$idcom=connex("voitures","myparam");
$requete="SELECT * FROM proprietaire";
//Table proprietaire
$result1=mysql_query($requete,$idcom);
$chxml="<?xml version=\"1.0\" encoding=\"iso-8859-1\"
standalone=\"yes\"?>\n<voitures>\n";
while($ligne=mysql_fetch_array($result1,MYSQL_ASSOC))
{
$chxml.="<proprietaire id=\"{$ligne['id_pers']}\">\n";
$chxml.=" <nom>{$ligne['nom']} </nom>\n";
$chxml.=" <prenom>{$ligne['prenom']} </prenom>\n";
$chxml.=" <adresse>{$ligne['adresse']} </adresse>\n";
$chxml.=" <ville>{$ligne['ville']} </ville>\n";
$chxml.=" <codepostal>{$ligne['codepostal']} </codepostal>\n";
$chxml.= "</proprietaire>\n";
}
//Table cartegrise
$result2=mysql_query($requete,$idcom);
while($ligne=mysql_fetch_array($result2,MYSQL_ASSOC))
{
$chxml.="<cartegrise id_pers=\"{$ligne['id_pers']}\"
immat=\"{$ligne['immat']}\">\n";
$chxml.=" <datecarte>{$ligne['datecarte']} </datecarte>\n";
$chxml.= "</cartegrise>\n";
}
//Table voiture
$result3=mysql_query($requete,$idcom);
while($ligne=mysql_fetch_array($result3,MYSQL_ASSOC))
{
$chxml.="<voiture immat=\"{$ligne['immat']}\">\n
id_modele=\"{$ligne['id_modele']}\" ";
$chxml.=" <couleur>{$ligne['datecarte']} </couleur>\n";
$chxml.=" <datevoiture>{$ligne['datecarte']} </datevoiture>\n";
$chxml.= "</voiture>\n";
}
//Table modele
$result4=mysql_query($requete,$idcom);
while($ligne=mysql_fetch_array($result4,MYSQL_ASSOC))
{
$chxml.="<modeles id_modele=\"{$ligne['id_modele']}\"> ";
$chxml.=" <modele>{$ligne['modele']} </modele>\n";
$chxml.=" <carburant>{$ligne['carburant']} </carburant>\n";
$chxml.= "</modeles>\n";
}
$chxml.="</voitures>";
file_put_contents("voitures2.xml",$chxml);
echo "<a href=\"voitures2.xml\"><button type=\"button\"> Voir le
fichier XML </button></a>";
?>
Exercice 6:
Transférez les données du fichier iut.xml de l’exercice 3 dans une table MySQL. Créez la table auparavant en lui donnant comme clé primaire la valeur de l’attribut id de l’étudiant.
Solution
Code SQL de création de la table « etudiant » réalisée avec
phpMyAdmin :
CREATE TABLE `etudiant` (
`id` int(10) unsigned NOT NULL default '0',
`nom` varchar(30) NOT NULL default '',
`uv1` varchar(30) default NULL,
`duree1` tinyint(4) default NULL,
`note1` tinyint(4) default NULL,
`uv2` varchar(30) default NULL,
`duree2` tinyint(4) default NULL,
`note2` tinyint(4) default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uv1` (`uv1`,`uv2`)
) TYPE=MyISAM;
Note :
Si nous voulmions respecter les régles énoncées au chapitre 13, il serait
grandement préférable de définir un MCD comprenant une entité
« etudiant », une entité « uv » et une association « passe » reliant
ces entités. Le MLD correspondant aménerait à la création de trois tables.
Script d’insertion des données dans la table « etudiant ».
<?php
$xml=simplexml_load_file("iut.xml");
//Connexion à la base
include_once("connex.inc.php");
$idcom= connex("iut","myparam");
//Lecture du contenu des éléments
for($i=0;$i<5;$i++)
{
echo "Insertion n° $i";
$id=$xml->etudiant[$i][id];
$nom=$xml->etudiant[$i][nom];
$uv1=$xml->etudiant[$i]->uv[0]->nom;
$duree1=$xml->etudiant[$i]->uv[0]->duree;
$note1=$xml->etudiant[$i]->uv[0]->note;
$uv2=$xml->etudiant[$i]->uv[1]->nom;
$duree2=$xml->etudiant[$i]->uv[1]->duree;
$note2=$xml->etudiant[$i]->uv[1]->note;
$requete= "INSERT INTO
etudiant(id,nom,uv1,duree1,note1,uv2,duree2,note2)
VALUES('$id','$nom','$uv1','$duree1','$note1','$uv2','$duree2','$no
te2')";
//Envoi de la requête d'insertion
$verif=mysql_query($requete,$idcom);
if(!$verif) echo "NON INSERE";
}
?>
Article plus récent Article plus ancien