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 :
- soit j’utilise l’extension
SQLite3
(lien vers la documentation de PHP sur le sujet) ; - soit j’utilise l’extension
PDO
, initiales de PHP Data Object : elle fournit une couche d’abstraction entre PHP et différents systèmes de gestions de base de données — on utilisera donc les mêmes fonctions pour échanger avec une base SQLite ou MySQL (lien vers la documentation de PHP sur l’extension PDO).
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.