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) " | ||
| + | } | ||
| + | } | ||
| + | </ | ||