12.Zend Framework 2 et 3

12.7.Les bases de données

12.7.1.Installation

12.7.1.1.Introduction

Pour pouvoir utiliser les bases de données avec Zend Framework (2 ou 3) vous devez disposer de:
  • Une base de données (i.e. un serveur de base de données) sur un serveur distant ou sur le même serveur que celui hébergeant votre code PHP. A moins d'utiliser SQLite, auquel cas, aucune installation de ce type n'est nécessaire
  • Le logiciel client (si besoin) de la base de données sur le serveur qui héberge votre code PHP
  • Le module PHP correspondant à la base de données utilisées
  • La bibliothèque Zend gérant l'accès aux bases de données

12.7.1.2.La base de données et le logiciel client

Nous vous invitons à consulter les personnes qui vont bien et à relever le nom du serveur hébergeant la base de données, le port sur lequel celle-ci tourne et enfin les identifiants et mots de passe permettant l'accès à la base (depuis le serveur hébergeant votre code PHP).

12.7.1.3.Le module PHP

Installer le module[comment?] correspondant à la base de données si besoin.
  • php_mysqli pour MySQL
  • php_pdo_sqlite pour SQLite
  • php_oci8 pour Oracle
  • php_pgsql pour PostgreSQL

12.7.1.4.Installer la bibliothèque Zend pour les bases de données (zend-db)

Idéalement, l'installation du module Zend pour la gestion des bases de données se fait via composer[c'est quoi?] en ajoutant zendframework/zend-db à la section require de votre fichier composer.json et en lançant la commande composer update.
rem
  • Si vous disposez d'une version de Zend Framework installée en décompressant une archive (solution proposée avant Zend Framework 2.5) alors vous disposez déjà du module base de données
  • Si vous avez installé Zend Framework en installant le module composer zendframework/zendframework alors vous disposez de l'ensemble des modules dont zend-db

12.7.2.Utilisation

12.7.2.1.Autoloader

Comme décrit dans le chapitre installation de Zend Framework, pour pouvoir utiliser cette bibliothèque dans vos scripts PHP vous devez faire appel à un "autoloader". Idéalement vous utiliserez celui de composer[comment?] ou sinon celui de Zend Framework[comment?].

12.7.2.2.Déclaration des paramètres de connexion

L'utilisation de zend-db passe par l'instanciation d'un objet Zend\Db\Adapter\Adapter qui accepte (entre autres) comme paramètre un tableau précisant le pilote ("driver") à utiliser (ce qui, pour simplifier, revient souvent à préciser le type de la base de données) et les paramètres de connexion.
Ce tableau accepte donc les paramètres suivants:
  • driver pour lequel on précise le pilote via une chaîne de caractères:
    • Mysqli pour MySQL
    • Pgsql pour PostreSQL
    • Sqlsrv pour SQL Server
    • Pdo_Sqlite pour SQLite (via un pilote PDO)
    • Pdo_Mysql pour MySQL (via un pilote PDO)
    • Pdo_Pgsql pour PostgreSQL (via un pilote PDO)
    • Oci8 pour Oracle (non supporté officiellement?)
    • IbmDb2 pour DB2 (non supporté officiellement?)
    • Pdo pour toute base supportée par le pilote PDO (plus officiellement supporté?)
  • database (ou dbname) le nom de la base de données
  • username le nom de l'utilisateur (optionnel comme dans le cas de SQLite)
  • password le mot de passe de connexion (optionnel comme dans le cas de SQLite)
  • hostname le nom ou IP du serveur hébergeant la base de données (optionnel comme dans le cas d'une connexion locale)
  • port le port sur lequel la base de données tourne (optionnel dès que l'on utilise le port standard de la base de données)
  • charset l'encodage à utiliser (ex: 'utf8')
  • driver_options (non supporté officiellement?) paramètres utilisable avec certains pilotes (Mysqli, Sqlsrv, Pdo et IbmDB2) (pouvant par exemple permettre de préciser l'encodage lorsque le parametre "charset" n'est pas correctement pris en compte)
Vous noterez qu'Oracle (de même que DB2) n'est pas officiellement supporté par Zend Framework (en tout cas le driver associé n'est pas décrit dans la documentation officielle). Néanmoins, zend-db inclus bien un pilote Oci8. Pour ce pilote, les paramètres dédiés suivants sont supportés:
  • connection_string une chaîne précisant les paramètres de connexion sous la forme '//hostname:port/database'
  • persistent booléen précisant si la connexion doit être persistante ou pas (on vous invite à indiquer true)
Puisque quelque soit la base de données utilisée c'est le même objet Zend\Db\Adapter\Adapter qui est utilisé on peut espérer que pour remplacer dans une application l'utilisation d'une base de données par une autre il suffit de modifier les paramètres passés à cet objet. C'est bien évidemment l'objectif recherché. Et si ce n'est en revanche pas aussi simple que cela dans la pratique, cela permet tout de même d'harmoniser les pratiques (ce qui est bien le but d'un framework).

12.7.2.3.Requête simple

<?php
// Au besoin on intègrera ici les instructions nécessaires au chargement de l'autoloader
// Cf. tuto installation de Zend Framework
// require_once 'vendor/autoload.php'
use Zend\Db\Adapter\Adapter;

// Exemple de configuration des paramètres de connexion
// ici à une base SQLite (créé dans le même dossier que le script)
$config = array(
    'driver' => 'Pdo_Sqlite',
    'database' => __DIR__.'/base_de_test_'.date('YmdHis').'.sqlite'
);

$db = new Adapter($config);
$sql = 'CREATE TABLE matable (monchamp VARCHAR(64))';
$db->query($sql, Adapter::QUERY_MODE_EXECUTE);
?>
Si cet exemple montre comment il est possible de lancer n'importe quelle requête SQL avec Zend Framework, ce n'est pour autant pas la méthode préconisée. Il en effet "préférable" de laisser ZF construire la requête SQL sur la base d'instructions données en tenant compte des spécificités de la base de données utilisée comme nous le verrons par la suite.