OpenLLM-France/wikimedia huggingface dataset:
# Bambara/Verbes

    Bambara - index - leçons 1, 2, 3
alphabet • genre • pluriels • verbes • pronoms • adverbes • postpositions • particules • conjonctions
En Bambara il n'y a pas de conjugaison. Quelle que soit la personne, la forme est la même.
Il y a deux types de verbes :

## PRÉSENT

Le présent s'utilise avec l'auxiliaire bɛ (à l'affirmatif) / tɛ (au négatif)
MANGER = KA DUN (to eat) ; riz = maalo ; ne = je
je mange du riz => ne bɛ maalo dun ; je ne mange pas le riz => ne tɛ maalo dun
remarque : la phrase s'écrit toujours sous la forme = SUJET + bɛ/tɛ + COD + VERBE
PARLER = KA kuma (to speak)
Causer= KA baro
tu parles => i bɛ kuma ; tu ne parles pas => i tɛ kuma.
￼i bɛ baro = tu cause. I te baro= tu ne cause pas. On construit aussi très simplement le passif en supprimant l'objet : je le mange --> ne be a dun (contracté ne b'a dun) je suis mangé --> ne dun na.

## PASSÉ

Le passé transitif s'écrit avec "ye" (à l'affirmatif) / "ma" (au négatif)
ACHETER = KA SAN (to buy) ; orange = lenburu
J'ai acheté des oranges => ne ye lenburu san ; je n'ai pas acheté d'oranges => ne ma lenburu san
Le passé intransitif s'écrit avec les terminaisons "-ra" "-la" "-na" (à l'affirmatif) / "ma" (au négatif)
PARTIR = KA TAA (to go) ; COURIR = KA BOLI (to run) ; PASSER = KA TƐMƐN (to spend, to pass)
je suis parti => ne taara ou ne taala ; j'ai couru => ne bolila ; je suis passé => ne tɛmɛnna ; je ne suis pas parti => ne ma taa ; je n'ai pas couru => ne ma boli ; je ne suis pas passé => ne ma tɛmɛn

## IMPARFAIT

Pour construire le passé il suffit d'ajouter le mot tun avant le verbe :
je suis à Bamako --> ne be Bamako j'étais à Bamako --> ne tun be Bamako

## FUTUR

Il est traduit par "bɛna" (à l'affirmatif) et "tɛna" (au négatif)
MANGER : KA DUN
Je mangerai du riz => ne bɛna kini dun ; je ne mangerai pas de riz => ne tɛna kini dun
PLEURER = KA KASI
je pleurerai => ne bɛna kasi ; je ne pleurerai pas => ne tɛna kasi

## Participe
### Participe passé

-len

### Participe présent

-to n b'a fè ka taa est le bon énoncé

## tableau

* be
* ka
* be ka
* -ra / -la / -na
* ye
* tun be
* tun ka
* tun be ka
* tun -ra / -la / -na
* tun ye

## Voir

* Le Wiktionnaire possède une entrée pour « Catégorie:Verbes en bambara ».
# Gambas 3/Gambas3LeLangage/L'orienté objet avec Gambas/Le polymorphisme
## Le polymorphisme

Le polymorphisme est un concept essentiel de la programmation orientée objet. Ce concept est intimement lié à l'héritage.
Gambas utilise le dispatching virtuel selon le wiki officiel. Cela signifie qu'en cas d'appel de méthode, il cherche d'abord la méthode dans les classes fille. S'il ne trouve pas la méthode dans la classe fille, il remonte dans la classe parente.
Dans la pratique, vous rassemblez des objets qui se ressemblent dans une collection. Mais chaque objet aura un comportement qui lui est propre. Certains objets agiront différemment des autres.
L'exemple ci-dessous utilise des objets de type "Bateau". Ces objets sont créés avec les classes dérivées "Bateau à moteur" et "Bateau à voile". Un "Bateau à moteur" EST UN "Bateau". Un "Bateau à voile" EST UN "Bateau" lui aussi. Il y a donc une relation d'héritage entre ces classes. Toutes ces classes partagent plusieurs méthodes comme "RaffraichirPosition" ou "Demarrer" ou "Stopper". Vous l'aurez compris, un "Bateau à moteur" n'avance pas comme un "Bateau à voile" et le code sera donc différent dans les classes.
En résumé :
* Lorsque vous appelez objet.Methode depuis un module, ou Me.Methode depuis la classe, c'est la Methode du type réel qui est exécutée.
* Il est possible de faire des collections d'objets typés "Parent" qui contiennent des objets typés "Enfant".
# Gambas 3/Gambas3LeLangage/L'orienté objet avec Gambas/Instanciation d'un objet
## Instanciation d'un objet

Chaque variable a un type. Vous déclarez la variable puis vous l'instanciez ainsi :
Il est possible de faire les deux d'un coup comme ceci :
Il est important de comprendre que la variable a référence l'objet. C'est l'adresse où trouver l'objet typé Audi ! Ainsi, le code ci-dessous référence deux fois le même objet :
Ci-dessus, a et b pointe sur le même objet !
# Gambas 3/Gambas3LeLangage/L'orienté objet avec Gambas/L'héritage
## L'héritage

Vous faites des classes et votre code semble bien structuré. Le temps passe et vous vous rendez compte que plusieurs classes partagent du code. Vous avez le sentiment de vous répéter.
Une solution pourrait être de mettre le code partagé dans un module. Cependant quand on crée de nombreuses méthodes statiques qui prennent en argument des objets et agissent dessus on ne fait pas de la programmation orientée objet.
Le code ci-dessous n'est pas objet :
La solution est de créer une classe parente qui regroupe le code partagé en un endroit.
La relation d'héritage est caractérisée par l'expression EST UN. Si par exemple, une voiture est un véhicule et une moto aussi. Les classes Voiture et Moto héritent de la classe Véhicule.
Avec Gambas, on note simplement Inherit ClasseParente tout au début du code des classes filles comme ceci :
Ceci permet d'utiliser cette méthode héritée directement sur un objet de la classe fille :
L'héritage permet aussi de spécialiser une classe. Ci-dessous, je vous donne la classe de base (ou classe parente) pour représenter un bateau :
Puis j'en crée une autre pour un bateau à moteur sachant que j'aimerais bien conserver ma classe de base. Eh oui, car j'aimerais bien faire aussi une classe Voilier après ...
Ci-dessous, la classe étendue (ou classe fille) pour représenter un bateau à moteur :
Vous avez remarqué l'utilisation de Super qui fait référence à l'objet issu de la classe de base et de Me qui fait référence à l'objet en cours d'utilisation.
Avec l'héritage, vous pouvez étendre les classes. La classe fille hérite des constantes, événements, méthodes et des propriétés de la classe de base et vous ajoutez des constantes, événements, méthodes et des propriétés supplémentaires.
Avec l'héritage, vous pouvez modifier le comportement d'une classe en surchargeant les méthodes, constantes ou propriétés. Il suffit pour cela d'écrire la même méthode, constante ou propriété dans la classe fille que dans la classe mère et de créer des instructions différentes dans le code de la classe fille.
En revanche, vous ne pouvez pas enlever des propriétés, etc. Pour cela, vous devrez utiliser la composition.
Dans la pratique, l'héritage n'est pas très utilisé en Gambas mais il est utilisé de temps en temps tout de même.
Un peu perdu ? Ne vous inquiétez pas ! Avec le temps, ça viendra.
# Gambas 3/Gambas3LeLangage/L'orienté objet avec Gambas/La syntaxe d'une classe
## Syntaxe d'une classe

Il n'y a pas de syntaxe spéciale avec Gambas. Pour créer des classes, il n'y a point de "class Truc" donc ! C'est l'extension du fichier uniquement qui fait la différence : *.class.
Pour créer une classe :
* Faites un clic-droit sur le dossier "Sources" puis
* Nouveau
* Classe
* Ne vous occupez pas des options pour l'instant !
Par la suite, vous verrez qu'on peut écrire des mot-clefs au tout début du code de la classe. Ces points seront abordés lorsque nous verrons les classes statiques, le patron de conception Singleton et la notion de composant.
# Gambas 3/Gambas3LeLangage/L'orienté objet avec Gambas/Le cycle de vie des objets
## Cycle de vie des objets

Quand vous créez un objet avec New, une partie de la mémoire (sur vos barrettes de RAM) est réservée pour stocker toutes les informations relatives à cet objet.
Dans les langages bas-niveau (C, C++) ou même en VBA, vous devez libérer la mémoire car, sans cela, toute la mémoire sera un jour prise et votre ordinateur ne pourra plus fonctionner. C'est ce qu'on appelle : "fuite de mémoire" ou "Memory leak".
Vous n'avez pas réellement besoin de gérer la mémoire avec Gambas car il gère la mémoire pour vous comme Java ou .NET.
Dans le wiki officiel, il est mentionné :
Il faut donc respecter cette bonne pratique en programmation (quel que soit le langage) :
Quand vous n'avez plus besoin d'un objet, assignez la valeur Null à la variable qui référence l'objet devenu inutile comme ci-dessous :
Ceci modifiera le compteur de références et Gambas libérera plus rapidement de l'espace mémoire pendant l'exécution de votre programme.
Pas besoin de faire cela si votre programme s'arrête juste après. Bien entendu, ceci est important si votre programme fonctionne sur une longue durée.
À retenir :
* Gambas s'occupe de tout. Pas besoin de gérer la mémoire.
* Une référence Null libérera indirectement l'objet.
Vous pouvez faire fonctionner l'exemple donné dans la wikipage relative au constructeur et le destructeur.
# Gambas 3/Gambas3LeLangage/L'orienté objet avec Gambas/Les classes abstraites
## Les classes abstraites
### Définition

Les classes contrètes sont des classes instanciables. C'est le cas de la majorité des classes. Nous avons un moule pour créer des voitures et nous créons des objets typés voiture.
Vous pouvez empêcher cela en créant une classe abstraite. Les programmeurs qui utiliseront vos classes seront ainsi forcés de créer une classe fille qui héritera de votre classe.

### En Gambas

Pour créer une classe abstraite, utilisez l'assistant :
* clic droit sur le dossier Sources dans le volet Projet à droite en haut puis
* Nouveau
* Classe
* Donnez un nom à votre classe par exemple CVehicule puis
* Cochez en bas l'option Non Instanciable !
Cela créera une classe avec le texte Create Private tout au début en haut du code de la classe :
</syntaxhighlight>
Si vous commencez votre apprentissage, pas besoin d'en savoir plus ! Continuez !
# Gambas 3/Gambas3LeLangage/L'orienté objet avec Gambas/L'introspection
## Introspection

Gambas est capable de retrouver les caractéristiques d'un objet durant l'exécution d'un programme.
Il peut, par exemple, répondre aux questions suivantes :
* Quelle est la classe qui a été utilisée pour créer l'objet que je traite ?
* Cette classe hérite-elle d'une autre ?
* L'objet peut-il faire ceci ou cela ?
Gambas peut générer des objets. En revanche, créer une toute nouvelle classe dynamiquement semble ne pas être possible.
En revanche, vous pouvez générer un projet (créer des dossiers, des fichiers avec l'extension .class, et ainsi de suite). Après, vous pouvez compiler le projet ainsi créé avec gbc, l'archiver avec gba et enfin l'exécuter avec gbr3 ! Les scripts Gambas (gbs) fonctionnent ainsi.
Ci-dessous, voici du code pour illustrer l'introspection. Ce code affiche l'interface d'une classe. Il est imparfait mais ça donne une bonne idée du concept.
Le plus intéressant est tout en bas, dans le code du module.
Voici la classe de base Symbol représentant un élément de l'interface :
Puis les classes fille :
* SymConstant représente une constante
* SymEvent représente un événement
* SymMethod représente une méthode
* SymProperty représente une propriété
* SymVariable représente une variable
En enfin, voici le code principal du module de démarrage :
Essayez d'analyser diverses classes :
* Settings
* application
* Component
* Etc
# Gambas 3/Gambas3LeLangage/L'orienté objet avec Gambas/Les classes statiques
## Les classes statiques

En Gambas, je devrais dire "une classe créée statiquement" et ça serait bien plus juste ! Gare aux abus de langages !

### Définition

Une classe statique est une classe utilitaire regroupant des outils par thème.
La classe Settings (les options sauvegardées par les utilisateurs d'un programme) est un bon exemple de classe statique.
On utilise la classe sans devoir créer une instance au préalable comme par exemple :
C'est commode car on n'a pas eu besoin de créer un objet.

### Particularité de Gambas

Dans beaucoup d'autre langages, une classe statique ne peut pas être instanciée !
En Gambas, c'est différent. En effet, une classe statique est instanciée automatiquement. Dans le code ci-dessus, Settings désigne l'instance créée par Gambas au démarrage du programme.
Gambas permet même de créer d'autres instances et c'est là que ça devient un peu perturbant ! Au début, je vous recommande de ne pas instancier d'objet lorsque la classe est statique même si le code ci-dessous est tout à fait valide en Gambas :
Par commodité, vous allez vouloir créer des classes statiques. Voici comment procéder.

### Comment créer votre classe statique

Après avoir créé votre classe comme d'habitude, vous inscrivez le mot-clé Create Static tout au début de votre classe comme ceci :
Retenez que le constructeur est invoqué lors de la création de l'instance automatique et que vous pouvez implémenter _new.

### Comment créer une unique instance

Il existe un patron de conception (design pattern) nommé Singleton qui nous donne une recette pour créer une unique instance d'un objet. En Gambas, vous pouvez utiliser un module directement ou, plus compliqué, ajouter Create Private comme dans le code ci-dessous :
N'hésitez pas à revenir sur ces notions plus tard. Continuez à progresser !
# Gambas 3/Gambas3LeLangage/L'orienté objet avec Gambas/Les foncteurs
## Utiliser un objet comme une fonction

Voici la définition d'un foncteur selon wiktionary :

### Foncteur

Entité qui réunit les qualités d’objet et de fonction dans le cadre d’une programmation par objets.
https://fr.wiktionary.org/wiki/foncteur

### Description

C'est un objet qui se comporte comme une fonction. C'est plus puissant qu'une simple fonction car, un foncteur étant un objet, il permet de stocker des paramètres dans ses attributs (propriétés, variables internes).
Toute fonction peut être transformée en foncteur. Le code est ainsi bien organisé.

### Exemple

Voici un exemple avec des opérations arithmétiques.
La classe de base s'appelle "COperator". Elle représente un opérateur (+, -, *, /, ...).
Je spécialise la classe en créant la classe dérivée COperatorPlus représentant l'opérateur + servant à faire des additions.
Enfin, voici une utilisation possible dans le code :
Que de progrès les amis !
# Gambas 3/Gambas3LeLangage/L'orienté objet avec Gambas/Le constructeur et le destructeur
## Le constructeur et le destructeur

Vous pouvez exécuter des actions juste après la création en mémoire de votre objet. Pour cela, utilisez la méthode spéciale _new dans le code source de votre classe comme suit :
La méthode _free est à utiliser avec précaution. Généralement, on n'en a pas besoin car Gambas implémente un compteur de référence et supprime les objets devenus inutiles au fur et à mesure de l'exécution du programme.
# Apache/Cache

* Installation d'Apache
* Plusieurs sites par machine
* Serveurs virtuels (vhost)
* Répertoires utilisateurs
* Ré-écriture d'URL
* .htaccess
* Sécurité
* Connexion sécurisée (HTTPS)
* Common Gateway Interface (CGI)
* Cache web
* Problèmes connus
* Installation d'Apache
* Plusieurs sites par machine
* Serveurs virtuels (vhost)
* Répertoires utilisateurs
* Ré-écriture d'URL
* .htaccess
* Sécurité
* Connexion sécurisée (HTTPS)
* Common Gateway Interface (CGI)
* Cache web
* Problèmes connus
[ Modifier le sommaire ]

## Principe

Le cache web enregistre des pages visitées sur un serveur pour les ré-afficher plus rapidement ensuite. Il doit comporter une date d'expiration qui dépend de la fréquence de changement des pages.
Ne pas utiliser de cache pour une préproduction sous peine de ne pas voir immédiatement ses modifications.

## Configuration du serveur

La mise en cache peut être configurée au moyen de plusieurs modules Apache :
Puis ajouter à apache2.conf :
Enfin, recharger Apache :

## Configuration du site

Côté HTML, on distingue trois balises méta.
Syntaxe sans cache (les unités sont en secondes) :
Syntaxe avec cache :
Pour voir la configuration du cache d'un site, il faut regarder l'entête HTTP, par exemple avec :
La durée d'expiration de la mémoire cache doit dépendre de la fréquence de rafraichissement du contenu du site. Toutefois d'une manière générale, il est recommandé de la définir à une valeur comprise entre 48 h et un an.

## Références

* ↑ http://httpd.apache.org/docs/2.4/caching.html
* ↑ https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Cache-Control
* ↑ http://www.i18nguy.com/markup/metatags.html
# Apache/Sites

* Installation d'Apache
* Plusieurs sites par machine
* Serveurs virtuels (vhost)
* Répertoires utilisateurs
* Ré-écriture d'URL
* .htaccess
* Sécurité
* Connexion sécurisée (HTTPS)
* Common Gateway Interface (CGI)
* Cache web
* Problèmes connus
* Installation d'Apache
* Plusieurs sites par machine
* Serveurs virtuels (vhost)
* Répertoires utilisateurs
* Ré-écriture d'URL
* .htaccess
* Sécurité
* Connexion sécurisée (HTTPS)
* Common Gateway Interface (CGI)
* Cache web
* Problèmes connus
[ Modifier le sommaire ]

## Unix/Linux
### Raccourcis

Tous les sites installés sur le serveur peuvent simplement être publiés depuis un lien symbolique qui pointe vers eux :
$ ln -s /usr/share/phpmyadmin /var/www/phpmyadmin
Ensuite ils sont accessibles par le même nom de domaine :
* //monAdresse/phpmyadmin
* //monAdresse/mediawiki

### apache2.conf

Les répertoires accessibles par Apache peuvent aussi être paramétrés dans :
Lignes :

### 000-default.conf

Pour ajouter un site, éditer :

### .htaccess

Un fichier .htaccess peut aussi gérer les sites.
    Pour plus de détails voir : Apache/.htaccess.

### UserDir

UserDir est un module Apache permettant d'accéder à un site différent par dossier d'utilisateur Unix (/home/...) en tapant son nom dans l'URL :
    Pour plus de détails voir : Apache/UserDir.

### Fichier hosts

Cette solution est la plus adaptée quand plusieurs domaines (donc URL) pointent vers le même serveur (adresse IP).
Dans un premier temps, il faut associer les noms des sites, à la manière des DNS :
Le contenu du fichier va servir à renvoyer les connexions de l'une des deux colonnes de chaque ligne, vers l'autre colonne de la même ligne :

## Windows

Une première solution est que chaque site soit un sous-répertoire de localhost.

### Fichier host

Même principe qu'en Unix-like dans C:\Windows\System32\drivers\etc\host.

## VirtualHost

Une fois que les noms des sites sont connus de l'hôte, des Vhost peuvent être définis avec.
    Pour plus de détails voir : Apache/Serveurs virtuels.

### Plusieurs comptes

Parfois on a besoin d'un compte utilisateur par site, par exemple pour y conférer des accès FTP différents. Dans ce cas il faut installer le module suExec et ajouter une ligne aux vhost de chaque site avec le nom et le groupe de leur compte Unix :
Puis :
Par ailleurs, le compte par défaut utilisé par Apache (www-data) peut être modifié dans :

## Références

* ↑ http://doc.ubuntu-fr.org/apache2
* ↑ httpd.apache.org
* ↑ http://doc.ubuntu-fr.org/tutoriel/virtualhosts_avec_apache2
* ↑ https://httpd.apache.org/docs/2.4/fr/suexec.html
# Apache/CGI

* Installation d'Apache
* Plusieurs sites par machine
* Serveurs virtuels (vhost)
* Répertoires utilisateurs
* Ré-écriture d'URL
* .htaccess
* Sécurité
* Connexion sécurisée (HTTPS)
* Common Gateway Interface (CGI)
* Cache web
* Problèmes connus
* Installation d'Apache
* Plusieurs sites par machine
* Serveurs virtuels (vhost)
* Répertoires utilisateurs
* Ré-écriture d'URL
* .htaccess
* Sécurité
* Connexion sécurisée (HTTPS)
* Common Gateway Interface (CGI)
* Cache web
* Problèmes connus
[ Modifier le sommaire ]
Le CGI (Common Gateway Interface) est une norme permettant à Apache d'exécuter des programmes écrits en n'importe quel langage (Bash, C, Java, Perl, PHP, Python...), du moment qu'il est exécutable et qu'il respecte certaines contraintes d'entrées/sortie.

## Configurer l'accès aux scripts CGI

Pour qu'Apache prenne en charge les scripts, il est nécessaire d'effectuer un minimum de paramétrage dans la configuration du site.

### ScriptAlias

La directive (de httpd.conf) :
précise le nom du répertoire où Apache est autorisé à exécuter des scripts CGI.
Exemple Unix :
Exemple Windows, utiliser le format URL (pas d'antislash) :
En fait le chemin /cgi-bin/ n'existe pas vraiment, il est dirigé vers le chemin des scripts défini par la directive, et cela permet d'écrire des URL comme http://serveur/cgi-bin/mon_script.

### ExecCGI

La clause suivante active l'option ExecCGI dans /var/www/cgi-bin, ce qui autorise Apache à exécuter les scripts sur le serveur :
Par exemple : vous écrivez un script essai.cgi, et vous voulez que /home/httpd/cgi-bin contienne les scripts.
Il faut donc au moins écrire :
L'appel à un script essai.cgi sera effectué par l'URL : http://serveur/cgi-bin/essai.cgi

### AddHandler

Cette clause permet de choisir les extensions de fichiers qui seront autorisés, ex :

### Récapitulatif

Exemple complet sur Windows, dans la configuration Apache :
Dans E:/www/cgi-bin/.htaccess :

## Écrire un programme CGI

La contrainte principale concerne la sortie du programme. Si un programme CGI génère des données sur sa sortie standard, il doit les précéder d'un en-tête HTTP permettant de les identifier.

### Bash

Voici un exemple de programme CGI écrit en bash :
Ce script génère une page HTML.

### Python

    Pour plus de détails voir : Programmation Python/L'interface CGI.

### VBS

Pour Windows.

## Références

* ↑ http://httpd.apache.org/docs/current/fr/howto/cgi.html
* ↑ http://wiki.uniformserver.com/index.php/CGI:_VBScript_CGI
# Apache/Installation de MS-SQL pour PHP

* Installation d'Apache
* Plusieurs sites par machine
* Serveurs virtuels (vhost)
* Répertoires utilisateurs
* Ré-écriture d'URL
* .htaccess
* Sécurité
* Connexion sécurisée (HTTPS)
* Common Gateway Interface (CGI)
* Cache web
* Problèmes connus
* Installation d'Apache
* Plusieurs sites par machine
* Serveurs virtuels (vhost)
* Répertoires utilisateurs
* Ré-écriture d'URL
* .htaccess
* Sécurité
* Connexion sécurisée (HTTPS)
* Common Gateway Interface (CGI)
* Cache web
* Problèmes connus
[ Modifier le sommaire ]
On distingue plusieurs pilotes PHP pour MS-SQL Server :
* mssql (désuet en PHP7).
* sqlsrv
* PDO
** pdo_sqlsrv
** pdo_dblib (Sybase)
** pdo_odbc (ODBC).

### Windows

Pour se connecter au serveur MS-SQL à partir d'un tout-en-un comme EasyPHP, il suffit de télécharger les pilotes .dll correspondant à sa version de PHP, puis d'indiquer leurs chemins dans le PHP.ini :
* Sous PHP 4, copier le fichier php_mssql.dll dans les extensions.
* Pour PHP 5.4 :
** Télécharger les .dll SQL30
** Les copier dans C:\PROGRA~2\EasyPHP\binaries\php\php_runningversion\ext
** Les ajouter dans C:\PROGRA~2\EasyPHP\binaries\php\php_runningversion\php.ini via les lignes suivantes :
    extension=php_sqlsrv_54_ts.dll
    extension=php_pdo_sqlsrv_54_ts.dll
* Dans PHP 5.5 on obtient toujours Fatal error: Call to undefined function sqlsrv_connect, donc upgrader ou downgrader PHP.
* Dans PHP 7 : cela fonctionne.
Pour vérifier l'installation, redémarrer le serveur Web, puis vérifier que la ligne pdo_sqlsrv s’est bien ajoutée dans la configuration (ex : http://127.0.0.1/home/index.php?page=php-page&display=extensions).

### Linux

Pour se connecter au serveur MS-SQL, il suffit de télécharger les pilotes .so correspondant à sa version de PHP, puis d'indiquer leurs chemins dans le PHP.ini :
Pour vérifier l'installation, redémarrer le serveur Web, puis vérifier que la ligne pdo_sqlsrv s’est bien ajoutée dans la configuration (ex : php -r "phpinfo;" |grep sql).

#### Paquets

Une alternative consiste à utiliser le gestionnaire de paquets :
Si les pilotes sont introuvables ensuite, il faut certainement désinstaller "unixodbc".

## Références

* ↑ http://www.microsoft.com/en-us/download/details.aspx?id=20098
* ↑ http://www.php.net/manual/fr/ref.pdo-sqlsrv.php
* ↑ https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server
* ↑ https://www.barryodonovan.com/2016/10/31/linux-ubuntu-16-04-php-and-ms-sql
* ↑ https://github.com/Microsoft/msphpsql