# Programmation PHP/PDO

* Introduction
* Installer PHP
* Composer
* IDE
** PhpStorm
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Commentaires
** Premier programme
** Variables
** Variables superglobales
** Constantes
** Opérateurs
** Fonctions
** Tableaux
** Structures de contrôle
** Boucles
* Programmation avancée
** Dates
** Sessions
** Cookies
** Cache
*** Memcached
*** Redis
** Formulaire
** Fichiers
*** Objets COM
*** Images
** Mails
** Sécurité
** Programmation orientée objet
** Bases de données
*** Microsoft SQL Server
*** MySQL
*** PDO
*** SQLite
** Expressions rationnelles
** Code de haute qualité
*** Analyse statique de programmes
** Exceptions
** Xdebug
** Mots réservés
* Apprendre par l'exemple
** Utilisation de variables
** Un sommaire simple
** Interaction avec un formulaire
** Afficher le résultat d'une requête BDD
** Modifier une table
** Faire un livre d'or
** Faire un mini forum de discussion
** Parser avec DomXml
** Coder en MVC
** Faire un webservice
** Vérification RIO
** AJAX
** Sommaire en Ajax
** Mise à jour périodique d'un cadre
** Mini CMS
** Introduction
** Développement
*** Les couches choisies
*** Code de service
*** Modélisation
*** Implémentation
*** La vue
*** Ajaxification
*** Premier noyau
*** Fournir les données
*** IHM
** Rétrospective
** Conclusion
* Extensions PHP
** cURL
** DOMDocument
** JSON
** MING
** SPL
* Bibliothèques externes
** ADODB
** DOMPDF
** FPDF
** PHPExcel
** PHPMailer
** PHPWord
** RabbitMQ
* Cadriciels
** CakePHP
** PEAR
** Symfony
** Frameworks de tests
*** PHPUnit
*** SimpleTest
*** Behat
* Logiciels métier
* Problèmes connus
* Introduction
* Installer PHP
* Composer
* IDE
** PhpStorm
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Commentaires
** Premier programme
** Variables
** Variables superglobales
** Constantes
** Opérateurs
** Fonctions
** Tableaux
** Structures de contrôle
** Boucles
* Programmation avancée
** Dates
** Sessions
** Cookies
** Cache
*** Memcached
*** Redis
** Formulaire
** Fichiers
*** Objets COM
*** Images
** Mails
** Sécurité
** Programmation orientée objet
** Bases de données
*** Microsoft SQL Server
*** MySQL
*** PDO
*** SQLite
** Expressions rationnelles
** Code de haute qualité
*** Analyse statique de programmes
** Exceptions
** Xdebug
** Mots réservés
* Apprendre par l'exemple
** Utilisation de variables
** Un sommaire simple
** Interaction avec un formulaire
** Afficher le résultat d'une requête BDD
** Modifier une table
** Faire un livre d'or
** Faire un mini forum de discussion
** Parser avec DomXml
** Coder en MVC
** Faire un webservice
** Vérification RIO
** AJAX
** Sommaire en Ajax
** Mise à jour périodique d'un cadre
** Mini CMS
** Introduction
** Développement
*** Les couches choisies
*** Code de service
*** Modélisation
*** Implémentation
*** La vue
*** Ajaxification
*** Premier noyau
*** Fournir les données
*** IHM
** Rétrospective
** Conclusion
* Extensions PHP
** cURL
** DOMDocument
** JSON
** MING
** SPL
* Bibliothèques externes
** ADODB
** DOMPDF
** FPDF
** PHPExcel
** PHPMailer
** PHPWord
** RabbitMQ
* Cadriciels
** CakePHP
** PEAR
** Symfony
** Frameworks de tests
*** PHPUnit
*** SimpleTest
*** Behat
* Logiciels métier
* Problèmes connus
[ Modifier le sommaire ]

## Introduction

PDO (PHP Data Objects) est une extension définissant l'interface pour accéder à plusieurs types de base de données, fournie automatiquement depuis PHP 5.1. Avec ce système, pour utiliser plusieurs SGBD il n'est pas nécessaire de changer les fonctions de communication dans tout le code, mais seulement les arguments envoyés au constructeur.
Les pilotes suivants sont disponibles :
* 4D
* CUBRID
* Firebird
* IBM DB2
* Informix
* Microsoft SQL Server
* MySQL
* Oracle Database
* PostgreSQL
* SQLite
Et aussi via ODBC.

## Installation
### Machine hôte

Pour activer les différents SGBD qui doivent communiquer avec PDO, il faut ajouter ou décommenter les lignes extension=php_pdo_[SGBD utilisé].dll dans php.ini, que ce soit sur Apache ou IIS. Exemple :
Les .dll de Microsoft SQL Server sont téléchargeables sur le site officiel.

### Docker

MySQL :
PostgreSQL :

## Les classes de l'extension PDO

L'extension PDO comporte trois classes :
* La classe PDO correspond à une connexion à la base de données.
* La classe PDOStatement représente d'une part une requête préparée et d'autre part le jeu de résultats de la requête une fois qu'elle est exécutée.
Cette classe offre des méthodes de parcours, de comptage, d'informations.
* La classe PDOException représente une erreur émise par PDO.

## Accès à la base de données avec PDO

L'accès à la base de données se fait en instanciant un objet PDO. Les paramètres à indiquer au constructeur sont :
* la source de la base de données ;
* optionnellement, le nom d'utilisateur et le mot de passe.
Par exemple, pour accéder à une base de données de nom ma_bdd accessible sur le port mon_port du serveur mon_serveur avec l'utilisateur mon_id associé au mot de passe mon_mot_de_passe, le code sera le suivant :
* Pour MySQL :
* Pour MS-SQL les noms des paramètres diffèrent :
* MS-SQL via une source de données ODBC (à créer dans C:\Windows\SysWOW64\odbcad32.exe) :
* Pour PostgreSQL :
Par rapport à mysqli, PDO indique le nom réseau de la machine qui l'utilise en suffixe du compte MySQL, ce qui change le nom du compte et donc les permissions sur les bases. Par exemple si 'mon_id@%' est autorisé, ce n'est pas forcément le cas de 'mon_id@192.168.1.10', ce qui provoque l'erreur Access denied for user.

## Passer des requêtes en PDO

Des méthodes permettent de passer des requêtes à l'objet récupéré lors de la connexion.
* PDO::exec(string $statement)
La méthode exec permet de passer et exécuter une requête SQL de type INSERT, UPDATE, DELETE. Elle retourne le nombre de lignes affectées par la requête.
* PDO::query(string $statement)
La méthode query permet de passer et exécuter une requête SQL de type SELECT. Elle retourne le jeu de résultats (s'il y en a) sous forme d'objet PDOStatement.

## Quelques méthodes de PDOStatement

* PDOStatement::fetch récupère la ligne suivante d'un jeu de résultats PDO.
* PDOStatement::fetchAll retourne un tableau contenant toutes les lignes du jeu d'enregistrements PDO.
* PDOStatement::fetchObject récupère la ligne suivante et la retourne en tant qu'objet.
* PDOStatement::fetchColumn retourne une colonne depuis la ligne suivante d'un jeu de résultats PDO.
* PDOStatement::rowCount retourne le nombre de lignes affectées par le dernier appel à la fonction.
* PDOStatement::closeCursor libère la connexion au serveur, permettant ainsi à d'autres requêtes SQL d'être exécutées. La requête reste dans un état lui permettant d'être de nouveau exécutée. Cette fonction retourne TRUE en cas de succès ou FALSE si une erreur survient.
* PDOStatement::execute exécute une requête préparée.

## Les paramètres de la méthode fetch

La méthode fetch peut avoir en paramètre le type de retour du résultat. Par défaut, sans paramètre, le paramètre implicite est PDO::FETCH_BOTH.
* PDO::FETCH_ASSOC retourne le jeu de résultats sous forme d'un tableau associatif, dont la clé est le nom de colonnes.
Exemple d'utilisation :
* PDO::FETCH_NUM retourne le jeu de résultats sous forme d'un tableau indexé par numéro commençant à 0.
Exemple d'utilisation :
* PDO::FETCH_BOTH retourne un tableau indexé et un tableau associatif.
* PDO::FETCH_OBJ retourne le jeu de résultats sous forme d'un objet dont les noms de propriétés correspondent aux noms des colonnes.

## Faire une requête préparée avec PDO

PDO::prepare permet de préparer une requête que l'on exécutera ensuite avec la méthode PDOStatement::execute.
Les variables (parties de la requête spécifiques au moment de l'exécution) seront passées à la requête préparée grâce à cette méthode execute. Ce dispositif protège l'application d'attaque de type injection SQL.
Exemple :

## Jongler avec plusieurs SGBD en même temps

Pour exécuter alternativement des requêtes sur plusieurs SGBD, par exemple pour comparer leurs bases :

## Notes et références

* ↑ http://php.net/manual/fr/pdo.drivers.php
* ↑ http://fr2.php.net/manual/fr/pdo.installation.php
* ↑ https://www.microsoft.com/en-us/download/details.aspx?id=20098
* ↑ http://php.net/manual/fr/class.pdo.php
* ↑ http://php.net/manual/fr/ref.pdo-mysql.php
* ↑ http://php.net/manual/fr/ref.pdo-sqlsrv.connection.php
* ↑ https://www.php.net/manual/fr/ref.pdo-pgsql.php