{"id":18976610,"url":"https://github.com/paul-schuhm/pdo","last_synced_at":"2025-09-04T18:14:49.654Z","repository":{"id":246760369,"uuid":"822072983","full_name":"paul-schuhm/pdo","owner":"paul-schuhm","description":"Une démo de l'extension PHP Data Object (PDO) pour interagir avec des bases de données relationnelles et une synthèse des choses à savoir pour utiliser l'extension","archived":false,"fork":false,"pushed_at":"2024-06-30T22:14:58.000Z","size":8,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-02T14:19:42.055Z","etag":null,"topics":["demo","fr","francais","guide","pdo","pdo-php","php8","teaching-materials"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/paul-schuhm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-30T08:31:46.000Z","updated_at":"2024-06-30T22:15:01.000Z","dependencies_parsed_at":null,"dependency_job_id":"aa619abe-4cca-4374-a694-cbe8df361e7f","html_url":"https://github.com/paul-schuhm/pdo","commit_stats":null,"previous_names":["paul-schuhm/pdo"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/paul-schuhm/pdo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paul-schuhm%2Fpdo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paul-schuhm%2Fpdo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paul-schuhm%2Fpdo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paul-schuhm%2Fpdo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/paul-schuhm","download_url":"https://codeload.github.com/paul-schuhm/pdo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paul-schuhm%2Fpdo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273650878,"owners_count":25143910,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-04T02:00:08.968Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["demo","fr","francais","guide","pdo","pdo-php","php8","teaching-materials"],"created_at":"2024-11-08T15:25:34.414Z","updated_at":"2025-09-04T18:14:49.595Z","avatar_url":"https://github.com/paul-schuhm.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Démo PHP Data Object (PDO)\n\nUne démo de l'extension PDO en PHP pour interagir avec des bases de données relationnelles et une synthèse des choses à savoir pour utiliser l'extension. La démo utilise ici une base de données SQLite par soucis de simplicité.\n\n- [Démo PHP Data Object (PDO)](#démo-php-data-object-pdo)\n  - [Installation](#installation)\n  - [Ouvrir une connexion (avec SQLite)](#ouvrir-une-connexion-avec-sqlite)\n  - [Classes de l'extension PDO](#classes-de-lextension-pdo)\n  - [Exécuter des requêtes SQL](#exécuter-des-requêtes-sql)\n  - [Parcourir les résultats](#parcourir-les-résultats)\n  - [Exécuter des requêtes préparées (en deux temps)](#exécuter-des-requêtes-préparées-en-deux-temps)\n  - [Utiliser les transactions](#utiliser-les-transactions)\n  - [Accéder à la démo](#accéder-à-la-démo)\n  - [En résumé](#en-résumé)\n  - [Références](#références)\n\n\n## Installation\n\n1. [Installer PHP 8+](https://www.php.net/downloads);\n2. Vérifier que le module `PDO` et le pilote `PDOSQlite` sont installés avec la commande suivante :\n\n~~~sh\nphp -m | grep -E \"pdo|PDO\"\n~~~\n\nVous devriez obtenir un résultat similaire à celui-ci :\n\n~~~bash\nPDO\npdo_mysql\npdo_sqlite\n~~~\n\n\u003e Le module `PDO` et le pilote `PDOSQLite` sont installés et activés par défaut.\n\n## Ouvrir une connexion (avec SQLite)\n\nPour ouvrir une connexion à une base de données, vous devez instancier un objet de type `PDO` et lui fournir une [**Data Source Name (DSN)**](https://www.php.net/manual/fr/pdo.construct.php). [Pour SQLite](https://www.php.net/manual/fr/ref.pdo-sqlite.connection.php), elle est de la forme :\n\n~~~bash\nsqlite:/path/to/database.sq3\n~~~\n\n\u003e SQLite ne dispose pas d'instruction `CREATE DATABASE`. En effet, en SQLite, un fichier est égal à une base de données.\n\n## Classes de l'extension PDO\n\nL'extension `pdo` définit les classes suivantes **à connaître** :\n\n- `PDO` : Représente une connexion entre PHP et un serveur de base de données;\n- `PDOStatement` : Représente une requête préparée et, une fois exécutée, le jeu de résultats associé. Retourné par [`PDO::query()`](https://www.php.net/manual/fr/pdo.query.php) et [`PDO::prepare()`](https://www.php.net/manual/fr/pdo.prepare.php);\n- `PDOException` : Représente une erreur émise par PDO. **Vous ne devez pas lancer une exception PDOException depuis votre propre code**, seulement les gérer.\n\n## Exécuter des requêtes SQL\n\n`PDO::exec()` exécute une requête SQL dans un appel d'une seule fonction, **retourne le nombre de lignes affectées** par la requête. **Ne retourne pas de résultats** pour une requête `SELECT`. Pour cela, il faut utiliser `PDO::query()`.\n\n~~~php\n$result = $pdo-\u003eexec(\"CREATE TABLE IF NOT EXISTS Article(id INT, title VARCHAR(255), body TEXT)\");\n$sql = \u003c\u003c\u003c SQL\nINSERT INTO Article(id, title, body) \nVALUES (1, 'Foo', 'Lorem ipsum'), \n(2, 'Bar', 'Lorem ipsum'), \n(3, 'Baz', 'Lorem ipsum'),\n(4, 'Foo', 'Lorem ipsum')\nSQL;\n\n$result = $pdo-\u003eexec($sql);\n~~~\n\n`PDO::query()` **prépare et execute** une requête SQL **en un seul appel** de fonction et retourne un objet de type `PDOStatement`. Cet objet contient les méthodes nécessaires pour consulter la requête initiale, les résultats, les erreurs, etc.\n\n~~~php\n$stmt = $pdo-\u003equery(\"SELECT id, title, body FROM Article\");\n~~~\n\n## Parcourir les résultats\n\nUne fois la requête exécutée, on peut parcourir les résultats à l'aide des méthodes `PDOStatement::fetch()` ou `PDOStatement::fetchAll()` :\n\n~~~php\n$firstRow = $stmt-\u003efetch();\n$remainingRows = $stmt-\u003efetchAll();\n~~~\n\nOu alors en itérant sur l'objet `PDOStatement` directement (car il implémente l'interface `IteratorAggregate`) :\n\n~~~php\nforeach ($stmt as $row) {\n    echo $row['title'] . \"\\t\";\n    echo $row['body'] . \"\\t\";\n    echo $row['id'] . PHP_EOL;\n}\n~~~\n\n## Exécuter des requêtes préparées (en deux temps)\n\n\n`PDO::prepare()` permet de préparer une requête *paramétrée* :\n\n~~~php\n$stmt = $pdo-\u003eprepare('SELECT id, title, body FROM Article WHERE title = :title AND id = :id');\n$stmt-\u003eexecute(['title' =\u003e 'Foo', 'id' =\u003e 1]);\n~~~\n\nOu avec `bindValue()` :\n\n~~~php\n$stmt = $pdo-\u003eprepare('SELECT id, title, body FROM Article WHERE title = :title AND id = :id');\n$stmt-\u003ebindValue('title', 'Foo');\n$stmt-\u003ebindValue('id', 1);\n$stmt-\u003eexecute();\n~~~\n\n\u003e Le paramètre peut être nommé ou interrogatif (?). Voir la documentation\n\n\n## Utiliser les transactions\n\nPar défaut, PDO s’exécute en mode `autocommit`, chaque requête est implicitement une transaction. Pour initialiser une transaction, il faut utiliser la méthode `PDO::beginTransaction()`. Ensuite effectuer les requêtes contenues dans la transaction puis la terminer avec la méthode `PDO::commit()` ou l'annuler avec la méthode `PDO::rollback()`\n\n~~~php\n$pdo-\u003ebeginTransaction();\n$pdo-\u003eexec(\"INSERT INTO Article(id, title, body) VALUES (5, 'Baz', 'Lorem ipsum')\");\n$pdo-\u003eexec(\"INSERT INTO Article(id, title, body) VALUES (6, 'Baz', 'Lorem ipsum')\");\n$pdo-\u003ecommit();\n~~~\n\n\u003e [En savoir plus sur les transactions](https://www.php.net/manual/fr/pdo.transactions.php).\n\n## Accéder à la démo\n\nLancer la démo :\n\n~~~sh\nphp index.php\n~~~\n\nInspecter [le code source commenté](./index.php), le modifier et le tester.\n\n## En résumé\n\nUn objet PDO représente une connexion à une base de données via l'interface `PDO`, implémentée pour chaque SGBD majeur (aussi appelé *pilote*). Il faut lui fournir une DSN pour établir la connexion.\n\nUne fois la connexion établie, on peut exécuter des requêtes directement depuis l'objet `PDO` avec les méthodes `PDO::exec()` et `PDO::query()`. `exec()` est plus limitée, elle ne permet que d'accéder au nombre de lignes altérées par la requête. Pour une requête de projection (`SELECT`), utiliser `query()`.\n\nOn peut également préparer des requêtes *sans* les executer (pour les paramétrer et les réutiliser, [voir les avantages des requêtes préparées](https://www.php.net/manual/fr/pdo.prepared-statements.php)) avec la méthode `PDO::prepare()`. La requête préparée est retournée sous forme d'objet de type `PDOStatement`. Pour l’exécuter, on utilise la méthode `PDOStatement::execute()`.\n\nPour consulter les résultats, l'objet de type `PDOStatement` offre plusieurs **méthodes de récupération** (`fetch()`, `fetchAll()` et `fetchObject()`) et plusieurs [**modes de récupération**](https://www.php.net/manual/fr/pdo.constants.php) (`PDO::FETCH_BOTH` (par défaut), `PDO::FETCH_ASSOC`, etc.) \n\n\n[Les méthodes de `PDO`](https://www.php.net/manual/fr/class.pdo.php) **à connaître** :\n\n- `exec()`;\n- `query()` : **Prépare** et **exécute** une requête SQL. Retourne un `PDOStatement` contenant les résultats;\n- `prepare()` : **Prépare** une requête SQL. Retourne un `PDOStatement`;\n- `beginTransaction()` : Ouvre une transaction;\n- `commit()` : Valide la transaction;\n- `rollback()` : Annule la transaction.\n\n[Les méthodes de `PDOStatement`](https://www.php.net/manual/fr/class.pdostatement.php) **à connaître** :\n\n- `bindValue()` : Associe une *valeur* à un paramètre (nommé ou interrogatif(`?`));\n- `bindParam()` : Lie une variable PHP (référence) à un marqueur nommé ou interrogatif. Contrairement à `bindValue()`, la variable est liée en tant que référence et ne sera évaluée qu'au moment de l'appel à la fonction `execute()`.  (utile pour les procédures stockées qui retourne un résultat `INOUT`);\n- `bindColumn()` : Lie une variable PHP (référence) à une colonne (par nom ou position). Chaque appel à `fetch` met à jour la variable;\n- `execute()` : Exécute une requête préparée;\n- `fetch()` : Récupère la ligne *suivante* d'un jeu de résultats PDO;\n- `fetchAll()` : Récupère les lignes *restantes* d'un ensemble de résultats.\n\n[Les modes de récupération (constantes)](https://www.php.net/manual/fr/pdo.constants.php) **à connaître** :\n\n- `PDO::FETCH_BOTH` (défaut);\n- `PDO::FETCH_ASSOC`;\n- `PDO::FETCH_UNIQUE`;\n- `PDO::FETCH_CLASS` (ORM);\n- `PDO::FETCH_FUNC` (mapping des résultats via une callback).\n\n## Références\n\n- [PHP Data Objects](https://www.php.net/manual/fr/book.pdo.php), documentation officielle du module PDO;\n- [Constantes pré-définies par le module PDO](https://www.php.net/manual/fr/pdo.constants.php), documente notamment les différents modes de récupération des données (`FETCH_*`);\n- [PDOStatement::fetch](https://www.php.net/manual/en/pdostatement.fetch.php#example-1053), documentation des différents modes de récupération des données;\n- [Connexions et gestionnaire de connexion](https://www.php.net/manual/fr/pdo.connections.php), documentation sur la gestion des connexions notamment des [connexions persistantes](https://www.php.net/manual/fr/pdo.constants.php#pdo.constants.attr-persistent);\n- [PDO : Les erreurs et leur gestion](https://www.php.net/manual/fr/pdo.error-handling.php);\n- [(The only proper) PDO tutorial](https://phpdelusions.net/pdo), un très bon site (maintenu) qui propose des tutoriels pour mieux comprendre le module PDO (la documentation n'est en effet pas toujours complète et explicite sur les différents paramètres du module);\n- [SQLite - Documentation](https://www.sqlite.org/docs.html), documentation officielle de SQLite.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaul-schuhm%2Fpdo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpaul-schuhm%2Fpdo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaul-schuhm%2Fpdo/lists"}