📘

L’accès aux données

\\10.22.0.254

Mise en place


BP : pour l’instant on crée pas d’user, mais dans l’idée il faut.

Dans PhpStorm :

ℹ️
MySQL propose une base de données d’exemples : sakila.

Dans le dossier PHP :

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

  1. On crée une chaine de connexion (ou dsn) selon le SGBD utilisé
$dsn = 'mysql:host=localhost;dbname=unedb';
//par exemple, PostgreSQL : 'pgsql:host.....'
ℹ️
Il est possible de rajouter des options de connexion, comme l’encodage UTF-8 pour MySQL avec : $options = [PDO]::MYSQL_ATTR_INIT_COMMAND => “SET NAMES utf8”];.
  1. On utilise ensuite cette chaine de connexion pour se connecter, en créant une instance de PDO
$pdo = new PDO($dsn, 'root', "secretpassword");
  1. 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);
}
ℹ️
La méthode die() permet d’arrêter le traitement en cas d’erreur.

L’utilisation de requêtes

  1. On crée une variable pour stocker la requête dans une string
  1. 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 avec fetchAll() 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>';
}
ℹ️
On récupère un tableau associatif et indexé : on peut donc lire les valeurs soit avec le libellé soit avec l’index, çàd avec le nom ou la position de la colonne.
BP : Il est recommandé d’utiliser le nom de la colonne pour une meilleure lisibilité.
  1. 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.

  1. On crée une variable pour stocker la requête dans une string, avec des paramètres ?
  1. On utilise la méthode prepare() sur la requête
  1. On associe chaque paramètre à une valeur avec bindValue(numero, $varSaisie)
  1. On exécute la requête ainsi complète avec execute()
  1. 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"];

Outils : DVWA (Damn Vulnerable Web App) Security → une application (incluse dans le Linux des hacker, “Kali”)