Accès objet à MySQL avec PHP – exercices corrigés – TP et solutions
Le but de ces exercices est de réaliser avec SQLite la même application
que
celle réalisée avec MySQL au cours des exercices Exercice 1:
Créez une base nommée voitures à l’aide de SQLiteManager.
Créez ensuite les tables de la base voitures selon le modèle logique
défini dans les exercices du chapitre 13 (en cas de problème, voir le corrigé
des exercices de ce chapitre). Vérifiez la structure de chaque table.
Solution
Création
de la table « propriétaire »
Le
code SQL de création de la table :
CREATE
TABLE proprietaire (
id_pers
INTEGER PRIMARY KEY,
nom
VARCHAR(30) NOT NULL,
prenom
VARCHAR(30) ,
adresse
VARCHAR(50) NOT NULL,
ville
VARCHAR(40) NOT NULL,
codepostal
MEDIUMINT(5) NOT NULL
);
Création
de la table « cartegrise »
Le
code SQL de création de la table :
CREATE
TABLE cartegrise (
id_pers
MEDIUMINT(8) NOT NULL PRIMARY KEY,
immat
VARCHAR(6) NOT NULL PRIMARY KEY,
datecarte
DATE NOT NULL
);
Création
de la table « voiture »
Le
code SQL de création de la table :
CREATE
TABLE voiture (
immat
VARCHAR(6) NOT NULL PRIMARY KEY,
id_modele
VARCHAR(10) NOT NULL,
couleur
VARCHAR(10) NOT NULL,
datevoiture
DATE NOT NULL
);
Création
de la table « modele »
Le
code SQL de création de la table :
CREATE
TABLE modele (
id_modele
VARCHAR(10) NOT NULL PRIMARY KEY,
modele
VARCHAR(30) NOT NULL,
carburant
VARCHAR(10) NOT NULL
);
Exercice 2:
Créez un formulaire permettant l’insertion des coordonnées d’une personne
dans la table propriétaire en utilisant la méthode objet.
Solution
<?php
if(isset($_POST['nom']) && isset($_POST['adresse'])
&&
isset($_POST['ville']) && isset($_POST['codepostal']))
{
//Récupération des valeurs saisies
$nom=$_POST['nom'];
$prenom=$_POST['prenom'];
$adresse=$_POST['adresse'];
$ville=$_POST['ville'];
$codepostal=$_POST['codepostal'];
$db=new
SQLiteDatabase("C:/wamp/www/sqlitemanager/voitures",0666,$erreur);
//Requète SQL
$requete="INSERT INTO proprietaire
VALUES(NULL,'$nom','$prenom','$adresse','$ville','$codepostal')";
if($result=$db->queryExec($requete)) echo "DONNEES
INSEREES";
}
else {"<h3>Formulaire à compléter!</h3>";}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/REC-html40/strict.dtd">
<html>
<head>
<title>Enregistrement d'une personne</title>
<meta http-equiv="Content-Type"
content="text/html; charset=ISO-
8859-1">
</head>
<body>
<form action= "<?php echo
$_SERVER['PHP_SELF'];?>" method="post"
enctype="application/x-www-form-urlencoded">
<fieldset>
<legend><b>Coordonnées de la personne</legend>
<table>
<tr><td>Nom : </td><td><input
type="text" name="nom" /></td></tr>
<tr><td>Prénom : </td><td><input
type="text" name="prenom"
/></td></tr>
<tr><td>Adresse : </td><td><input
type="text" name="adresse"
/></td></tr>
<tr><td>Ville : </td><td><input
type="text" name="ville"
/></td></tr>
<tr><td>Code postal : </td><td><input
type="text" name="codepostal"
/></td></tr>
<tr colspan="2"><td><input
type="submit" value="Enregistrer"
/></td></tr>
</table>
</fieldset>
</form>
</body>
</html>
Exercice 3:
Insérez des données dans la table modele en utilisant SQLiteManager,
puis créez un script qui affiche la liste de tous les modèles de voiture dans
un tableau HTML en effectuant un tri par marque. Utilisez la méthode
procédurale.
Solution
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/REC-html40/strict.dtd">
<html>
<head>
<title>Affichage de tous les modèles de
voitures</title>
<meta http-equiv="Content-Type"
content="text/html; charset=ISO-
8859-1">
</head>
<body>
<?php
if ($id_base=
sqlite_open("C:/wamp/www/sqlitemanager/voitures",0666,$erreur))
{
echo "<table border=\"1\">";
echo "<thead><th>Type</th><th> Modele
</th></thead>";
//Requète SQL
$requete="SELECT id_modele,modele FROM modele ORDER BY modele
ASC";
$result=sqlite_query($id_base,$requete);
while($ligne=sqlite_fetch_array($result))
{
echo "<tr><td> ",$ligne[0],"
</td><td> ",$ligne[1],"
</td></tr>";
}
echo
"</table>";
}
?>
</body>
</html>
Le
résultat affiché est le suivant :
Exercice 4:
Adaptez le script de l’exercice 3 en utilisant la méthode objet.
Les données de chaque ligne du résultat doivent aussi être retournées sous
forme d’objet.
Solution
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/REC-html40/strict.dtd">
<html>
<head>
<title>Affichage de tous les modèles de
voitures</title>
<meta http-equiv="Content-Type"
content="text/html; charset=ISO-
8859-1">
</head>
<body>
<?php
if($db=new
SQLiteDatabase("C:/wamp/www/sqlitemanager/voitures",0666,$erreur))
{
//Requète SQL
$requete="SELECT id_modele,modele FROM modele ORDER BY modele
ASC";
$result=$db->query($requete);
echo "<table border=\"1\">";
echo "<thead><th>Type</th><th> Modele
</th></thead>";
while($ligne=$result->fetchObject())
{
echo
"<tr><td> ",$ligne->id_modele,"
</td><td> ",$ligne-
>modele," </td></tr>";
}
echo "</table>";
}
?>
</body>
</html>
Exercice 5:
Créez dynamiquement un formulaire contenant une liste de sélection
HTML (avec les éléments <select> et <option>) qui donne la liste de
tous les modèles présents dans la table modele. Ajoutez manuellement à l’aide
de SQLiteManager un ou plusieurs modèles à la table, et vérifiez que la liste
de sélection prend bien en compte ces ajouts. Utilisez successivement la méthode
procédurale et la méthode objet.
Solution
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/REC-html40/strict.dtd">
<html>
<head>
<title>Création d'une liste de sélection de tous les modèles
de
voitures</title>
<meta http-equiv="Content-Type"
content="text/html; charset=ISO-
8859-1">
</head>
<body>
<h2>METHODE PROCEDURALE</h2>
<form method="post"
action="ch16exo5.php">
<fieldset>
<legend>Liste des modèles</legend>
<select name="modeles">
<?php
if($idbase=sqlite_open("C:/wamp/www/sqlitemanager/voitures",0666,$e
rreur))
{
//Requète SQL
$requete="SELECT id_modele,modele FROM modele ORDER BY modele
ASC";
$result=sqlite_query($idbase,$requete);
while($ligne=sqlite_fetch_object($result))
{
echo "<option
value=\"$ligne->id_modele\">$ligne-
>modele</option>";
}
sqlite_close($idbase);
}
?>
</select>
<input type="submit" value="Choisir" />
</fieldset>
</form>
<h2>METHODE
OBJET</h2>
<form
method="post" action="ch16exo5.php">
<fieldset>
<legend>Liste
des modèles</legend>
<select
name=\"modeles\">
<?php
if($db=new
SQLiteDatabase("C:/wamp/www/sqlitemanager/voitures",0666,$erreur))
{
//Requète
SQL
$requete="SELECT
id_modele,modele FROM modele ORDER BY modele
ASC";
$result=$db->query($requete);
while($ligne=$result->fetchObject())
{
echo
"<option value=\"$ligne->id_modele\">$ligne-
>modele</option>";
}
}
?>
</select>
<input
type="submit" value="Choisir" />
</fieldset>
</form>
</body>
</html>
Le
résultat obtenu est :
Exercice 6:
Utilisez le mécanisme des transactions pour insérer simultanément et
en toute sécurité des données dans les tables proprietaire et cartegrise.
Utilisez la méthode procédurale puis la méthode objet.
Solution
Méthode procédurale : fichier ch16exo6.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/REC-html40/strict.dtd">
<html>
<head>
<title>Enregistrement d'un véhicule </title>
<meta http-equiv="Content-Type"
content="text/html; charset=ISO-
8859-1">
</head>
<body>
<form action= "<?php echo
$_SERVER['PHP_SELF'];?>" name="form1"
method="post"
enctype="application/x-www-form-urlencoded">
<fieldset>
<legend><b>Saisissez les caractéristiques du
véhicule</legend>
<table>
<tr
colspan="2"><td><b>Propriétaire</td></tr>
<tr><td>Nom : </td><td><input
type="text" name="nom" size="40"
maxlength="10"/></td></tr>
<tr><td>Prénom : </td><td><input
type="text" name="prenom"
size="40" maxlength="30"/></td></tr>
<tr><td>Adresse : </td><td><input
type="text" name="adresse"
size="40"
maxlength="30"/></td></tr>
<tr><td>Ville : </td><td><input
type="text" name="ville" size="40"
maxlength="30"/></td></tr>
<tr><td>Code postal : </td><td><input
type="text" name="codepostal"
size="40"
maxlength="5"/></td></tr>
<tr
colspan="2"><td><b>Modèle</td></b></tr>
<tr><td>Nom du modèle</td>
<td>
<select name="modele">
<?php
if($idbase=sqlite_open("C:/wamp/www/sqlitemanager/voitures",0666,$e
rreur))
{
//Requète SQL
$requete="SELECT id_modele,modele FROM modele ORDER BY modele
ASC";
$result=sqlite_query($idbase,$requete);
while($ligne=sqlite_fetch_object($result))
{
echo "<option
value=\"$ligne->id_modele\">$ligne->modele</option>";
}
sqlite_close($idbase);
}
?>
</select></tr>
<tr><td>Carburant : </td>
<td><select
name="carburant">
<option
value="essence">Essence</option>
<option
value="diesel">Diesel</option>
<option
value="électrique">Electrique</option>
</select></td>
</tr>
<tr
colspan="2"><td><b>Voiture</td></tr>
<tr>
<td>Numéro
d'immatriculation</td>
<td><input
type="text" name="immat" /></td>
</tr>
<tr><td>Couleur
: </td>
<td><select
name="couleur">
<option
value="claire">Claire</option>
<option
value="moyenne">Moyenne</option>
<option
value="foncée">Foncée</option>
</select></td>
</tr>
<tr>
<td>Date
1ere immatriculation AAAA-MM-JJ</td>
<td><input
type="text" name="datevoiture" /></td>
</tr>
<td>Date
de la carte grise AAAA-MM-JJ</td>
<td><input
type="text" name="datecarte" /></td>
</tr>
<tr>
<td><input
type="reset" value=" Effacer " /></td>
<td><input
type="submit" value="ENREGISTRER" name="enreg"
/></td>
</tr>
</table>
</fieldset>
</form>
<?php
if(isset($_POST['enreg']))
{
//Récupération
des valeurs du formulaire
$id_modele=$_POST['modele'];
$carburant=sqlite_escape_string($_POST['carburant']);
$immat=sqlite_escape_string($_POST['immat']);
$couleur=sqlite_escape_string($_POST['couleur']);
$datevoiture=sqlite_escape_string($_POST['datevoiture']);
$datecarte=sqlite_escape_string($_POST['datecarte']);
$nom=sqlite_escape_string($_POST['nom']);
$prenom=sqlite_escape_string($_POST['prenom']);
$adresse=sqlite_escape_string($_POST['adresse']);
$ville=sqlite_escape_string($_POST['ville']);
$codepostal=(integer)
$_POST['codepostal'];
$id_base=
sqlite_open("C:/wamp/www/sqlitemanager/voitures",0666,$erreur);
//Requète
SQL
$requete="BEGIN;";
//Requète
SQL: insertions dans la table proprietaire
$requete.="INSERT
INTO proprietaire
VALUES(NULL,'$nom','$prenom','$adresse','$ville','$codepostal');";
$result=sqlite_exec($id_base,$requete);
//Récupération
de l'identifiant de la personne enregistrée
$id_pers=sqlite_last_insert_rowid($id_base);
//Requète
SQL: insertions dans la table cartegrise
$requete="INSERT
INTO cartegrise
VALUES('$id_pers','$immat','$datecarte');";
//Requète
SQL: insertions dans la table voiture
$requete.="INSERT
INTO voiture
VALUES('$immat','$id_modele','$couleur','$datevoiture');";
$requete.="COMMIT;";
sqlite_exec($id_base,$requete);
}
?>
</body>
</html>
Méthode
objet : fichier ch16exo6b.php
Les
seuls modifications par rapport au fichier précédent sont
signalées
aux repères , , , , et .
<!DOCTYPE
HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/REC-html40/strict.dtd">
<html>
<head>
<title>Enregistrement
d'un véhicule </title>
<meta
http-equiv="Content-Type" content="text/html; charset=ISO-
8859-1">
</head>
<body>
<form
action= "<?php echo $_SERVER['PHP_SELF'];?>"
name="form1"
method="post"
enctype="application/x-www-form-urlencoded">
<fieldset>
<legend><b>Saisissez
les caractéristiques du véhicule</legend>
<table>
<tr
colspan="2"><td><b>Propriétaire</td></tr>
<tr><td>Nom
: </td><td><input type="text" name="nom"
size="40"
maxlength="10"/></td></tr>
<tr><td>Prénom
: </td><td><input type="text" name="prenom"
size="40"
maxlength="30"/></td></tr>
<tr><td>Adresse
: </td><td><input type="text" name="adresse"
size="40"
maxlength="30"/></td></tr>
<tr><td>Ville
: </td><td><input type="text" name="ville"
size="40"
maxlength="30"/></td></tr>
<tr><td>Code
postal : </td><td><input type="text"
name="codepostal"
size="40"
maxlength="5"/></td></tr>
<tr
colspan="2"><td><b>Modèle</td></b></tr>
<tr><td>Nom
du modèle</td>
<td>
<select
name="modele">
<?php
$db=new
SQLiteDatabase("C:/wamp/www/sqlitemanager/voitures",
0666,$erreur);//
{
//Requète
SQL
$requete="SELECT
id_modele,modele FROM modele ORDER BY modele
ASC";
$result=$db->query($requete);//
while($ligne=$result->fetchObject())//
{
echo
"<option value=\"$ligne->id_modele\">$ligne-
>modele</option>";
}
}
?>
</select></tr>
<tr><td>Carburant
: </td>
<td><select
name="carburant">
<option
value="essence">Essence</option>
<option
value="diesel">Diesel</option>
<option
value="électrique">Electrique</option>
</select></td>
</tr>
<tr
colspan="2"><td><b>Voiture</td></tr>
<tr>
<td>Numéro
d'immatriculation</td>
<td><input
type="text" name="immat" /></td>
</tr>
<tr><td>Couleur
: </td>
<td><select
name="couleur">
<option
value="claire">Claire</option>
<option
value="moyenne">Moyenne</option>
<option
value="foncée">Foncée</option>
</select></td>
</tr>
<tr>
<td>Date
1ere immatriculation AAAA-MM-JJ</td>
<td><input
type="text" name="datevoiture" /></td>
</tr>
<td>Date
de la carte grise AAAA-MM-JJ</td>
<td><input
type="text" name="datecarte" /></td>
</tr>
<tr>
<td><input
type="reset" value=" Effacer " /></td>
<td><input
type="submit" value="ENREGISTRER" name="enreg"
/></td>
</tr>
</table>
</fieldset>
</form>
<?php
if(isset($_POST['enreg']))
{
//Récupération
des valeurs du formulaire
$id_modele=$_POST['modele'];
$carburant=sqlite_escape_string($_POST['carburant']);
$immat=sqlite_escape_string($_POST['immat']);
$couleur=sqlite_escape_string($_POST['couleur']);
$datevoiture=sqlite_escape_string($_POST['datevoiture']);
$datecarte=sqlite_escape_string($_POST['datecarte']);
$nom=sqlite_escape_string($_POST['nom']);
$prenom=sqlite_escape_string($_POST['prenom']);
$adresse=sqlite_escape_string($_POST['adresse']);
$ville=sqlite_escape_string($_POST['ville']);
$codepostal=(integer)
$_POST['codepostal'];
//Requète
SQL
$requete="BEGIN;";
//Requète
SQL: insertions dans la table proprietaire
$requete.="INSERT
INTO proprietaire
VALUES(NULL,'$nom','$prenom','$adresse','$ville','$codepostal');";
$result=$db->queryExec($requete);//
//Récupération
de l'identifiant de la personne enregistrée
$id_pers=$db->lastInsertRowid();//
//Requète
SQL: insertions dans la table cartegrise
$requete="INSERT
INTO cartegrise
VALUES('$id_pers','$immat','$datecarte');";
//Requète
SQL: insertions dans la table voiture
$requete.="INSERT
INTO voiture
VALUES('$immat','$id_modele','$couleur','$datevoiture');";
$requete.="COMMIT;";
$result=$db->queryExec($requete);//
unset($db);
}
?>
</body>
</html>
Exercice 7:
Créez un formulaire de recherche permettant de trouver toutes les personnes
propriétaires d’un modèle de véhicule donné. Affichez les résultats sous forme
de tableau HTML. Utilisez l’exercice 5 pour créer la liste de sélection des
modèles.
Solution
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/REC-html40/strict.dtd">
<html>
<head>
<title>Recherche de tous les propriétaires d'un même modèle
</title>
<meta http-equiv="Content-Type"
content="text/html; charset=ISO-
8859-1">
</head>
<body>
<form action= "<?php echo
$_SERVER['PHP_SELF'];?>" name="form1"
method="post"
enctype="application/x-www-form-urlencoded">
<fieldset>
<legend><b>Choisissez le nom du modèle</legend>
<table>
<tr><td>Nom du modèle</td>
<td>
<select name="idmodele">
<?php
if($id_base=sqlite_open("C:/wamp/www/sqlitemanager/voitures",0666,$
erreur))
{
//Requète SQL
$requete="SELECT id_modele,modele FROM modele ORDER BY modele
ASC";
$result=sqlite_query($id_base,$requete);
while($ligne=sqlite_fetch_object($result))
{
echo
"<option
value=\"$ligne->id_modele\">$ligne->modele</option>";
}
sqlite_close($idbase);
}
?>
</select>
</tr>
<tr>
<td><input
type="reset" value=" Effacer " /></td>
<td><input
type="submit" value="CHERCHER" name="cherche"
/></td>
</tr>
</table>
</fieldset>
</form>
<?php
if(isset($_POST['idmodele']))
{
//Récupération
des valeurs du formulaire
$idmodele=$_POST['idmodele'];
//Requète
SQL
$requete="SELECT
proprietaire.nom, proprietaire.prenom,
voiture.immat,
modele.modele
FROM
voiture, modele, proprietaire, cartegrise
WHERE
voiture.id_modele= '$idmodele'
AND
voiture.id_modele=modele.id_modele
AND
cartegrise.immat=voiture.immat
AND
proprietaire.id_pers=cartegrise.id_pers";
$id_base=sqlite_open("C:/wamp/www/sqlitemanager/voitures",0666,$err
eur);
$result=sqlite_query($id_base,$requete);
echo
"<table border=\"1\">";
while($ligne=sqlite_fetch_array($result))
{
echo
"<tr><td>$ligne[0] </td><td>$ligne[1]
</td><td>$ligne[2]
</td>";
}
echo
"</table>";
sqlite_close($id_base);
}
else
echo "PROBLEME !!";
?>
</body>
</html>
Aucun commentaire:
Enregistrer un commentaire