Chapitre 4
GESTION D'UNE BASE DE DONNEES
PAR INTERFACE WEB
 
 
Précédent Suivant
 

Gestion d'une base de données
par interface Web
Paramètres d'une page PHP
* Une page PHP peut recevoir des paramètres
* D'un formulaire
* Données à ajouter dans la base
* Données à rechercher dans la base
* ...
* D'un lien hypertexte
* Paramètre d'affichage (e.g. critère de tri)
* Identifiant de l'élément à afficher (e.g. ID d'un ouvrage)
* ...
* Méthode "get"
* Données en clair dans l'URL
* Méthode "post"
* Données non visibles dans l'URL
Paramètres avec la méthode "get" (1/2)
* Paramètres transmis dans l'URL
* Exemple: liste.php?tri=auteur
* Sont lisibles dans le navigateur
* La taille des données est limitée
* Attention au format des données
* Problème avec les caractères spéciaux
* Paramètres dans le tableau associatif "_GET"
* Clé = nom du paramètre
* Elément = valeur du paramètre
* $colonne = $_GET["tri"];
Paramètres avec la méthode "get" (2/2)
* Page "liste.php" avec paramètre
<html>
<body>
<?php
include("connexion.php");
$colonne = $_GET["tri"];
$cnx = connexion();
$requete = "SELECT * FROM ouvrage ORDER BY $colonne";
$result = @mysqli_query($cnx,$requete);
while ($enr = @mysqli_fetch_object($result)) {
echo "<p>$enr->auteur - $enr->titre</p>";
}
@mysqli_close($cnx);
?>
</body>
</html>
* Exemple d'utilisation
<p><a href="liste.php?tri=auteur">Tri par auteur</a></p>
<p><a href="liste.php?tri=titre">Tri par titre</a></p>
HTML et les formulaires
* Formulaire = balise HTML <form>
* Contient des champs de saisie
* Chaque champ a un nom (attribut "name")
* Chaque champ a une valeur
* Résultat du formulaire = association nom-valeur
* nom1 = valeur1 (nom = Nawouak)
* nom2 = valeur2 (prenom = Bruno)
* ...
* Un formulaire est associé à une action
* Action = URL où transmettre les données
* Un bouton de soumission déclenche l'action
* Données transmises = association nom-valeur
* paramètre1 = valeur1 (nom = Nawouak)
* paramètre2 = valeur2 (prenom = Bruno)
Exemple de formulaire (1/2)
* Code HTML
<form action="login.php">
<p>Utilisateur:
<input type="text" name="user"/></p>
<p>Mot de passe:
<input type="password" name="pass"/></p>
<p><input type="submit" value="Se connecter"/></p>
</form>
* Apparence
* Résultat
user = nawouak
pass = 12345
Exemple de formulaire (2/2)
* Soumission du formulaire
* Transmission des paramètres à "login.php"
* Redirection vers: login.php?user=nawouak&pass=12345
* "?" démarre la séquence des paramètres
* "&" sépare deux paramètres
* Récupération des paramètres dans "login.php"
$utilisateur = $_GET["user"];
$mdp = $_GET["pass"];
* Paramètre n'existe pas ==> message d'erreur
* "@" permet de masquer l'erreur
* $utilisateur = @$_GET["user"];
* En cas d'erreur: $utilisateur = "";
* Autre possibilité: tester l'existence du paramètre
* if (isset($_GET["user"])) { /* "user" existe */ }
Formulaire: saisie de texte (1/2)
* Balise <input type="text"/>
* Saisie d'une seule ligne
* Texte visible
* Valeur par défaut
* Attribut "value"
* Exemple
<input type="text" name="user" value="votre nom ?"/>
* Balise <input type="password"/>
* Idem "text" mais texte masqué à la saisie
Formulaire: saisie de texte (2/2)
* Balise <textarea>
* Saisie sur plusieurs lignes
* Valeur par défaut
* Placée dans la balise
* Taille de la zone de texte
* Attribut "rows": hauteur, en nombre de lignes
* Attribut "cols": largeur, en nombre de caractères
* Exemple
<textarea name="remarque" rows="3" cols="22">
votre remarque...
</textarea>
Formulaire: sélection (1/3)
* Balise <input type="checkbox"/>
* Réponse oui / non
* Valeur par défaut
* Attribut "checked"
* Pour cocher: checked="yes"
* Transmission
* Coché ==> paramètre avec valeur "on" ou valeur de l'attribut "value"
* Non coché ==> paramètre non transmis
* Exemple
<p><input type="checkbox" value="ok"
name="student"/>Etudiant</p>
<p><input type="checkbox" checked="yes"
name="worker"/>Travailleur</p>
Formulaire: sélection (2/3)
* Balise <input type="radio"/>
* Permettre une sélection parmi plusieurs choix
* Fonctionnement similaire à "checkbox"
* Un seul bouton doit être sélectionné
* Les boutons sont liés par le même nom (attribut "name" identique)
* Bouton sélectionné par défaut
* Celui avec: checked="yes"
* Valeur transmise = valeur du bouton sélectionné
* Exemple
<p><input type="radio" name="freq"
value="jour"/>tous les jours</p>
<p><input type="radio" name="freq" value="sem"
checked="yes"/>toutes les semaines</p>
<p><input type="radio" name="freq"
value="mois"/>tous les mois</p>
Formulaire: sélection (3/3)
* Balise <select>
* Menu déroulant
* Une option du menu = une balise <option>
* <option value="valeur">intitulé</option>
* Valeur transmise = valeur de l'option sélectionnée
* Exemple
<select name="freq">
<option value="jour">
tous les jours</option>
<option value="sem" selected="selected">
toutes les semaines</option>
<option value="mois">
tous les mois</option>
</select>
Formulaire: champ caché
* Il peut être nécessaire de transmettre des données
qui ne sont pas saisies par l'utilisateur
* Exemple: l'identifiant de l'utilisateur
* Pour stocker en base de données l'auteur d'une saisie
* Balise <input type="hidden"/>
* Valeur transmise = valeur dans l'attribut "value"
* Exemple
<input type="hidden" name="user"
value="<?php echo $user_id; ?>"/>
Formulaire: boutons
* Balise <input type="submit"/>
* Clic ==> soumission du formulaire
* Attribut "value" change le texte du bouton
* Balise <input type="reset"/>
* Clic ==> réinitialisation du formulaire
* Attribut "value" change le texte du bouton
* Balise <input type="image"/>
* Bouton remplacé par une image
* Attribut "src" contient l'image du bouton
* Clic ==> soumission du formulaire
* Si un bouton possède un nom
* Au clic, le nom est envoyé comme paramètre avec sa valeur
* Exemple
* <input type="submit"
value="Soumettre" name="action"/>
* Au clic, transmission du paramètre: action = Soumettre
Paramètres avec la méthode "post" (1/3)
* Paramètres transmis dans l'entête de la requête
* Provient d'un formulaire
* Exemple: champ "user" avec la valeur "nawouak"
* Ils n'apparaissent pas en clair dans l'URL
* Mais ne sont pas pour autant cryptés
* La taille des données n'est plus limitée
* Il n'y a pas à se soucier des caractères spéciaux
* Paramètres dans le tableau associatif "_POST"
* Clé = nom du paramètre
* Elément = valeur du paramètre
* $utilisateur = $_POST["user"];
Paramètres avec la méthode "post" (2/3)
* Préciser la méthode de transmission
* Attribut "method" du formulaire
* Valeurs: "get" ou "post"
* Par défaut: "get"
* Exemple
<form method="post" action="ajout.php">
<p>Nom:
<input type="text" name="lastname"/></p>
<p>Prénom:
<input type="text" name="firstname"/></p>
<p><input type="submit"/></p>
</form>
* Transmission à la page "ajout.php"
* Sans paramètres visibles !
Paramètres avec la méthode "post" (3/3)
* Page "ajout.php" avec paramètres
<?php
include("connexion.php");
$nom = @$_POST["lastname"];
$prenom = @$_POST["firstname"];
$cnx = connexion();
$requete = "INSERT INTO utilisateur
VALUES (NULL,'$nom','$prenom')";
@mysqli_query($cnx,$requete);
@mysqli_close($cnx);
?>
* Remarque: la page est invisible
* Elle ajoute un enregistrement dans la base
* Ensuite elle doit rediriger sur une autre page
* Redirection sur une autre page
* header("Location: nouvelle_page");
* Attention: rien ne doit être affiché avant cette instruction
* Doit être avant toute balise HTML éventuelle
* Pas d'instruction "echo" avant
Schémas classiques de transmission (1/6)
* Consultation de la base de données
* Page formulaire
* Page requête (avec affichage HTML)
* Transmission par les méthodes "get" ou "post"
* "get" seulement s'il y a besoin d'un lien hypertexte
Schémas classiques de transmission (2/6)
* Formulaire
<html>
<body>
<form method="post" action="search.php">
<p>Mot:
<input type="text" name="mot"/></p>
<p><input type="submit" value="Chercher"/></p>
</form>
</body>
</html>
* Transmission
* mot = ?
Schémas classiques de transmission (3/6)
* Requête + affichage
<html>
<body>
<?php
include("connexion.php");
$mot = @$_POST["mot"];
$cnx = connexion();
$requete = "SELECT * FROM ouvrage";
$requete .= " WHERE titre LIKE '%$mot%'";
$result = @mysqli_query($cnx,$requete);
while ($enr = @mysqli_fetch_object($result)) {
echo "<p>$enr->titre ($enr->auteur)</p>";
}
@mysqli_close($cnx);
?>
</body>
</html>
Schémas classiques de transmission (4/6)
* Modification de la base de données
* Page formulaire
* Page requête "invisible"
* Aucun affichage
* Redirection sur une autre page après la requête
* Transmission par la méthode "post"
Schémas classiques de transmission (5/6)
* Formulaire
<html>
<body>
<form method="post" action="add_livre.php">
<p>Auteur:
<input type="text" name="auteur"/></p>
<p>Titre:
<input type="text" name="titre"/></p>
<p><input type="submit" value="Ajouter"/></p>
</form>
</body>
</html>
* Transmission
* auteur = ?
* titre = ?
Schémas classiques de transmission (6/6)
* Requête sans affichage
<?php
include("connexion.php");
$auteur = addSlashes(@$_POST["auteur"]);
$titre = addSlashes(@$_POST["titre"]);
$cnx = connexion();
$requete = "INSERT INTO ouvrage
VALUES (NULL,'$auteur','$titre')";
@mysqli_query($cnx,$requete);
@mysqli_close($cnx);
header("Location: home.htm");
?>
* Pour rester invisible (et permettre la redirection)
* Pas de code HTML dans cette page
* Pas de commande "echo"
* Attention à la saisie de texte
* Possibilité de saisir du texte contenant les symboles "'" et """
* Pour écrire la requête SQL, il faut les remplacer par "\'" et "\""
* Pour cela, on utilise la fonction "addSlashes"