'could not find driver Debian SQL Server PHP

I have a Laravel installation running on a Debian 9.9 server and PHP 7.4.

I need to connect to a SQL Server database on a remote Windows server.

I followed this guide to install the PHP extensions: https://docs.microsoft.com/en-us/sql/connect/php/installation-tutorial-linux-mac?view=sql-server-ver15#installing-the-drivers-on-debian-8-9-and-10

And this one to install the ODBC drivers: https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15

I also tried reinstalling PHP.

But even after doing all this, I still can't connect to the database and get this error:

could not find driver (SQL: select * from [table] where [column] = 123)

Thanks

EDIT

This is are the lines where PDO is mentioned in the result of phpinfo()

PDO support => enabled
PDO drivers => mysql, sqlsrv

pdo_sqlsrv

pdo_sqlsrv support => enabled
ExtensionVer => 5.8.0

Directive => Local Value => Master Value
sqlsrv.ClientBufferMaxKBSize => 10240 => 10240
sqlsrv.LogSeverity => 0 => 0
sqlsrv.LogSubsystems => 0 => 0
sqlsrv.SetLocaleInfo => 2 => 2
sqlsrv.WarningsReturnAsErrors => On => On

php --ini shows that these two extensions are enabled:
/etc/php/7.4/cli/conf.d/pdo_sqlsrv.ini,
/etc/php/7.4/cli/conf.d/sqlsrv.ini

PDO::getAvailableDrivers() returns the following:

Array
(
    [0] => mysql
    [1] => sqlsrv
)


Solution 1:[1]

Turns out the problem was the Apache configuration. Even after reinstalling it, for some reason I had still an old configuration loaded. I had installed the driver on 7.4 and apache was still serving 7.3.

I solved it by doing:

sudo a2dismod php7.3
sudo a2enmod php7.4
sudo service apache2 restart

Solution 2:[2]

Please try the following, create a php file (ex: PDO.php) in some directory and insert the following content into it:

<?php
    print_r(PDO::getAvailableDrivers());
?>

then run this file as follows:

leo@alpha:~$ php PDO.php

Terminal should return an array of available PDO drivers. This way you can check if PHP really has the SQL driver enabled. In my case:

Array
(
    [0] => mysql
    [1] => pgsql
    [2] => sqlsrv
)

Also check that in the Laravel directory, the .env file has correctly configured the connection parameters to the SQL server ...

DB_CONNECTION=sqlsrv
DB_HOST=localhost
DB_PORT=1433
DB_DATABASE=project
DB_USERNAME=sa
DB_PASSWORD=password

I wish you can solve your problem.

* EDIT 1 *

Please try the following:

First, create a file inside the root directory of your web server (ex: index.php), and inside it, insert the following content:

<?php
    php_info();
?>

access that file through your browser, and it should return all the php settings that apache is using. Look in the PDO section, if you have the SQL Server driver loaded ..

Solution 3:[3]

Debian 9/10

Install Sury APT repository

sudo apt update
sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list
wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add -
sudo apt update

Install your desired php version

sudo apt install php7.2  php7.4  php8.0

Install additional desired modules (change x.x with version)

sudo apt install phpx.x-{mysql,cli,common,imap,ldap,xml,fpm,curl,mbstring,zip}

For php 7.2:

sudo update-alternatives --set php /usr/bin/php7.2
sudo update-alternatives --set phar /usr/bin/phar7.2
sudo update-alternatives --set phar.phar /usr/bin/phar.phar7.2
sudo update-alternatives --set phpize /usr/bin/phpize7.2
sudo update-alternatives --set php-config /usr/bin/php-config7.2

sudo apt install php7.2-dev

sudo pecl config-set php_ini /etc/php/7.2/fpm/php.ini
sudo pecl config-set ext_dir /usr/lib/php/20170718/

sudo pecl -d php_sufix=7.2 install sqlsrv
sudo pecl -d php_sufix=7.2 install pdo_sqlsrv
sudo su
printf "; priority=20\nextension=sqlsrv.so\n" > /etc/php/7.2/mods-available/sqlsrv.ini
printf "; priority=30\nextension=pdo_sqlsrv.so\n" > /etc/php/7.2/mods-available/pdo_sqlsrv.ini
exit
sudo phpenmod -s fpm -v 7.2 sqlsrv pdo_sqlsrv
sudo phpenmod -s apache2 -v 7.2 sqlsrv pdo_sqlsrv
sudo phpenmod -s cli -v 7.2 sqlsrv pdo_sqlsrv

sudo service php7.2-fpm restart
sudo service apache2 restart

For php 7.4:

sudo update-alternatives --set php /usr/bin/php7.4
sudo update-alternatives --set phar /usr/bin/phar7.4
sudo update-alternatives --set phar.phar /usr/bin/phar.phar7.4
sudo update-alternatives --set phpize /usr/bin/phpize7.4
sudo update-alternatives --set php-config /usr/bin/php-config7.4

sudo apt install php7.4-dev

sudo pecl config-set php_ini /etc/php/7.4/fpm/php.ini
sudo pecl config-set ext_dir /usr/lib/php/20190902

sudo pecl -d php_sufix=7.4 install sqlsrv
sudo pecl -d php_sufix=7.4 install pdo_sqlsrv
sudo su
printf "; priority=20\nextension=sqlsrv.so\n" > /etc/php/7.4/mods-available/sqlsrv.ini
printf "; priority=30\nextension=pdo_sqlsrv.so\n" > /etc/php/7.4/mods-available/pdo_sqlsrv.ini
exit
sudo phpenmod -s fpm -v 7.4 sqlsrv pdo_sqlsrv
sudo phpenmod -s apache2 -v 7.4 sqlsrv pdo_sqlsrv
sudo phpenmod -s cli -v 7.4 sqlsrv pdo_sqlsrv

sudo service php7.4-fpm restart
sudo service apache2 restart

For php 8.0:

sudo update-alternatives --set php /usr/bin/php8.0
sudo update-alternatives --set phar /usr/bin/phar8.0
sudo update-alternatives --set phar.phar /usr/bin/phar.phar8.0
sudo update-alternatives --set phpize /usr/bin/phpize8.0
sudo update-alternatives --set php-config /usr/bin/php-config8.0

sudo apt install php8.0-dev

sudo pecl config-set php_ini /etc/php/8.0/fpm/php.ini
sudo pecl config-set ext_dir /usr/lib/php/20200930

sudo pecl -d php_sufix=8.0 install sqlsrv
sudo pecl -d php_sufix=8.0 install pdo_sqlsrv
sudo su
printf "; priority=20\nextension=sqlsrv.so\n" > /etc/php/8.0/mods-available/sqlsrv.ini
printf "; priority=30\nextension=pdo_sqlsrv.so\n" > /etc/php/8.0/mods-available/pdo_sqlsrv.ini
exit
sudo phpenmod -s fpm -v 8.0 sqlsrv pdo_sqlsrv
sudo phpenmod -s apache2 -v 8.0 sqlsrv pdo_sqlsrv
sudo phpenmod -s cli -v 8.0 sqlsrv pdo_sqlsrv

sudo service php8.0-fpm restart
sudo service apache2 restart

Check loaded modules

php -m

Or just check sqlsrv

php -m | grep sqlsrv

Common trouble:

pecl extension fails because already installed

Just uninstall it:

sudo pecl -d php_sufix=7.2 uninstall sqlsrv
sudo pecl -d php_sufix=7.2 uninstall pdo_sqlsrv

sudo pecl -d php_sufix=7.4 uninstall sqlsrv
sudo pecl -d php_sufix=7.4 uninstall pdo_sqlsrv

sudo pecl -d php_sufix=8.0 uninstall sqlsrv
sudo pecl -d php_sufix=8.0 uninstall pdo_sqlsrv

then try again.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Samuele Cavalleri
Solution 2
Solution 3