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é.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";
}
?>
Aucun commentaire:
Enregistrer un commentaire