– L’extension PDO –

On a vu dans le chapitre précédent comment attaquer une base de données à partir de PHP. Simplement, je vous ai montré l’accès aux bases de données de type MySQL. J’aurais pu vous montrer un chapitre sur PostgreSQL ou encore Oracle. Le souci majeur qu’on a ici est que ces méthodes sont spécifiques du SGBD utilisé (ici MySQL).

Pour remédier à cela, il existe une méthode objet très pratique, PDO (PHP Data Objects). Cet objet va appeler une base et requêter celle-ci indépendamment du système utilisé. Comment? Et bien en spécifiant dès l’appel à la base le SGBD utilisé.

Connexion au serveur

Exécution d’une requête

Récupération des résutats

Il existe une méthode pour récupérer les résultats d’une requête (de sélection je rappelle, pas besoin pour les requête d’insertion, modification, suppression), la méthode fetch(). Celle-ci peut prendre un paramètre pour spécifier la méthode de récupération (tableau ou objet).

Méthode fetch basique

Méthode fetch (objet)

Interrogation

Pour toute requête, on utilisera la méthode mysqli_query. Cele-ci retourne true pour les requêtes de création, modification, suppression réussies, ou un objet mysqli_result pour les requêtes de sélection. Une requête fausse (attention fausse veut dire que la syntaxe SQL est foireuse, pas qu’il n’y a pas de résultats), la méthode renverra false.

mysqli_query($str): prend pour paramètre une chaîne de caractères qui contient la requête écrite en SQL

Les requêtes préparées

Il est possible de d’exécuter une requête avec les placeholders. La requête peut contenir aucun à plusieurs paramètres nommées (:param) ou marqueurs (?) pour lesquels les valeurs réelles seront substituées lorsque la requête sera exécutée. Comme en Perl/DBI vous vous pouvez paramétrer votre requête afin de lui faire passer des arguments. Les paramètres sont envoyés dans un tableau array(), on peut spécifier ou pas les attributs à insérer. Le principe de fonctionnement reste strictement le même.

OK, mais quel est l’intérêt des requêtes préparées?

Elles permettent d’améliorer les performances en cas d’exécutions répétées. Elles permettent une protection automatique des valeurs des paramètres pour interdire les attaques par injection de code SQL.

Les injections SQL?

Les injections SQL sont le fait de tromper la sécurité d’une application par des requêtes trafiquées. Elles ont un effet destructeur sur de nombreuses applications

Statistiques de requêtes

Il est possible de savoir combien de lignes(enregistrements) ont été affectés par une requête de type d’insertion, modification, suppression.

rowCount(): retourne le nombre de lignes modifiées par la dernière requête INSERT, UPDATE ou DELETE ou SELECT

getColumnMeta(): retourne les noms des champs

columnCount(): compte le nombre de colonnes

rowCount()

columnCount() et getColumnMeta()

Récupération du dernier id ajouté

lastInsertId(): retourne la valeur de la clé du dernier élément inséré en base

Exemple complet

L’exemple suivant permet de lister les informations d’une table sans connaître les noms des attributs. Elle combine les méthodes vues précédemment.

méthode assoc

méthode objet