
L’accès aux données
\\10.22.0.254
Mise en place
- Installation du SGBD voulu (ici, MySQL Server 8.0.32)
On obtient MySQL Workbench (équivaut à SSMS et pgAdmin)
—> on s’en sert pas parce qu’on peut accéder directement à nos DB grâce à PhpStorm
BP : pour l’instant on crée pas d’user, mais dans l’idée il faut.
Dans PhpStorm :
- Connexion au SGBD :
onglet database > + > Data source > MySQL
avec user = root ; password = notre joli mot de passe > test connection
- Il propose de télécharger les drivers > OK
- SQL dialect > “mysql”
Dans le dossier PHP :
- On met à jour selon nos besoins le php.ini
ex pour MySQL : on ouvre le php.init-development > on le copie-colle et renomme ‘php.ini’ > ligne 939 on décommente l’extension pdo_mysql + ligne 763 on décommente l’indication du dossier où trouver les extensions (ext)
- On rédemarre l’IDE
Pour faire des requêtes SQL, clique-droit sur localhost > new > query console.
// Une base de donnees avec une table et une donnees inseree
CREATE DATABASE unedb;
// soit je precise la table avec use
// soit je la nomme dans le create table
CREATE TABLE unedb.utilisateurs (
id int primary key auto_increment,
nom varchar(255) not null,
prenom varchar(255) not null
);
INSERT INTO unedb.utilisateurs (nom, prenom)
VALUES ('un nom', 'un prénom');PDO
Php Data Object : une classe PHP qui permet de se connecter à n’importe quelle base de données (sur n’importe quel SGBD).
La connexion avec PDO
- On crée une chaine de connexion (ou dsn) selon le SGBD utilisé
$dsn = 'mysql:host=localhost;dbname=unedb';
//par exemple, PostgreSQL : 'pgsql:host.....'$options = [PDO]::MYSQL_ATTR_INIT_COMMAND => “SET NAMES utf8”];.- On utilise ensuite cette chaine de connexion pour se connecter, en créant une instance de PDO
$pdo = new PDO($dsn, 'root', "secretpassword");- Pour gérer les exceptions éventuelles lors de la connexion à la base de données, on met tout ça dans un try..catch (toujours)
try {
$dsn = 'mysql:host=localhost;dbname=unedb';
$pdo = new PDO($dsn, 'unUtilisateur', "sonsecretpassword");
echo 'Connexion OK';
} catch (PDOException $e) {
$msg = 'Connexion KO : '.$e->$getMessage();
die($msg);
}die() permet d’arrêter le traitement en cas d’erreur.
L’utilisation de requêtes
- On crée une variable pour stocker la requête dans une string
- Pour les SELECT : on utilise la méthode query() de PDO sur la requête et on récupère le résultat avec
fetch()pour une seule ligne (dans un tableau PHP) ou avecfetchAll()pour plusieurs lignes (dans un tableau de tableaux)
$req = 'SELECT nom, prenom FROM unedb.utilisateurs';
$res = $pdo->query($req)->fetchAll();
var_dump($res);
for ($i=0; $i<count($res); $i++) {
echo 'Les nom et prénom sont : '.$res[$i]["nom"].' '.$res[$i]["prenom"].'.<br>';
}BP : Il est recommandé d’utiliser le nom de la colonne pour une meilleure lisibilité.
- Pour les INSERT, UPDATE, DELETE : on utilise la méthode exec() sur la requête et on récupère le nombre de lignes affectée
$req = 'INSERT INTO unedb.utilisateurs (nom, prenom) VALUES ("Daly","Ruby");';
$nbLignes = $pdo->exec($req);
var_dump($res);
echo 'Nombre de lignes affectées : '.$nbLignes.'<br>';
Les injections SQL
Pour empêcher que la saisie utilisateur ne soit interprétée comme du code, on utilise des requêtes préparées (ou paramétrées).
Au lieu de passer des variables directement dans la requête, on insère des ? puis on associe des valeur à ces “trous” à partir des saisies.
- On crée une variable pour stocker la requête dans une string, avec des paramètres
?
- On utilise la méthode
prepare()sur la requête
- On associe chaque paramètre à une valeur avec
bindValue(numero, $varSaisie)
- On exécute la requête ainsi complète avec
execute()
- On récupère les données selon le type de requête (SELECT ou INSERT, UPDATE, DELETE)
$req = 'SELECT nom, prenom FROM unedb.utilisateurs WHERE prenom=?;';
$prep = pdo->prepare($req);
$prep->bindValue(1,$prenomSaisi);
$prep->execute();
$res = $prep->fetch();
var_dump($res);
echo "Le nom associé au prénom demandé est : ".$res["nom"];