web-dev-qa-db-fra.com

PDOException “Impossible de trouver le pilote”

Je viens d’installer Debian Lenny avec Apache, MySQL et PHP et je reçois une exception PDOException could not find driver.

C'est la ligne de code spécifique à laquelle il fait référence:

$dbh = new PDO('mysql:Host=' . DB_Host . ';dbname=' . DB_NAME, DB_USER, DB_PASS)

DB_Host, DB_NAME, DB_USER et DB_PASS sont des constantes que j'ai définies. Cela fonctionne bien sur le serveur de production (et sur ma précédente configuration de serveur Ubuntu).

Est-ce que cela a quelque chose à voir avec mon installation de PHP?

La recherche sur Internet n'a pas aidé, tout ce que je reçois est un échange d'experts et des exemples, mais aucune solution.

236
Mike Moore

Vous devez avoir un module appelé pdo_mysql. Vous cherchez à suivre dans phpinfo (),

pdo_mysql

PDO Driver for MySQL, client library version => 5.1.44
199
ZZ Coder

Le DSN dans votre code indique que vous essayez de vous connecter avec le pilote mysql. Votre message d'erreur indique que ce pilote est indisponible.

Vérifiez que l’extension mysql est installée sur votre serveur.

Dans Ubuntu/Debian, vous vérifiez le paquet avec:

dpkg --get-selections | grep php | grep mysql

Installez le paquet php5-mysql si vous ne l'avez pas. 

Dans Ubuntu/Debian, vous pouvez utiliser:

  • PHP5: Sudo apt-get install php5-mysql
  • PHP7: Sudo apt-get install php7.0-mysql

Enfin, pour le faire fonctionner, vous devrez redémarrer votre serveur Web:

  • Apache: Sudo /etc/init.d/Apache2 restart
  • Nginx: Sudo /etc/init.d/nginx restart
174
ghbarratt

Mise à jour : Les versions les plus récentes doivent utiliser le package php-sqlite3 au lieu de php5-sqlite. Donc utilisez ceci si vous utilisez une version récente d'ubuntu:

Sudo apt-get install sqlite php-sqlite3

La réponse originale à la question est ici:

Sudo apt-get install sqlite php5-sqlite
Sudo /etc/init.d/Apache2 restart

Si votre phpinfo () n'affiche pas la ligne pdo_sqlite (dans mon cas, sur mon serveur Ubuntu), il vous suffit de lancer les lignes ci-dessus et vous pourrez continuer.

71
Sudipta Chatterjee

Pour les versions plus récentes d'Ubuntu disposant de PHP 7.0, vous pouvez obtenir le package php-mysql:

Sudo apt-get install php-mysql

Puis redémarrez votre serveur:

Sudo service Apache2 restart
21
FinkAvenue

Sur ma machine Windows, je devais donner le chemin absolu à l'extension dir dans mon php.ini:

extension_dir = "c:\php5\ext"

21
berdzi

J'ai eu le même problème. La solution dépend du système d'exploitation. Dans mon cas, j'ai debian, donc pour le résoudre:

  • Mise à jour de ma version php de ( php5 à php7 )
  • Installer php-mysql et php7.0-mysql

    apt-get install php-mysql
    apt-get install php7.0-mysql
    
  • J'ai modifié mon php.ini localiser à /etc/php/7.0/Apache2/php.ini

    uncomment the line : extension=php_pdo_mysql.dll
    
  • Puis redémarrez Apache:

    service Apache2 restart
    

Cela résout mon problème

14
onlyme

Sur Ubuntu, exécutez simplement 

Sudo apt-get install php5-mysql
14
Dmitry Sobolev
Sudo apt-get install php-mysql 

a bien fonctionné sur Ubuntu et PHP 7

8
Moses Nandwa

Lors de l'ajout de ceux-ci dans votre fichier php.ini, assurez-vous que la référence à php_pdo.dll est la première avant les dll des pilotes de base de données, faute de quoi ce message d'erreur s'affichera également. Ajoutez-les comme ceci:

[PHP_PDO]
extension=php_pdo.dll
[PHP_PDO_MYSQL]
extension=php_pdo_mysql.dll
5
Paul Foster

Avez-vous vérifié votre php.ini (vérifiez le bon emplacement avec phpinfo ()) si MySQL et le pilote sont installés correctement?

5
cem

Pour PHP 5.5 sur CentOS, j'ai résolu ce problème en installant le package php55-mysqlnd.

Sudo yum -y install php55w-mysqlnd # For Webtatic
Sudo yum -y install php55u-mysqlnd # For Remi

Pour obtenir de l'aide pour l'installation, écrivez un commentaire, cela dépend de la manière dont PHP est installé sur votre système. Les pensions disponibles sont webtatic et remi.

4
SimonW

pour Windows 8.1/10 dans: le fichier \\ php.ini vous devez annuler le commentaire de la ligne "extension = pdo_mysql"

3
Egor Doynikov

J'ai passé la dernière journée à essayer de comprendre pourquoi j'avais l'erreur suivante. Je suis sous Ubuntu 14.04. 

Le problème: 
J'ai remarqué que ma version de PHP-CLI fonctionnait sous php7.0 mais php_info () (la version Web) affichait php 5.5.9. Même si php_info () a dit que pdo était activé, utiliser la ligne de commande (CLI) ne reconnaissait pas la commande pdo_mysql. Il s'avère que mysql a été activé pour mon ancienne version mais pas pour la version CLI. Tout ce que j'ai fait est d'installer mysql pour php7.0 et cela a fonctionné.

C'est ce qui a fonctionné:

Pour vérifier la version:

php -v

Pour installer mysql pour php7.0

Sudo apt-get install php7.0-mysql

1) assurez-vous que votre version de la CLI est identique à votre version Web 
2) Si elles sont différentes, assurez-vous que votre version de la CLI contient le plug-in mysql, car elle ne l’a pas par défaut. 

3
Growling Flea

Je recommande vivement mysqllnd au lieu de mysql car vous auriez beaucoup de problèmes comme la conversion de nombre et le type de bit évalue le problème avec l'extension mysql.

sur ubuntu, installez mysqllnd avec la commande suivante:

Sudo apt-get install php5-mysqlnd
2
MSS

Dans mon cas, ma chaîne DSN était incorrecte. En particulier, elle ne contenait pas mysql://. Je me serais attendu à un message d'erreur différent, par exemple "La chaîne DSN ne spécifie pas le pilote/protocole".

L'ajout de mysql:// au début de la chaîne DSN a résolu le problème.

2
gposton

Le problème est un php manquant dans la bibliothèque mysql. Dans CentOs je l'ai corrigé en exécutant # yum install php-mysql puis redémarrer Apache avec # /bin/systemctl restart httpd.service Notez que le nom est légèrement différent des distributions basées sur debian/Ubuntu, php-> php5 et httpd-> Apache2.

Vérifiez si extension_dir dans le fichier de configuration php est correctement défini. Essayez de commenter/décommenter certaines extensions et voir si elles sont reflétées sur phpinfo () . Sinon, le fichier de configuration php ne peut pas être chargé (emplacement incorrect) extension_dir est commenté ou défini sur un mauvais emplacement. 

2
hserge

Vérifiez si le module est disponible avec php -m | grep pdo_mysql.

Sinon, pour PHP 7.2, vous pouvez installer le package pertinent avec Sudo apt install php7.2-mysql.

Utilisez une commande similaire sur les autres versions PHP et les gestionnaires de paquets.

1
Pratik

Une autre chose à confirmer, car certaines personnes copient/collent un exemple de code à partir d’Internet pour commencer. Assurez-vous que MySQL est entré ici: 

... $dbh = new PDO ("mysql: ...  

Dans certains exemples, cela montre 

$dbh = new PDO ("dblib ...
1
Joe

J'ai eu le même problème lors de l'exécution de tests avec un fichier php.ini séparé. J'ai dû ajouter ces lignes à mon propre fichier php.ini:

[PHP]
extension = mysqlnd.so
extension = pdo.so
extension = pdo_mysql.so

Avis: Exactement dans cet ordre

1
Facedown

Vérifiez le chemin correct dans extension_dir dans votre phpinfo ().

1
Alexandr Nizhnik

J'ai rencontré le même problème après avoir supprimé le paquet php5 (qui inclut également tous les pilotes) afin d'installer le paquet php7. En fait, j'ai installé le paquet php7 sans module mysql.

J'ai réussi à le résoudre en tapant dans le terminal:

1) $ apt-cache search php7 Qui répertorie tous les modules, en parcourant les modules que j'ai trouvés,

php7.0-mysql - Module MySQL pour PHP

2) $ Sudo apt-get install php7.0-mysql

C'est tout. Cela a fonctionné pour moi dans mon système Linux.

(utilisez la version php appropriée, la vôtre pourrait être php5)

1
Roshimon

J'ai résolu ce problème sur ma Debian 6 . Normalement, je viens d'installer le paquet php5-common. Après l'installation, vous devez redémarrer votre serveur Web (Apache ou nginx en fonction de celui que vous avez installé) . Ensuite, je fais juste une lsof sur l'identifiant du processus Apache (lsof -p process_id) comme suit:

Sudo lsof -p 1399   #replace 1399 by your Apache process id
Apache2 1399 root  mem    REG  254,2    80352 227236 /usr/lib/php5/20090626/xmlrpc.so
Apache2 1399 root  mem    REG  254,2   166496 227235 /usr/lib/php5/20090626/suhosin.so
Apache2 1399 root  mem    REG  254,2    31120 227233 /usr/lib/php5/20090626/pdo_mysql.so
Apache2 1399 root  mem    REG  254,2   100776 227216 /usr/lib/php5/20090626/pdo.so
Apache2 1399 root  mem    REG  254,2   135864 227232 /usr/lib/php5/20090626/mysqli.so

Comme vous pouvez le voir ci-dessus, les modules sont installés sur un chemin de fichier inconnu ou guidé par le chemin de la bibliothèque commune:/usr/lib/php5/20090626/. Pour votre installation, il peut être différent, mais uniquement le chemin de pdo_mysql.so, pdo.so, mysqli.so. Donc, c'est pourquoi Drupal ou tout autre moteur php n'a pas pu trouver la bibliothèque et affiche cette erreur: PDOException: could not find driver

Je ne sais tout simplement pas pourquoi il est installé sur un chemin aussi étrange, pour moi il ne s'agit que d'un bogue dans le script d'installation du paquet de bibliothèque dans debian 6 . J'ai résolu le problème en créant un symbole pour tous les fichiers sous /usr/lib/php5/20090626/ à /usr/lib/php5/ avec cette commande:

ln -s /usr/lib/php5/20090626/* /usr/lib/php5/

1
douggynix

Pour ceux qui utilisent Symfony2/3 et se demandent pourquoi vous obtenez cette erreur. Si vous utilisez "mapping_types", vous pouvez rencontrer cette erreur. La raison en est que "mapping_types" est placé au mauvais niveau. Par exemple :

doctrine:
  dbal:
    mapping_types:
        set: string

Ce "mapping_types" doit être placé à ce niveau:

doctrine:
dbal:
    #To counter the error caused by 'mapping_types'
    connections:
        default:
            server_version: %database_server_version%
            mapping_types:
                set: string

J'espère que ça aide

J'ai trouvé la solution ici: https://github.com/doctrine/DoctrineBundle/issues/327

1
aneth101

Partout où je vais, je lis que le chemin de extension_dir devrait passer de ext à un chemin absolu. Cela a fonctionné pour moi. Cependant, lorsque je tentais de créer un serveur sur le PC de mon collègue, je devais laisser la valeur à ext au lieu de définir un chemin absolu.

Si vous avez mis un chemin absolu et que l'extension n'est toujours pas trouvée, envisagez d'essayer les deux avec le chemin absolu et ext.

1
papillon

Dans mon cas, j'utilisais PDO avec php-cli, et cela fonctionnait bien.

Ce n’est que lorsque j’ai essayé de me connecter à partir d’Apache que j’ai eu le problème du "pilote manquant", que je ne comprenais pas bien.

Un simple apt-get install php-mysql l'a résolu. (Ubuntu 16.04/PHP7. Les crédits vont à la réponse sélectionnée et au commentaire d'Ivan)

J'espère que ça peut aider.

1
Balmipour

Avait le même problème, parce que j'ai oublié d'aller dans ma machine virtuelle. Si je vais dans mon répertoire local comme ceci:

cd /www/Homestead/my_project
php artisan migrate

cette erreur apparaîtra. Mais cela fonctionne sur ma machine virtuelle

cd ~/Homestead
vagrant ssh   
cd /www/Homestead/my_project
php artisan migrate
0
Adam

Pour Linux Mint

J'ai eu le même problème en utilisant PhpBrew (5.5.9/7.0.14) et en essayant de créer une connexion PDO.

Après avoir essayé la plupart des solutions sur ce post, j’ai fait ce qui suit:

  1. Éteint PhpBrew 

  2. Sudo apt-get install php7.0 exécuté (Linux Mint 17.2/PHP7.0.16) - Nouvelle version de php installée

0
Andrei .K
PHP Fatal error:  Uncaught PDOException: could not find driver

Je me suis battu et je me suis battu avec "apt install php-mysql php7toInfinity et n'oubliez pas sqlite-what-ever's" et je ne pouvais tout simplement pas me débarrasser de ce message d'erreur avant de revenir à l'essentiel et de réinitialiser les permissions de fichier sur le site Web Dans la question.

Ces 3 commandes réinitialisent les autorisations de fichier et de dossier sur le site Web et permettent de le faire fonctionner à nouveau.

cd /var/www/web-site-name.com/web/

# find (sub) directories and change permissions
find . -type d -exec chmod 755 {} \;

# find files and change permissions
find . -type f -exec chmod 664 '{}' \;
0
SamTzu

Si vous utilisez sqlite pour le test, vous aurez besoin du lecteur php sqlite . Vous pouvez les installer comme suit.

Pour Ubuntu 14.04

Sudo apt-get install php5-sqlite
Sudo service Apache2 restart

Dans Ubuntu 16.04, il n'y a pas de php5-sqlite

Sudo apt-get install php7.0-sqlite
Sudo service Apache2 restart
0

J'ai eu la même exception en essayant d'utiliser pdo_sqlite. Le problème était que les liens symboliques 20-pdo_sqlite.ini et 20-sqlite3.ini créés automatiquement (dans /etc/php5/mods-enabled) étaient rompus.

Supprimer les liens symboliques rompus et les ajouter manuellement avec:

  • Sudo ln -s /etc/php5/mods-avaliable/pdo_sqlite.ini /etc/php5/mods-enabled/20-pdo_sqlite.ini
  • Sudo ln -s /etc/php5/mods-avaliable/sqlite3.ini /etc/php5/mods-enabled/20-sqlite3.ini

résolu le problème.

Note: cela ne fonctionnera pas pour les anciennes versions de php car elles ne recherchaient pas de configuration dans /etc/php5/mods-enabled

0
ioleo

L'installation incorrecte de PHP a été appelée

Je rencontrais le même problème. Et j'espère que cela aiderait quelqu'un qui a un problème similaire à moi.

Scénario  

OS = Windows 10  
Platform = XAMPP  
PHP Version = 7 (Multiple Version seem to have been installed in the PC)  

J'ai créé le fichier phpinfo.php dans le dossier public et exécuté la phpinfo() pour rechercher l'emplacement de mon fichier php.ini.

Emplacement PHP.ini = c:\xampp\php\php.ini 

Problème
L'appel c:\xampp\htdocs> php -v a renvoyé PHP 7.2.3 mais phpinfo.php a affiché PHP 7.2.2

Solution
Au lieu d'appeler 

php artisan migrate:install   

qui m'a donné cette erreur, j'ai utilisé 

c:\xampp\php\php artisan migrate:install

et cela a fonctionné.

0
SollyM
$DB_TYPE = 'mysql'; //Type of database<br>
$DB_Host = 'localhost'; //Host name<br>
$DB_USER = 'root'; //Host Username<br>
$DB_PASS = ''; //Host Password<br>
$DB_NAME = 'database_name'; //Database name<br><br>

$dbh = new PDO("$DB_TYPE:Host=$DB_Host; dbname=$DB_NAME;", $DB_USER, $DB_PASS); // PDO Connection

Cela a fonctionné pour moi.

0
Persianuser