PHP Data Objects
Réponse AJAX

Présentation...

PDO (PHP Data Object) est une librairie de PHP. C'est un ensemble de 3 classes qui constitue une couche d'abstraction d'accès aux données.

Les trois classes sont les suivantes :

Par rapport à la librairie mysqli, qui reste plus performante pour accéder à des bases de données MySQL, PDO a l'avantage de :

La classe PDO : connexion à la base de données et préparation d'une requête SQL

Connexion à une base de données

La connexion à un serveur de données MySQL va se faire de la façon suivante :

Où évidemment il faut adapter les paramètres : mon_serveur, ma_bdd, mon_port, mon_identifiant, mon_mdp.

Adaptez cette connexion pour vous connecter à la base de données films sur le serveur du lycée (utilisateur : sio) et tapez ici la ligne correspondante :
Votre réponse n°1
Rajouter un var_dump sur l'objet $connexion et, en analysant le résultat du var_dump, notez ici la classe de cet objet :
Votre réponse n°2
Si vous vous trompez sur le mot de passe par exemple, quelle erreur obtenez-vous ?
Votre réponse n°3

Création d'une requête préparée

À la suite du code précédent, on va créer la requête préparée suivante, qui cherche des films selon leur titre. Le point d'interrogation (?) représente un emplaçement, dit ici anonyme, qui sera remplacé par les paramètres de la requête (on verra plus loin les emplacement nommés).

Rajouter un var_dump sur l'objet $sql et notez ici la classe de cet objet :
Votre réponse n°4
On dispose maintenant d'une requête préparée (c'est à dire compilée), que l'on va pouvoir appeler plusieurs fois avec différents paramètres pour le like. C'est ce qu'on va faire à l'étape suivante.

La classe PDOStatement

Associer un paramètre à la requête et l'exécuter

En ajoutant la ligne suivante à la fin de notre code, vous allez associer le mot-clé 'Paul%' à notre requête préparée et exécuter la requête :
Rajouter un var_dump sur l'objet $sql et notez ce qui a changé dans cet objet :
Votre réponse n°5

Effectivement, rien n'a changé en ce qui concerne la propriété publique de l'objet (queryString). Toutefois, la requête s'est bien exécutée et on dispose de plusieurs méthodes pour exploiter son résultat.

Pour analyser les résultats, on va commencer par un var_dump sur la méthode PDOStatement::fetchAll()

Rajouter à la fin de votre code : var_dump($sql->fetchAll());
Quelle est la nature du résultat obtenu ("la nature" = qu'est-ce que c'est, dans un langage non technique compréhensible par un gamin de 5 ans) ?
Votre réponse n°6
Techniquement (en termes PHP), et avec beaucoup de précisions, dites quel est le résultat obtenu :
Votre réponse n°7
Remplacez par : var_dump($sql->rowCount());
Quelle est la nature du résultat obtenu ?
Votre réponse n°8
Remplacez par : var_dump($sql->fetch()); (attention : il faut bien remplacer, car vous ne pouvez pas exécuter directement fetch() après fetchAll())
Quelle est la nature du résultat obtenu ?
Votre réponse n°9
Remplacez par : var_dump($sql->fetchObject()); (attention : il faut bien remplacer, car vous ne pouvez pas exécuter directement fetchObject() après fetchAll())
Quelle est la nature du résultat obtenu ?
Votre réponse n°10
Remplacez par : var_dump($sql->fetchColumn()); (attention : il faut bien remplacer, car vous ne pouvez pas exécuter directement fetchColumn() après fetchAll())
Quelle est la nature du résultat obtenu ?
Votre réponse n°11

Associer plusieurs emplacements à une requête et l'exécuter

Imaginons que nous voulons les films dont le titre commence par Paul et qui ont été réalisés en 2011. Nous avons donc deux emplacements. Le code devient donc le suivant (remarquez bien la présence, cette fois-ci, de deux points d'interrogation ?):

Notez combien de résultats sont renvoyés par cette requête :
Votre réponse n°12

Remplacer les emplacement anonymes par des emplacements nommés

Pour une meilleure lisibilité du code, on peut remplacer les emplacements anonymes par des emplacements nommés. Le passage des paramètres se fera alors à l'aide d'un tableau associatif. Le code devient alors le suivant :

Notez combien de résultats sont renvoyés par cette requête :
Votre réponse n°13
Sur la table ville de la base de données villes (identifiants identiques à la base des films), écrivez l'ensemble du code qui permet de rechercher les villes en fonction du département (champ ville_departement) et du début de leur nom (champ ville_nom_reel).
Lancez la requête avec les valeurs 84 (pour le département) et a% (pour le nom).

Notez ici l'ensemble du code :

Votre réponse n°14

Notez ici le nombre de résultats obtenus :

Votre réponse n°15

Comparatif de performances PDO / mysqli sur une base MySQL

Essayez de comprendre puis exécutez le code suivant qui permet de comparer le temps d'exécution de 1000 requêtes identiques (puis fetch des résultats de chacune des 1000 requêtes) avec mysqli puis avec PDO.
Quel est le temps mis par la librairie mysqli ?
Votre réponse n°16
Quel est le temps mis par la librairie PDO ?
Votre réponse n°17
Quelles sont vos conclusions ?
Votre réponse n°18
Sébastien PASTORE