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
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).
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
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 :
localhost
root
Je vous propose de tester les trois API suivantes (à sélectionner) :
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>
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
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
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(utilisateur) or 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()
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
Projet n°1 Sondage en ligne
Par exemple :
Quelle est votre équipe de football préférée ?
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.
Contenu sous licence CC BY-NC-SA 3.0
Fabrice Sincère ; version 1.5.5
Contacter l'auteur