Premiers pas avec PHP et SQLite

Je n’ai jamais utilisé ni PHP ni de système de gestion de base de données. Par curiosité, je voudrais essayer d’afficher une page contenant des informations recupérées dans une base SQLite.

Sommaire

Installer PHP

On peut installer PHP avec sudo apt update && sudo apt install php ; mais, si j’en crois le retour de commande, cela fait beaucoup de paquets à installer :

Les NOUVEAUX paquets suivants seront installés :
  apache2 apache2-data apache2-utils libapache2-mod-php8.2 php
  php-common php8.2 php8.2-cli php8.2-common php8.2-opcache
  php8.2-readline

À vrai dire je n’ai pas besoin d’Apache : je compte utiliser le serveur Web qui est fourni avec l’interpréteur en ligne de commande pour PHP (au sujet de ce serveur, voir un précédent post).

Je vais donc me contenter d’installer cet interpréteur. Je lance sudo apt install php-cli, dont la sortie paraît plus raisonnable :

Les NOUVEAUX paquets suivants seront installés :
  php-cli php-common php8.2-cli php8.2-common php8.2-opcache
  php8.2-readline

Une fois l’installation effectuée, je crée un dossier php-et-sqlite, me place dedans et écris du texte dans un fichier index.php :

$ mkdir php-et-sqlite
$ cd php-et-sqlite/
$ echo "Coucou" > index.php

Puis je démarre le serveur pour qu’il écoute sur le port 5678 (le choix de ce numéro est tout à fait arbitraire) :

$ php -S localhost:5678
[Tue Mar 19 15:39:27 2024] PHP 8.2.7 Development Server (http://localhost:5678) started

J’ouvre un autre terminal et demande avec curl la page d’accueil du site :

$ curl localhost:5678
Coucou

Ça marche.

Installer SQLite

J’utilise cette ligne de commande :

$ sudo apt install sqlite3

Je teste l’installation avec un exemple trouvé dans la documentation :

$ sqlite3 ex1
SQLite version 3.40.1 2022-12-28 14:03:47
Enter ".help" for usage hints.
sqlite> create table tbl1(one text, two int);
sqlite> insert into tbl1 values('hello!',10);
sqlite> insert into tbl1 values('goodbye', 20);
sqlite> select * from tbl1;
hello!|10
goodbye|20
sqlite>

Ça marche aussi. Je termine la connexion avec ctrl-d.

Connecter PHP et SQLite avec l’extension PDO

Je comprends que j’ai deux possibilités pour utiliser SQLite3 avec PHP :

Essayons avec PDO : il me manquera peut‑être des fonctionnalités que le module SQLite3 possède, mais comme mon utilisation de SQLite sera très basique, cela passera.

Avant d’aller plus loin, je dois effectuer une dernière installation : celle d’un pilote permettant à l’extension PDO se connecter à la base SQLite. Il se trouve dans le paquet php-sqlite3 (voir la page de Debian qui consacrée à ce paquet). Je lance donc sudo apt install php-sqlite3. (Cette commande installe en même temps l’extension SQLite3 pour PHP.)

Je remplace le contenu du fichier index.php par un exemple adapté de la page « Connexions et gestionnaire de connexion » de la documentation de PDO :

$ cat index.php
<?php
$db = new PDO('sqlite:ex1');
?>

Ce code crée un nouvel objet appartenant à la classe PDO, objet nommé $db, qui sert d’interface avec la base de données ex1.

Concernant le mot-clé new, voir la page « Syntaxe de base » de la documentation de PHP : il crée une instance d’une classe (en l’occurrence un objet PDO).

Sur l’argument sqlite:ex1 passé en paramètre, il s’agit du DSN (pour Data Source Name) : la documentation précise qu’il « contient les informations requises pour se connecter à la base » et qu’il est en général « constitué du nom du pilote PDO, suivi d’une syntaxe spécifique au pilote ». (Voir aussi la page « PDO_SQLITE DSN » de la documentation.)

Je lance à nouveau curl localhost:5678 : la commande ne retourne rien, ce qui est normal puisque le code PHP ne contient pas d’instruction pour afficher quoi que ce soit. Mais aucune erreur n’est signalée dans les messages de log affichés par le serveur PHP : tout s’est bien passé.

Afficher quelque chose

J’aimerais maintenant que la commande curl localhost:5678 renvoie la même sortie que la commande select * from tbl1; lancée dans l’interface en ligne de commande de SQLite, à savoir ceci :

hello!|10
goodbye|20

Commençons par voir en quoi consiste cet objet $db que nous venons de créer.

J’ajoute une ligne faisant appel aux fonctions gettype (voir la doc), qui renvoie le type de la variable passée en paramètre, et echo (voir la doc) qui affiche une chaîne de caractères. J’ai donc ce code dans la balise <?php> :

$db = new PDO('sqlite:ex1');
echo gettype($db) . "\n"

Le point dans la deuxième ligne est un opérateur permettant de concaténer deux chaînes de caractères (voir la doc).

$ curl localhost:5678 
object

Soupir de soulagement : l’objet $db est bien un objet.

Utilisons maintenant la fonction var_dump : d’après la documentation, elle « affiche les informations structurées d’une variable, y compris son type et sa valeur. Les tableaux et les objets sont explorés récursivement, avec des indentations, pour mettre en valeur leur structure. »

Je modifie index.php et relance curl :

$ cat index.php
<?php
$db = new PDO('sqlite:ex1');
var_dump($db)
?>
$ curl localhost:5678
object(PDO)#1 (0) {
}

J’ai donc bien un objet PDO.

Que puis-je faire avec cet objet PDO ?

Utilisons la méthode query qui, d’après la documentation, « prépare et exécute une requête SQL en un seul appel de fonction, retournant la requête en tant qu’objet PDOStatement ».

Allons voir la documentation au sujet de la classe PDOStatement : si je comprends bien sa définition, elle implémente l’interface IteratorAggregate (voir la doc), qui permet de créer un itérateur, c’est-à-dire (toujours si je comprends bien) une collection d’éléments qu’on pourra parcourir un à un, par exemple avec avec une structure foreach (voir les pages « Objet Iteration » et « foreach »).

J’adapte à mon cas un bout de code trouvé dans la documentation :

$ cat index.php
<?php
$db = new PDO('sqlite:ex1');
$result = $db->query('select one, two from tbl1');
foreach  ($result as $row) {
    print $row['one'] . "|";
    print  $row['two'] . "\n";
}
?>

L’espèce de flèche (->) qui sépare la variable $db de la méthode query est appelé en anglais object operator, ce que la documentation française traduit par « opérateur de l’objet ». En gros (il faudra que je creuse), cet opérateur permet d’accéder aux propriétés et méthodes d’un objet – en l’occurrence, ici, on accède à la méthode query de notre objet $db.

On passe en paramètre à cette méthode une requête SQL, et on conserve sa réponse dans la variable $result.

Ensuite, on boucle sur cette variable pour afficher son contenu.

Voyons voir si ça marche :

$ curl localhost:5678
hello!|10
goodbye|20

Parfait.

Post-scriptum

Cette page a été rédigée à partir de notes prises début 2024, en prévision d’un jour où je pourrais avoir envie d’en faire plus. J’ai repris ces notes, les ai mises au propre et les publie. Ceci explique que les versions de PHP, SQLite ou Debian mentionnées sur cette page, ainsi que les dates qui apparaissent dans les logs du serveur Web, soient un peu anciennes. Les informations restent toutefois valables.