Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
web:php:chap6 [2023/11/08 15:24] – supprimée - modification externe (Unknown date) 127.0.0.1 | web:php:chap6 [2024/04/08 07:21] (Version actuelle) – jcheron | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== Chapitre 6 : Accès aux bases de données (sans framework) ====== | ||
+ | |||
+ | PDO : PHP Data Objects\\ | ||
+ | |||
+ | ===== - Caractéristiques ===== | ||
+ | |||
+ | |||
+ | * Depuis PHP 5 | ||
+ | * Orienté objet | ||
+ | * Interface commune à de multiples bases de données (+ de 10), via un driver spécifié dans le DSN | ||
+ | |||
+ | ===== -- Rappels SQL ===== | ||
+ | * [[sio: | ||
+ | * Référence aux types de champs | ||
+ | * Protection des noms des objets : **SELECT * FROM `nomTable`** | ||
+ | |||
+ | ===== -- Connexion ===== | ||
+ | |||
+ | ==== -- Exemple de connexion ==== | ||
+ | |||
+ | <sxh php> | ||
+ | <?php | ||
+ | $dbo = new PDO(' | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | ==== -- DSN ==== | ||
+ | Data Source Name : chaîne définissant les paramètres de connexion à une base | ||
+ | |||
+ | |||
+ | ^BDD ^DSN ^ | ||
+ | |**Mysql** | mysql: | ||
+ | |**PostgreSQL** | pgsql: | ||
+ | |**Oracle** | oci: | ||
+ | |||
+ | |||
+ | ==== -- Gestion des erreurs ==== | ||
+ | |||
+ | <sxh php> | ||
+ | <?php | ||
+ | try { | ||
+ | $dbo = new PDO(' | ||
+ | $dbo-> | ||
+ | |||
+ | } catch (PDOException $e) { | ||
+ | print " | ||
+ | die(); | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | ==== -- Paramètres divers ==== | ||
+ | |||
+ | === -- Port par défaut du serveur === | ||
+ | <sxh php> | ||
+ | <?php | ||
+ | $dbo = new PDO(' | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | === -- Définition de l' | ||
+ | |||
+ | <sxh php> | ||
+ | <?php | ||
+ | $dbo = new PDO(' | ||
+ | $dbo-> | ||
+ | |||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | ou | ||
+ | |||
+ | <sxh php> | ||
+ | <?php | ||
+ | $dbo=new PDO(" | ||
+ | ?> | ||
+ | </ | ||
+ | ===== -- Interrogation de données ===== | ||
+ | |||
+ | **PDO:: | ||
+ | qu'il est ensuite possible de parcourir avec un foreach (retourne false en cas d’échec): | ||
+ | |||
+ | <sxh php> | ||
+ | <?php | ||
+ | $sql = ' | ||
+ | $statement=$dbo-> | ||
+ | foreach | ||
+ | print $row[' | ||
+ | print $row[' | ||
+ | print $row[' | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | |||
+ | Produit le résultat : | ||
+ | |||
+ | < | ||
+ | apple | ||
+ | banana | ||
+ | kiwi brown 75 | ||
+ | lemon | ||
+ | orange | ||
+ | pear green 150 | ||
+ | watermelon | ||
+ | </ | ||
+ | |||
+ | |||
+ | <sxh php> | ||
+ | <?php | ||
+ | $sql = ' | ||
+ | $statement=$dbo-> | ||
+ | foreach | ||
+ | print $row[' | ||
+ | print $row[' | ||
+ | } | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | |||
+ | Produit le résultat : | ||
+ | |||
+ | < | ||
+ | apple | ||
+ | banana | ||
+ | orange | ||
+ | pear green 150 | ||
+ | </ | ||
+ | ===== -- Mise à jour de données ===== | ||
+ | |||
+ | A la différence des instructions de sélection, la mise à jour ne retourne pas de jeu d' | ||
+ | |||
+ | **PDO:: | ||
+ | <sxh php> | ||
+ | <?php | ||
+ | $dbo = new PDO(' | ||
+ | |||
+ | /* Effacement de toutes les lignes de la table FRUIT dont la couleur est rouge*/ | ||
+ | $count = $dbo-> | ||
+ | |||
+ | /* Retourne le nombre de lignes effacées */ | ||
+ | print(" | ||
+ | print(" | ||
+ | ?> | ||
+ | |||
+ | </ | ||
+ | L' | ||
+ | < | ||
+ | Retourne le nombre de lignes effacées : | ||
+ | Effacement de 2 lignes. | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== -- Injections SQL ==== | ||
+ | |||
+ | Consiste à modifier une instruction SQL existante, de façon malveillante (pour suppression de données, acquisition de droits, visualisation de données...) | ||
+ | |||
+ | **Exemple :** | ||
+ | |||
+ | URL **afficheClient.php? | ||
+ | |||
+ | <sxh php; | ||
+ | <?php | ||
+ | $id = $_GET[" | ||
+ | $query | ||
+ | $result = $dbo-> | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | exemple d' | ||
+ | < | ||
+ | 1;DELETE FROM clients WHERE 1=1 | ||
+ | </ | ||
+ | |||
+ | via l'URL **afficheClient.php? | ||
+ | |||
+ | **Conséquence :** Suppression de toutes les données de la table client | ||
+ | |||
+ | |||
+ | ==== -- Solutions pour éviter les injections SQL ==== | ||
+ | |||
+ | - Se connecter à la BDD avec un utilisateur ayant des droits limités. | ||
+ | - Vérifiez que les données ont bien le type attendu. Utiliser | ||
+ | - Utiliser des requêtes paramétrées | ||
+ | |||
+ | Version corrigée avec **sprintf** de la requête précédente : | ||
+ | |||
+ | <sxh php> | ||
+ | <?php | ||
+ | $id = $_GET[" | ||
+ | $query | ||
+ | $result = $dbo-> | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | ===== -- Requêtes paramétrées ===== | ||
+ | |||
+ | ==== Avantages ==== | ||
+ | * Anti-injection | ||
+ | * Réutilisation | ||
+ | |||
+ | ==== -- Préparation ==== | ||
+ | **PDOStatement PDO:: | ||
+ | |||
+ | Prépare une requête SQL à être exécutée, et retourne un PDOStatement | ||
+ | |||
+ | <sxh php> | ||
+ | <?php | ||
+ | $sql = ' | ||
+ | $sta = $dbo-> | ||
+ | ?> | ||
+ | </ | ||
+ | ==== -- Affectation des valeurs ==== | ||
+ | |||
+ | === Avec paramètres nommés === | ||
+ | |||
+ | <sxh php> | ||
+ | <?php | ||
+ | | ||
+ | | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | ==== -- Exécution ==== | ||
+ | |||
+ | <sxh php> | ||
+ | <?php | ||
+ | | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | === Version avec paramètres fictifs === | ||
+ | |||
+ | <sxh php> | ||
+ | <?php | ||
+ | | ||
+ | | ||
+ | $sta = $dbh-> | ||
+ | | ||
+ | | ||
+ | | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | ==== -- Récupération des enregistrements ==== | ||
+ | |||
+ | **PDOStatement:: | ||
+ | |||
+ | <sxh php> | ||
+ | <?php | ||
+ | | ||
+ | $sta = $dbo-> | ||
+ | $sta-> | ||
+ | | ||
+ | |||
+ | /* Récupération de toutes les lignes d'un jeu de résultats */ | ||
+ | | ||
+ | | ||
+ | | ||
+ | ?> | ||
+ | </ | ||
+ | |||
+ | |||
+ | === Classes/ | ||
+ | Utilisation de **PDO:: | ||
+ | <sxh php> | ||
+ | <?php | ||
+ | class Fruit { | ||
+ | public $name; | ||
+ | public $colour; | ||
+ | } | ||
+ | |||
+ | $sta = $dbo-> | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | ?> | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | Résultat : | ||
+ | |||
+ | < | ||
+ | array(3) { | ||
+ | [0]=> | ||
+ | object(fruit)# | ||
+ | [" | ||
+ | string(5) " | ||
+ | [" | ||
+ | string(5) " | ||
+ | } | ||
+ | [1]=> | ||
+ | object(fruit)# | ||
+ | [" | ||
+ | string(4) " | ||
+ | [" | ||
+ | string(6) " | ||
+ | } | ||
+ | [2]=> | ||
+ | object(fruit)# | ||
+ | [" | ||
+ | string(10) " | ||
+ | [" | ||
+ | string(4) " | ||
+ | } | ||
+ | } | ||
+ | </ | ||