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" |