©A. Belaïd
n C’est quoi une base de données ?
– Une base de données contient une ou plusieurs tables, chaque table ayant un ou plusieurs enregistrements n Exemple de table :
– est rendue possible grâce à un Système de Gestion de Base de Données (S.G.B.D) – Il a pour rôle de :
• manipuler, compléter, mettre à jour les données dans les tables
• et de pouvoir les interroger via des requêtes, par le langage SQL (Structured Query Language : Langage de requêtes structurées)
– Il existe plusieurs S.G.B.D., certains gratuits, d'autres payants : pour les gratuits, on trouve MySQL
n Les champs d’une table de base de données
– correspondent à une des variables qui composent un enregistrement, par exemple "PRENOM"
– sont caractérisés par une nature, ils permettent, pour certains, d'identifier avec précision une valeur ou un groupe de valeurs – le champ peut être de plusieurs types, pour les 3 principaux : • texte, valeur numérique ou valeur binaire
n Les champs d’une table de base de données
• Int : de -2 147 483 648 à 2 147 483 647
• En mettant l'attribut UNSIGNED, on stocke de 0 à 4 294 967 295 (on ne se préoccupe plus du signe avec le paramètre UNSIGNED)
• Il existe INT, TINYINT, BIGINT, DOUBLE qui peuvent contenir des nombres plus ou moins grands • Pour les réels : FLOAT
• VARCHAR pour stocker au plus 255 caractères
• TEXT peut stocker 65535 caractères
• LONGTEXT : 4 294 967 295 (2^32 -1) caractères
• ENUM : présente une énumération. Par exemple,
ENUM('rouge', 'bleu', 'vert') assurera que la valeur du champ sera l'une des 3 de la liste
• DATE permet d'effectuer des opérations sur les dates dans les requêtes, plutôt que de stocker la date sous forme de texte
• On peut stocker des images, ou encore des fichiers complets dans une base de données : en les encodant dans un champ de type BLOB (binaire) par exemple
• La clé primaire est une propriété d'un des champs pour différencier des enregistrements identiques
• Exemple d’ambiguïté :
• Pour distinguer les deux enregistrements de "Benjamin", on attribue un numéro à chaque individu, généralement appelé "identifiant" et abrégé sous la forme "id" (ou "ID") v Cet identifiant sera "auto incrémenté"
– Attention
• Toutes les valeurs des clés doivent être uniques : il ne doit pas, pour une même table, y avoir 2 valeurs égales de clés primaires
• On peut demander à voir le contact dont l'ID est 2 ou 3, on a bien 2 personnes distinctes
• La clé étrangère est un champ dans une table qui est clé primaire dans une autre table
• Pour l’exemple, on peut très bien spécifier que ID_PAYS est une clé étrangère liée au champ ID de la table pays
• L'existence d'une clé étrangère dans les S.G.B.D.R.
permet de mettre à jour des enregistrements en cascade, par exemple, supposons que j'efface le pays "France", je dois supprimer tous les contacts qui y vivent (puisqu'ils ne seront alors rattachés à aucun pays)
– L’administration peut se faire de deux manières
• par PHP (voir plus loin)
• Manuellement, par l’interface phpMyAdmin d’EasyPhp – L’interface phpMyAdmin
• Pour y accéder :
v Cliquer sur le bouton droit de la souris en le mettant sur le symbole d’Easyphp puis appuyer sur Administration
v Ensuite, appuyer sur mysql Administration
n On obtient
La base mysql et Les bases existantes Informations générales sur le
ses tables gestionnaire phpMyAdmin
n En cliquant sur Databases : on obtient les bases enregistrées
– On peut cocher et supprimer une base par Drop
– On peut créer une nouvelle base
n En cliquant sur la base mySql, on obtient ses tables
– On peut supprimer une table en cochant et supprimant
– On peut créer une nouvelle table
n Retour sur la création d’une base : 2 méthodes
– Commençons par créer une base de données : ma-base
• Laissez le type en Interclassement par défaut
• ma-base(0) indique que la base contient 0 table
• Regardez le code SQL qui s’affiche
Création d’une base personnelle
n Création d’une table
– Créer dans ma-base, la table « contacts » suivante avec ses 5 champs:
– Cette action conduit à afficher le premier enregistrement de la table contacts avec les 5 champs en attente
n Les champs
• ne peut pas être nul, ni comporter de caractères accentués, espaces, -, . par contre, il accepte _
– Le type de champ est sélectionné dans une liste de choix
• pour l'instant, sélectionner VARCHAR qui correspond à du texte
– La taille/valeurs
• permet de déterminer la taille max des données à rentrer dans les champs
– Interclassement
• représente le jeu de caractères par défaut si vous ne sélectionnez rien (préférable)
• sinon sélectionner Latin1_swedish_ci. Si le jeu de caractères n'est pas démarré dans phpMyAdmin, une erreur est produite
– L'attribut peut-être rien, unsigned ou Unsigned zerofill
• les 2 dernières valeurs s'utilisent uniquement pour des types de champs spéciaux
– Null permet de dire si le champ peut-être null (vide) ou non
– Default permet de donner une valeur par défaut au champ
– permet de déterminer si le champ est ou non une clé primaire
• dans ce cas, la valeur du champ sera unique dans la table
• aucun enregistrement n'aura la même valeur dans ce champ
– index indique que le champ peut être utilisé comme une valeur de repérage (index)
• permet d'augmenter les vitesses de traitement (tri) dans la table
• la clé primaire est également un index
– unique permet de spécifier que le contenu est unique dans l'ensemble du champ
• évite les doublons
– permettent d'indexer des textes complets
• cette possibilité ralentit la table pour de longs champs
n Création de champs
– Créez 5 champs de type VARCHAR (caractères de taille variables)
• code, de taille 10, non null et unique
• titre, de taille 30, non null et unique
– N'oubliez pas de sauvegarder la table
n On obtient
n Appuyer sur Browse pour voir les enregistrements
– Syntaxe
CREATE table nomdetable( nomattribut1 type[not null][AUTO_INCREMENT] nomattribut2 type[not null]
…
nomattributN type[not null]
…
primary key (nomattribut1, ,nomattributN)
;
– Auto_increment : l'entier sera augmenté de 1 à chaque nouvelle insertion
– Une fois créée, on peut la modifier en utilisant ALTER TABLE et ADD
– on peut la modifier en utilisant ALTER TABLE et DROP
n D’ailleurs, en voulant supprimer directement le champ, en cliquant sur la croix, voici ce qui s’affiche :
– On peut la supprimer totalement par :
• DROP TABLE clients_tbl
– INSERT INTO
clients_tbl(id,prenom,nom,ne_le,ville,enfants)
n Insertion d’enregistrements : de manière générale
– Syntaxe
• INSERT INTO votre_table (nomattribut1, ,nomattributN) values ('valeur1', ,'valeurN');
– Les attributs qui ne sont pas mentionnés prendront leur valeur par défaut
– Exemple
• Soit la table Client-tbl (Id,nom,prenom,adresse) créée par :
create table Client (
id tinyint(3) unsigned not null AUTO_INCREMENT, nom varchar(10) not null default '', prenom varchar(10) not null default '', adresse varchar(50) not null default '', primary key (id)
– Remarque
• La clef ID possède l'option auto_increment, les ID vont ainsi être créés automatiquement
• Complétez la table ainsi :
– affichez uniquement les personnes qui n'ont que 2 enfants, la requête SQL sera :
SELECT*FROMclients_tblWHEREenfants=‘2’
– demander l'affichage que des noms et prénoms :
SELECTnom,prenomFROMclients_tblWHERE enfants='2'
– Sélection combinée :
• SELECT*FROMclients_tblWHERE enfants='1'ORenfants='2'ANDville='Paris'
– Autres formes de sélection
– UPDATE clients_tbl SET prenom='Jacques' WHERE id=1
– UPDATE clients_tbl SET prenom='Jean-Pierre', nom='Papin', ville='Marseille', enfants=3 WHERE id=1
DELETE FROM clients_tbl WHERE id=1 – supprime des enregistrements
n Jointure de tables – Soient les deux tables :
SELECT * FROM Livres, Genres WHERE
SELECT Titre, Livres.CodeGenre, LibelleGenre, Prix FROM Livres, Genres WHERE Livres.CodeGenre =
– Ne touchez pas au mot de passe,
– N’essayez pas de le changer – Le mot de passe à utiliser est "mysql" n Dans , enlever les ; avant :
– Principale nouveauté de PHP
– C’est en quelque sorte un langage orienté objet pour traiter les bases de données
– L’approche PDO permet d’étendre les fonctions d’accès à la base facilement et de manière transparente
– L’utilisation de la BD avec PHP se fait en 5 étapes
• Connexion
• Sélection de la BD
• Requête
• Exploitation des résultats
• Fermeture de la connexion
– Structure des classes de PDO
• PDO propose 3 classes
v PDO : lien à la BD
v PDOStatement : requêtes et leurs résultats
n Connexion au serveur de données
– La première étape consiste à déclarer les variables qui vont permettre la connexion à la base de données (ce sont les paramètres des fonctions de connexion à la base) – Ces variables sont :
• $user : le nom d'utilisateur
• $passwd : le mot de passe
• $host : l'hôte (ordinateur sur lequel le SGBD est installé)
• $bdd : le nom de la base de données
– La deuxième étape est de construire la DSN (Data Source
Name)
$dsn = 'mysql:host=localhost;dbname=ma-base';
– Enfin, la connexion se fait par la création d’un objet de la classe PDO
• $dbh= new PDO($dsn, $user, $pass);
– Il ne faut pas oublier de fermer la base
• $dbh=null;
n
<?php
$user = 'root';
$pass = 'mysql';
// Data Source Name
$dsn = 'mysql:host=localhost;dbname=ma-base';
try{ //tentative de connexion : on crée un objet de la classe PDO
$dbh= new PDO($dsn, $user, $pass);
//S'il y a des erreurs de connexion, un objet PDOException est // lancé. Vous pouvez attraper cette exception si vous voulez // gérer cette erreur } catch (PDOException $e){
print "Erreur ! :" . $e->getMessage() . "<br/>"; die(); }
?>
– Une fois la connexion ouverte, on va pouvoir utiliser la BD pour lire, modifier…
– Pour cela, on utilise le langage SQL
– On peut utiliser deux méthodes de la classe PDO
• query() pour la sélection
• exec() pour la mise à jour
– On utilise la méthode query()
– Il faut donc aller les chercher et les afficher
– La méthode fetchAll() retourne l’ensemble des données sous forme d’un tableau PHP et libère le SGBD
– La méthode fetc() permet une lecture séquentielle du résultat
– Le paramètre fetch_style détermine la façon dont PDO retourne les résultats (format des résultats)
n Exemple 0 :
– Créer une table :
<?php
//Inclusion du fichier contenant la connexion à la base include_once('');
//Création de la table personne
$sql="CREATE TABLE personne ( id_personne INTEGER PRIMARY KEY , nom VARCHAR( 20 ) NOT NULL , prenom VARCHAR( 20 ) ,
depart INTEGER( 2 ))";
$sth = $dbh->query($sql);
//création de la table sport
$sql="CREATE TABLE sport ( id_sport INTEGER PRIMARY KEY ,
design VARCHAR( 30 ) UNIQUE NOT NULL)";
$sth = $dbh->query($sql);
//création de la table pratique
$sql="CREATE TABLE pratique ( id_personne INTEGER NOT NULL , id_sport INTEGER NOT NULL , niveau TINYINT,
PRIMARY KEY (id_personne,id_sport))";
$sth = $dbh->query($sql);
$dbh=NULL;
?>
n Exemple 1 :
– Lire tous les enregistrements :
<?php
//Inclusion du fichier contenant la connexion à la base include_once('');
//La requête SQL
$sql = "SELECT * FROM `infos_tbl` LIMIT 0 , 30";
//Recherche des données
$sth = $dbh->query($sql);
// On voudrait les résultats sous la forme d’un tableau associatif
$result = $sth->fetchAll(PDO::FETCH_ASSOC);
//Affichage des résultats foreach ($result as $row){ echo $row['nom'];echo '-'; echo $row['prenom'];echo '-';
echo $row['email'];echo '<br/>';
}
$dbh=NULL;
?>
– Table : infos_tbl
– Résultats
Maquin-Frédé
– Deux manières :
• Créer une requête spécifique en utilisant la fonction count() de MySql
• Compter le nombre d’éléments contenus dans le tableau renvoyé par la méthode fetchAll()
<?php
include_once('');
//1) En utilisant une requête particulière
$sql = "SELECT COUNT(*) as nbe FROM `infos_tbl` WHERE nom='Belaid'";
$sth = $dbh->query($sql);
$result = $sth->fetchAll(); $nombre = $result[0]['nbe']; echo $nombre; echo "<br/>";
//2) En comptant le nombre d'éléments présents dans le tableau des résultats
$sql = "SELECT nom, prenom FROM `infos_tbl` WHERE nom='Belaid'";
$sth = $dbh->query($sql);
$result = $sth->fetchAll(); $nombre = count($result); echo $nombre;
$dbh=NULL;
?>
– On utilise la méthode exec() de la classe PDO
– Exemple :
<?php
//Inclusion du fichier contenant la connexion à la base include_once('');
//Insertion d'un enregistrement
$sql = "INSERT INTO infos_tbl
(id,nom,prenom,email,icq,titre,url) VALUES ('', 'Ouwayed',
'Nazih', '', '' , 'Thésard', '')";
//Exécution de la requête
$dbh->exec($sql);
$dbh=NULL;
?>
– exec() retourne le nombre de lignes modifiées, 0 si aucune et FALSE si erreur de requête
n Gestion des erreurs
– Les erreurs sont stockées et consultables en faisant appel aux méthodes errorCode() et errorInfo()
– Exemple :
<?php
//Inclusion du fichier contenant la connexion à la base include_once('');
//Insertion d'un enregistrement
$sql = ""; if(!$dbh->exec($sql)){ echo $dbh->errorCode() . "<br>"; echo $dbh->errorInfo(); print_r($info);
//$info[0]==$dbh->errrCode() Code d'erreur unifié
//$info[1] Code d'erreur spécifique au driver
}
$dbh=NULL;
?>
– Utiliser les exceptions :
<?php
//Inclusion du fichier contenant la connexion à la base include_once('');
//On définit le handler d'erreur
$dbh->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION); try {
$sql = "INSERT INTO infos_tbl VALUES ('', 'Ouwayed', 'Nazih',
'', '' , 'Thésard', '')"; $dbh->exec($sql);
//si une erreur a eu lieu, une exception est lancée
}catch (PDOException $e){
print "Erreur ! :" . $e->getMessage() ; "<br/>";
}
$dbh=NULL;
?>
n Énoncé
– On veut créer un site HTML qui contrôle la connexion
– Le contrôle se fait par l’affichage d’un formulaire permettant de rentrer :
• Le nom d’identifiant
• Un mot de passe
– Le formulaire indique également si :
• on a oublié son mot de passe (et qu’on demande de le retrouver)
v en indiquant son email
• on veut s’inscrire au site, dans ce cas, on demande d’entrer
v son identifiant
v son de mot de passe
v une confirmation du mot de passe
v âge, sexe, profession, affiliation, ville, pays
• où âge, sexe et affiliation ne sont pas obligatoires
– Le contrôle :
• Un premier contrôle en local permet de valider ou non la saisie des champs (vides, comportant ou non des caractères spécifiques comme le @ pour le email)
• Un contrôle plus poussé consiste à aller vérifier dans la base de données "abonnés" (MySQl)
– L’inscription au site
• doit conduire au rangement de l’identifiant et du mot de passe dans la base "abonnés"