PHP et les Bases de données - Généralités
Conception d’une base de données
Méthodes utilisées : MERISE, UML
Modèle conceptuel des données MCD, Modèle logique MLD, Modèle Physique MPD.
Ces aspects seront abordés plus tard dans le cours Bases de données
Création d’une base de données et d’une table
Utiliser PHPMYADMIN pour créer une table user : Id_user, Login, pass, statut a) Création de la base de données TCRT
b) Création de la table users
c) création des champs : id_users, login, pass, statut
d) modification du champ pass : remplacer VARCHAR par PASSWORD si on veut crypter le mot de passe. Sélectionner l’onglet INSERER pour remplir la table
e) Après validation
f) Affichage du contenu de la table users : onglet AFFICHER
Requête SQL pour créer la base de données tcrt CREATE DATABASE ‘tcrt’ ;
Requête SQL pour créer la table users dans la base de données tcrt CREATE TABLE IF NOT EXISTS `users` (
`id_user` int(11) NOT NULL auto_increment, `login` varchar(50) NOT NULL,
`pass` varchar(60) NOT NULL, `statut` enum('a','u') NOT NULL, PRIMARY KEY (`id_user`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
Requête SQL pour insérer le contenu dans la table users dans la base de données tcrt
INSERT INTO `users` (`id_user`, `login`, `pass`, `statut`) VALUES (1, 'admin', '*63D85DCA15EAFFC58C908FD2FAE50CCBC60C4EA2', 'a'), (2, 'bob', '*63D85DCA15EAFFC58C908FD2FAE50CCBC60C4EA2', 'u');
Requête SQL pour extraire le contenu de la table users Select * from ‘users’ ;
Utiliser la ligne de commandes pour gérer les bases de données
C:\xampp\mysql\bin>mysql -u root connexion en tant que user root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.0.51a Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>use tcrt sélection de la base tcrt
mysql>show tables affichage des tables de la base
tcrt
mysql>select * from users ; affichage du contenu de la table users
mysql> ? liste des commandes disponibles
mysql>quit sortie de MySQL
Utilisation de MySQL avec PHP
Connexion à Mysql en PHP sur la base tcrt : connexion.php
<?php //variables
$serveur_db = "localhost"; serveur MySQL
$user_db = "root"; utilisateur MySQL par défaut(admin)
$pass_db = ""; mot de passe de root par défaut
$base_db = "tcrt"; choix de la base de donnée
//1- connection au serveur Mysql
$con = mysql_connect($serveur_db, $user_db, $pass_db);
if(!$con){
echo 'Echec serveur Contactez le Webmaster';
exit();
}
//2- choix de la base
$db = mysql_select_db($base_db)
or die('Echec base Contactez le Webmaster');
?>
Exploitation de la base de donées tcrt, requêtes sur la table users : bdd.php
<?php
require_once('connexion.php');
$query='select * from users';
$result=mysql_query($query);
if (mysql_num_rows($result) > 0){
echo '<table>';
while($row=mysql_fetch_assoc($result)){
echo '<tr>';
foreach ($row as $key=>$value){
echo '<td>'.$value.'</td>';
}
echo '</tr>';
}
echo '</table>';
} else {
echo '<h1>erreur</h1>';
}
?>
EXEMPLE
Base de données : TCRT Table :Users
CREATE TABLE IF NOT EXISTS `users` ( `id_user` int(11) NOT NULL auto_increment, `login` varchar(50) NOT NULL,
`pass` varchar(80) NOT NULL, `statut` enum('a','u') NOT NULL, PRIMARY KEY (`id_user`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; --
-- Contenu de la table `users`
--
INSERT INTO `users` (`id_user`, `login`, `pass`, `statut`) VALUES (1, 'admin', '*63D85DCA15EAFFC58C908FD2FAE50CCBC60C4EA2', 'a'), (2, 'bob', '*63D85DCA15EAFFC58C908FD2FAE50CCBC60C4EA2', 'u'), (3, 'bill', '*63D85DCA15EAFFC58C908FD2FAE50CCBC60C4EA2', 'u');
Connexion.php
<?php //variables
$serveur_db = "localhost";
$user_db = "root";
$pass_db = "";
$base_db = "tcrt";
//1- connexion au serveur //**************************
$con = mysql_connect($serveur_db, $user_db, $pass_db);
if(!$con){
echo 'Echec serveur Contactez le Webmaster';
exit();
}
//2- choix de la base //**************************
$db = mysql_select_db($base_db)
or die('Echec base Contactez le Webmaster');
?>
Bd.php
<?php
require_once('connexion.php');
$query="select * from users";
$result=mysql_query($query);
if (mysql_num_rows($result) > 0){
echo '<table border=1>';
while($row=mysql_fetch_assoc($result)){
echo "<pre>";
print_r($row);
echo '<tr>';
foreach ($row as $key=>$value){
echo '<td>'.$value.'</td>';
}
echo '</tr>';
}
echo '</table>';
} else {
echo '<h1>erreur</h1>';
}
?>
Gestion des
utilisateurs de MySQL
Pour se connecter sur un serveur MySQL, il faut fournir un compte utilisateur existant dans la base de comptes. Par défaut le compte existant est root, sans mot de passe. C’est l’administrateur.
Pour des questions de sécurité, il est préférable de créer un compte utilisateur en lui affectant des droits(privilèges) sur les base et les tables.
Privilèges utilisateurs
Tables mysql.user, mysql.db, mysql.tables_priv, mysql.columns_priv
Si on affecte les privilèges ON *.* : Y sera écrit dans la table USER
Si on affecte les privilèges ON base.* : Y écrit dans DB
Si on affecte les privilèges ON base.table : Y écrit dans TABLES_PRIV
Si on affecte les privilèges ON base.table + (champs) : Y écrit dans COLUMNS_PRIV
Attribution des privilèges en ligne de commande
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
[REQUIRE NONE |
[{SSL| X509}]
[CIPHER 'cipher' [AND]]
[ISSUER 'issuer' [AND]]
[SUBJECT 'subject']]
[WITH with_option [with_option] ...]
Connexion à mysql :
mysql –u <user> -p -h <hostname|hostaddres>
Un user est caractérisé par : nom, mot de passe, host.
Lorsqu’on crée le user on crée également le host sur lequel il se connecte : localhost, adresseip, nom dns .
Cette information est écrite dans la table user.
Cas particulier : localhost ne met pas en jeu le protocole TCP/IP, mais les named pipes.
Lors de la connexion, on peut préciser –h suivi du nom du serveur MySQL.
mysql> grant select ON *.* to 'bob'@'192.160.0.%' identified by 'toto';
Ici bob peut se connecter avec le mot de passe toto à partir du sous-réseau 192.168.0.0 avec le privilège SELECT sur toutes les bases et toutes les tables
Contenu de la table mysql.user
Root équivalent à partir de n’importe quel host:
mysql> grant all on *.* to 'admin'@'%' identified by ‘toto' with grant
option;
Connexion sécurisée et gestion des sessions
Index.php
<?php
$erreur = isset($_GET['erreur']) ? $_GET['erreur'] : "" ;
?>
<html>
<head><title>Identification</title>
<style type="text/css">
</style>
</head>
<body>
<form action="login.php" method="post">
<table border="1" align="center" cellpadding="3" cellspacing="0">
<tr><th colspan="2">Authentification</th></tr>
<tr>
<th >Login : </th>
<td><input name="login" type="text" id="login" value="" /></td>
</tr>
<tr>
<th >Mot de passe : </th>
<td><input name="pass" type="password" id="pass" value="" /></td>
</tr>
<tr>
<td colspan="2"><?php switch ($erreur) { case 1:
echo "<center><font color='red'>Login ou mot de passe incorrect</font></center>";
break;
case 2:
echo "<center><font color='red'>Veuillez vous connecter d'abord !</font></center>";
break;
default:
break;
}
?>
</td>
</tr>
<tr>
<th colspan="2" >
<input type="submit" name="Submit" value="Envoyer" /></th>
</tr>
</table>
</form>
</body>
</html>
Login.php
<?php
require_once('connexion.php');
$login = isset($_POST['login']) ? $_POST['login'] : "" ;
$pass = isset($_POST['pass']) ? $_POST['pass'] : "";
$query = "select * from users where login='$login' and pass=PASSWORD('$pass') ";
$result = mysql_query($query);
if (mysql_num_rows($result) > 0){
$tmp = mysql_fetch_assoc($result);
mysql_close();
//cookie
/*setcookie("login", $login, time()+(4*3600));
setcookie("pass", $pass, time()+(4*3600));*/
//session
session_start();
$_SESSION['login']='ok';
$_SESSION['id_user']=$tmp['id_user'];
$_SESSION['statut']=$tmp['statut'];
$_SESSION['nom']=$tmp['login'];
header('location: accueil.php');
} else { //echec
header('location: index.php?erreur=1');
exit();
}
?>
Accueil.php
<?php
include('sessionverif.php');
//reception de variables, chargement d'un en-tête include('header.php');
include ('footer.php');
?>
Sessionverif.php
<?php
//vérification si session en cours session_start();
if(!isset($_SESSION['login']) OR $_SESSION['login']!='ok'){
header("Location: index.php?erreur=2");
exit();
}
?>
Header.php
<?php
login|s:2:"ok";id_user|s:1:"2";statut|s:1:"u";nom|s :3:"bob";5:"admin";
C:\xampp\tm p
$statut = isset($_SESSION['statut']) ? $_SESSION['statut'] : "";
?>
<html>
<head>
<title>Bienvenue</title>
<style type="text/css" media="all">
#lignemenu{
float:left;
background-color:blue;
width:100%;
color:white;
}
#lignemenu .droite{
float:right;
text-align:right;
margin-right:10px;
font-family:"Trebuchet MS";
}
#lignemenu .gauche{
float:left;
text-align:center;
font-family:"Trebuchet MS";
text-decoration:none;
color:white;
margin-left:30px;
} a {
color:white;
text-decoration:none;
}
#lienbandeau{
text-decoration:none;
color:yellow;
}
#bandeau img{
width:100%;
}
body {
margin-left: 0px;
margin-top: 0px;
margin-right:0px;
}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"></head>
<body>
<div id="bandeau" ><img src="bandeau.jpg"></div>
<div id="lignemenu">
<div class="droite">
<?php echo $_SESSION['nom'].' connecté. session id : '.session_id().' - <a id="lienbandeau" href="finsession.php">Déconnexion</a>';
?>
</div>
<div class="gauche">
<?php
switch($statut) { case "a" :
include('menuadmin.php');
break;
case "u" :
include('menu.php');
break;
}
?>
</div>
</div>
Menu.php
<a href="accueil.php" >Accueil</a> ||
<a href="productList.php" >Catalogue</a> ||
<a href="sessionView.php" >Voir mon Panier</a> ||
<a href="commandeView.php" >Voir mes commandes</a>
Menuadmin.php
<a href="accueil.php" >Accueil</a> ||
<a href="productList.php" >Catalogue</a> ||
<a href="ajoutproduits.php" >Ajout de Produit</a> ||
<a href="sessionView.php" >Voir mon Panier</a> ||
<a href="commandeView.php" >Voir mes commandes</a>
Footer.php
</body>
</html>