Les langages de programmation du Web

Précédent Sommaire 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Suivant

17. Application : Création d'un compte avec une base de données MySQL

Dans le projet 14. Création d'un compte, nous avions utilisé un fichier pour stocker les informations.
Pour un petit projet cette méthode fonctionne bien, mais il devient rapidement évident de se servir d'une base de données (c'est simple, pratique, efficace et sécurisé).
Nous reprendrons la table table_login créée dans le chapitre précédent (3 champs : nom d'utilisateur, mot de passe et date d'inscription).

Formulaire HTML

Reprendre le formulaire compte_formulaire.html et modifier la ligne :

<form method="post" action="compte_bdd_enregistrement.php">

Localisation c:/wamp/www/isn/compte_bdd_formulaire.html

MySQL

php Script PHP

MySQL

API de communication avec MySQL

Avec le langage PHP, il est facile de communiquer avec un serveur MySQL à travers des requêtes SQL.

PHP propose même 3 APIs différentes pour se connecter à MySQL :

Paramètres de connexion au serveur MySQL

Le script PHP

Je vous propose de tester les trois API suivantes (à sélectionner) :

API mysql
API mysqli (style procédural)
API pdo_mysql (orienté objet)

Localisation :

c:/wamp/www/isn/compte_bdd_enregistrement.php

Pour cette API, le code source est le suivant :

<!DOCTYPE html>

<html>
    <head>
        <meta charset="UTF-8">
        <title>Inscription</title>
    </head>

    <body>
        <h2>Création d'un nouveau compte<br>
        (script PHP et base de données MySQL)</h2>

<?php
// connexion à la base de données MySQL

// paramètres de connexion par défaut
$MYSQL_SERVER "localhost";
$MYSQL_USER "root";
$MYSQL_PASSWORD "";

$DATABASE "base_isn";
$TABLE "table_login";



if (isset($_POST["User"]) && isset($_POST["Password"]))
{
    $utilisateur $_POST["User"];
    $motdepasse $_POST["Password"];

    if ($utilisateur == "" || $motdepasse == "")
    {
        print "<p>Erreur : Formulaire incomplet !</p>";
    }

    // test du format des données du formulaire
    elseif (preg_match("#[^a-zA-Z0-9_]#",$utilisateur) || preg_match("#[^a-zA-Z0-9_]#",$motdepasse))
    {
        print "<p>Erreur : les caractères autorisés sont : a-z A-Z 0-9 _</p>";
    }
    else
    {
        // formulaire valide

        // on teste si le nom d'utilisateur est déjà utilisé
        // requête SQL de recherche
        
        
        
        {
            // le nom d'utilisateur n'est pas utilisé
            // on ajoute une ligne dans la table
            $aujourdhui date("Y-m-d"); // date au format YYYY-mm-dd
            // requête SQL d'insertion (nouvelle ligne)
            $requete "INSERT INTO $TABLE(utilisateur,mot_de_passe,date_inscription) VALUES('$utilisateur','$motdepasse','$aujourdhui')";
            

            print "<p>Vous êtes maintenant inscrit !</p>";
        }
        else print "<p>Erreur : le nom d'utilisateur <strong>$utilisateur</strong> existe déjà !</p>";
    }
}
else print "<p>Valeurs invalides !</p>";

print "<p>Liste des utilisateurs et date d'inscription :<br>";

// requête SQL de lecture de la table avec tri par date
$requete "SELECT utilisateur,date_inscription FROM $TABLE ORDER BY date_inscription DESC";


{
    // affichage ligne par ligne
    print "[".$ligne['date_inscription']."] ".$ligne['utilisateur']."<br>";
}
print "</p>";

// Déconnexion

?>
    </body>
</html>

Voir

pythonScript CGI en Python

Formulaire HTML

Reprendre compte_formulaire.html et modifier la ligne :

<form method="post" action="../cgi-bin/compte_bdd_enregistrement.py">

Localisation c:/wamp/www/isn/compte_bdd_formulaire2.html

API de communication avec MySQL

La librairie MySQLdb fournit une API de communication avec un serveur MySQL.

Installation de la librairie MySQLdb :

sourceforge.net/projects/mysql-python

Pour Python 2.7 sous Windows, télécharger puis exécuter le fichier :
MySQL-python-1.2.4b4.win32-py2.7.exe

Script CGI-Python

Localisation c:/wamp/bin/apache/apache2.2.22/cgi-bin/compte_bdd_enregistrement.py

#! c:/Python27/python.exe
# -*- coding: utf-8 -*-
# script CGI compte_bdd_enregistrement.py

import cgi
import re,time
import MySQLdb

print "Content-Type: text/html\n"

print """<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Inscription</title>
    </head>

    <body>
        <h2>Création d'un nouveau compte<br>
        (script CGI-Python et base de données MySQL)</h2>"""

# connexion à la base de données MySQL
# paramètres de connexion par défaut
MYSQL_SERVER "localhost"
MYSQL_USER "root"
MYSQL_PASSWORD ""

DATABASE "base_isn"
TABLE "table_login"

bdd MySQLdb.Connect(host=MYSQL_SERVER,user=MYSQL_USER,passwd=MYSQL_PASSWORD,db=DATABASE,port=3306)

with bdd:
    curseur bdd.cursor(MySQLdb.cursors.DictCursor)

    form cgi.FieldStorage()

    if form.has_key("User"and form.has_key("Password"):
        # formulaire complet
        utilisateur str(form["User"].value)
        motdepasse str(form["Password"].value)

        # test du format des données du formulaire
        if re.compile("[^a-zA-Z0-9_]").search(utilisateuror re.compile("[^a-zA-Z0-9_]").search(motdepasse):
            print "<p>Erreur : les caractères autorisés sont : a-z A-Z 0-9 _</p>"

        else:
            # formulaire valide

            # on teste si le nom d'utilisateur est déjà utilisé
            # requête SQL de recherche
            requete "SELECT utilisateur FROM "TABLE +" WHERE utilisateur = '"utilisateur +"'"
            curseur.execute(requete)
            if curseur.rowcount == 0# retourne le nombre de lignes
                # le nom d'utilisateur n'est pas utilisé
                # on ajoute une ligne dans la table
                aujourdhui time.strftime("%Y-%m-%d"# date au format YYYY-mm-dd
                # requête SQL d'insertion (nouvelle ligne)
                requete "INSERT INTO "TABLE +" (utilisateur,mot_de_passe,date_inscription) VALUES('" \
                utilisateur +"','"motdepasse +"','"aujourdhui +"')"
                curseur.execute(requete)

                print "<p>Vous êtes maintenant inscrit !</p>"

            else:
                print "<p>Erreur : le nom d'utilisateur <strong>"utilisateur +"</strong> existe déjà !</p>"
    else:
        print "<p>Valeurs invalides !</p>"

    print "<p>Liste des utilisateurs et date d'inscription :<br>"

    # requête SQL de lecture de la table avec tri par date
    requete "SELECT utilisateur,date_inscription FROM "TABLE +" ORDER BY date_inscription DESC"
    curseur.execute(requete)

    lignes curseur.fetchall()

    for ligne in lignes:
        # affichage ligne par ligne
        print "["str(ligne['date_inscription']) +"] "ligne['utilisateur'] +"<br>"
    print "</p>"

    print """</body>
    </html>"""

bdd.close()

Exercices

Exercice 1

On s'intéresse à la table table_login.
Ecrire un script compte_bdd_dernier_inscrit.php qui affiche le nom d'utilisateur du dernier inscrit ainsi que sa date d'inscription.
On commencera par écrire la requête SQL (à tester avec l'interface phpMyAdmin).

Exercice 2

1) Ecrire un script compte_bdd_nb_inscrits.php qui affiche le nombre d'inscrits dans la table table_login (ce qui revient à connaître le nombre d'enregistrements de la table).
On utilisera la fonction PHP mysql_num_rows()
2) Nous allons utiliser une autre méthode pour compter le nombre d'enregistrements d'une table, avec la requête SQL :

SELECT COUNT(*) AS nombre_inscrits FROM table_login

Exécuter cette requête avec phpMyAdmin.
Ecrire le script compte_bdd_nb_inscrits2.php
3) Quelle méthode est la plus efficace ?

Exercice 3

1) Avec l'interface phpMyAdmin créer un nouveau champ date_naissance de type DATE dans la table table_login
2) Ecrire un script compte_bdd_anniversaire.php qui affiche les anniversaires en cours.
La requête SQL utilisera les fonctions MySQL DAY() MONTH() et CURDATE()
Bibliographie : MySQL : date and time functions
3) Tester et commenter la requête SQL :

SELECT *, YEAR(CURDATE())-YEAR(date_naissance) AS age FROM table_login

Compléter le script compte_bdd_anniversaire.php afin d'indiquer l'âge.

Exercice 4

Ecrire un formulaire de suppression d'un compte compte_bdd_suppression.html
Le formulaire sera traité par un script compte_bdd_suppression.php qui mettra à jour la table table_login

Exercice 5

Ecrire un formulaire de changement du mot de passe compte_bdd_mdp.html
Le formulaire sera traité par un script compte_bdd_mdp.php qui mettra à jour la table table_login

Projets

Projet n°1 Sondage en ligne

Par exemple :

Quelle est votre équipe de football préférée ?

OM
PSG

Vous préposerez des statistiques sur l'évolution des votes au cours du temps, sur l'âge, le sexe et le département d'origine des votants, etc.
Les données seront stockées dans une base de données.