PDO : pour la connexion à la base de données et la compilation des requêtes préparées,
PDOStatement : pour associer des données à une requête préparée, exécuter la requête et manipuler les résultats,
PDOException : pour manipuler les erreurs générées par les classes PDO et PDOStatement.
Par rapport à la librairie mysqli, qui reste plus performante pour accéder à des bases de données MySQL, PDO a l'avantage de :
pouvoir se connecter à différents types de SGBDR,
empêcher plus facilement l'injection SQL.
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.