PDOException «n'a pas pu trouver le pilote»

292

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

Il s'agit de la ligne de code spécifique à laquelle il se réfère:

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

DB_HOST, DB_NAME, DB_USEREt DB_PASSsont des constantes que j'ai définies. Cela fonctionne très bien sur le serveur de production (et sur ma configuration précédente d'Ubuntu Server).

Est-ce quelque chose à voir avec mon installation PHP?

La recherche sur Internet n'a pas aidé, tout ce que j'obtiens, c'est l'échange d'experts et d'exemples, mais pas de solutions.

Mike Moore
la source
21
Regardez dans votre php.ini' file and uncomment extension = php_pdo_mysql.dll . The path to your Le fichier php.ini` peut être trouvé en regardant votre phpinfo ().
styfle
3
Pour info à tous les futurs lecteurs, si vous obtenez cette erreur et que GoDaddy est votre hôte, connectez-vous à votre compte administrateur. Détails d'hébergement-> Langages de programmation. Mettez à niveau votre version PHP vers la dernière version ou au moins 5.4
Joe
@Joe J'ai mis à jour mais j'ai toujours une erreur (GoDaddy)
Eugen Sunic
@styfle 1up, Sur une machine Linux, je mets extension=msql.soet ça marche!
AjayKumarBasuthkar
À qui cela peut concerner: si vous utilisez php 7.1+ sur docker, vous pouvez docker execdans le conteneur et exécuter docker-php-ext-install pdo pdo_mysql.
cleybertandre

Réponses:

240

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
Codeur ZZ
la source
2
@ZZ Coder Ce n'est pas présent dans phpinfo (). Savez-vous comment je peux installer pdo_mysql?
Mike Moore
14
@letseatfood ... Comment avez-vous compris cela? J'ai le même problème!
Hristo
17
Je peux recommander le paquet Ubuntu "php5-mysql" pour installer le support PDO pour MySQL
Tom Carver
3
Notez que, pour ceux qui utilisent Apache ou un autre serveur Web, il faut redémarrer Apache pour que les modifications prennent effet:sudo systemctl restart httpd.service
Mugoma J. Okomba
50
Pour Ubuntu 16.04 et PHP7sudo apt-get install php-mysql
Ivan Marjanovic
199

Le DSN dans votre code révèle que vous essayez de vous connecter avec le pilote mysql. Votre message d'erreur indique que ce pilote n'est pas disponible.

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
ghbarratt
la source
3
ahh ... le redémarrage est ce qui m'a mordu!
KOGI
J'ai eu le même problème, assurez-vous de redémarrer php5-fpm!
Eko3alpha
J'ai passé presque toute une nuit à essayer de résoudre ce problème, jusqu'à ce que je voie votre réponse. Avait tout fait correctement mais avait oublié de redémarrer apache.
Mugoma J. Okomba
php-mysql est déjà la dernière version (1: 7.1 + 49 + deb.sury.org ~ xenial + 4). Lorsque vous essayez d'exécuter la commande sudo apt-get install php-mysql dans ubuntu 16.04 avec nginx php fpm, je redémarre également le php fpm puis redémarrez le nginx.
Prashant Barve du
Actuellement, il semble que ce soit php-mysql et php7.1-mysql. Avec un peu de chance, c'est le schéma qui va de l'avant.
John P
83

Mise à jour : les versions plus récentes devraient utiliser le php-sqlite3package au lieu de php5-sqlite. Utilisez donc 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 d'exécuter les lignes ci-dessus et vous serez prêt à partir.

Sudipta Chatterjee
la source
57
Pourquoi avez-vous donné des instructions pour sqlite lorsque l'OP utilise MySQL?
Andrew Ensley
7
@Andrew si vous utilisez pdo_sqliteet n'avez pas installé, php5-sqlitevous obtenez uniquement un PDOExceptionsans aucune information sur sqlite manquant et essayez d'installer php5-mysqldeux fois.
Aitch le
2
Notez que php5-sqlite est devenu obsolète et peut ne plus être disponible pour votre système, c'est-à-dire Ubuntu 16.04. Installez plutôt php-sqlite3.
Matthias
2
@briankip Bien sûr, si vous essayez de vous connecter à SQLite et que ce pilote est manquant. Mais l'OP essaie de se connecter à MySQL. L'installation de sqlite ne pourrait / ne pourrait pas résoudre son problème.
Andrew Ensley
2
@AndrewEnsley. Le titre de cette page est l'erreur que tout le monde obtient quelle que soit sa plate-forme db. En conséquence, cette page a LE classement de recherche Google le plus élevé si vous recherchez uniquement l'erreur sur Google. Par conséquent, OMI, toute réponse à cette question concernant d'autres bases de données devrait être la bienvenue ici. S'ils ne travaillent pas pour l'OP, tant pis ... OP n'a pas à accepter ces réponses. Cela ne signifie pas que cette réponse n'est pas "utile" pour les autres enquêtant sur le message d'erreur dans le titre qui a donné à cette question le rang de recherche de Zoltar. +1
elrobis
34

Pour les versions plus récentes d'Ubuntu qui ont PHP 7.0, vous pouvez obtenir le php-mysqlpackage:

sudo apt-get install php-mysql

Redémarrez ensuite votre serveur:

sudo service apache2 restart
ThomasAFink
la source
Je pense que de nos jours, vous devez être spécifique avec la version sudo apt-get install php7.2-mysql
Stan Sokolov
25

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 )
  • Installez php-mysql et php7.0-mysql

    apt-get install php-mysql
    apt-get install php7.0-mysql
  • J'ai modifié ma php.inilocalisation sur /etc/php/7.0/apache2/php.ini

    uncomment the line : extension=php_pdo_mysql.dll
  • Redémarrez ensuite apache:

    service apache2 restart

Cela résout mon problème

seulement moi
la source
En aparté pour ceux comme moi qui a trouvé cela ne suffit pas tout à fait et ne veulent pas passer par les étapes pour supprimer complètement php5 avant de vérifier que php7 fonctionnera: a2dismod php5, a2enmod php7.0et service apache2 restartenfin me suis à nouveau opérationnel.
depwl9992
21

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

extension_dir = "c:\php5\ext"

berdzi
la source
2
Je viens de confirmer que c'est vrai (Win2008). Étrange - les autres extensions fonctionnent uniquement avec les recommandées extension_dir = "ext", mais pas avec celle-ci.
scipilot
pareil ici. a ajouté le chemin et a commencé à travailler. Windows10, php7.1
Chris Gibb
14

Sur Ubuntu, il suffit d'exécuter

sudo apt-get install php5-mysql
Dmitry Sobolev
la source
1
J'étais derrière un Symfony2 et Ubuntu. Pdo_mysql est introuvable ([PDOException] n'a pas pu trouver le pilote). Cela a résolu le problème.
Reinherd
2
Pour moi, je sudo apt-get install php5-pgsql
manquais de
@Kzqai 2h30 maintenant et vous venez de résoudre mon problème, je n'utilisais pas mysql j'utilisais postgres (> ლ)
Dheeraj
9
sudo apt-get install php-mysql 

a bien fonctionné sur ubuntu et php 7

Moses Nandwa
la source
Cela a fonctionné pour moi, bien que je n'utilise pas php7 mais php5.6. Mais j'en ai installé 7. J'ai installé 5.6 plus tard et je suis passé à cela sans désinstaller php7
Mubashar Abbas
9

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

Sinon, pour PHP 7.2, vous pouvez installer le package approprié avec sudo apt install php7.2-mysql.

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

Pratik
la source
6

Lorsque vous les ajoutez dans votre php.ini, assurez-vous que la référence php_pdo.dll est la première avant les DLL des pilotes db, sinon cela provoquera également ce message d'erreur. Ajoutez-les comme ceci:

[PHP_PDO]
extension=php_pdo.dll
[PHP_PDO_MYSQL]
extension=php_pdo_mysql.dll
Paul Foster
la source
2
depuis PHP v5.3 le php_pdo.dllmodule n'est plus requis (n'existe plus). php.net/manual/en/pdo.installation.php est probablement la réponse ultime à cette question.
Martin Zeitler
5

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

cem
la source
2
Je recherche dans php.ini, mais que dois-je rechercher? Je vois une section qui commence par[MySQL]
Mike Moore
4

Pour PHP 5.5sur CentOSj'ai corrigé cela en installant le php55-mysqlndpackage.

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

Pour obtenir de l'aide sur l'installation, écrivez un commentaire car cela dépend de la façon dont PHP est installé sur votre système. Les repo disponibles sont webtaticet remi.

SimonW
la source
4

pour Windows 8.1 / 10 dans le fichier: \\ php.ini, vous devez décommenter la ligne "extension = pdo_mysql"

Egor Doynikov
la source
3

Dans mon cas, ma chaîne DSN était incorrecte, en particulier, elle ne contenait pas, mysql://. je m'attendais à un message d'erreur différent, peut-être quelque chose comme «La chaîne DSN ne spécifie pas le pilote / protocole».

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

gposton
la source
3

J'ai passé la dernière journée à essayer de comprendre pourquoi j'obtenais l'erreur suivante. J'utilise Ubuntu 14.04.

Le problème:
j'ai remarqué que ma version PHP-CLI exécutait php7.0 mais php_info () (la version Web) affichait php 5.5.9. Même si php_info () a déclaré que pdo était activé, l'utilisation de la ligne de commande (CLI) ne reconnaissait pas la commande pdo_mysql. Il s'avère que mysql était activé pour mon ancienne version mais pas la version CLI. Tout ce que j'ai fait, c'est installer mysql pour php7.0 et il a pu fonctionner.

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 CLI est la même que votre version web
2) S'ils sont différents, assurez-vous que votre version CLI possède le plug-in mysql car il ne vient pas avec elle par défaut.

Puce grognante
la source
2

Vérifiez si extension_dir dans le fichier de configuration php défini correctement. Essayez de commenter / décommenter certaines extensions et voyez si cela se reflète sur phpinfo (). Si ce n'est pas le cas, le fichier de configuration php ne peut pas être chargé (mauvais emplacement). Extension_dir est commenté ou défini au mauvais emplacement.

hserge
la source
2

Le problème est un php manquant à la bibliothèque mysql. Dans CentOs, je l'ai corrigé en exécutant # yum install php-mysqlpuis en redémarrant apache avec # /bin/systemctl restart httpd.serviceRemarque: le nom est légèrement différent des distributions basées sur debian / ubuntu, php-> php5 et httpd-> apache2.

Japheth Ongeri - inkalimeva
la source
2

J'ai eu le même problème lors de l'exécution de tests avec 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

Remarque: exactement dans cet ordre

Face cachée
la source
2

Je recommande fortement mysqllndau lieu de mysqlcar vous auriez beaucoup de problèmes comme la conversion de nombre et le type de bit évalue le problème avecmysql extension.

sur l'installation d'ubuntu mysqllndavec la commande suivante:

sudo apt-get install php5-mysqlnd
MSS
la source
1

J'ai résolu ce problème sur ma Debian 6. Normalement, je venais juste d'installer le php5-commonpaquet. Après l'installation, vous devez redémarrer votre serveur Web (apache ou nginx selon celui que vous avez installé). Ensuite, je fais juste un lsofsur le processus apache id ( 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 bibliothèque commun: / 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 montre cette erreur:PDOException: could not find driver

Je ne sais pas pourquoi il est installé sur un chemin bizarre, pour moi il est juste un bug dans le script d'installation de package bibliothèque dans debian 6. Je résolu le problème en créant une symbolique pour tous les fichiers sous /usr/lib/php5/20090626/à /usr/lib/php5/cette commande:

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

douggynix
la source
php-mysql est déjà la dernière version (1: 7.1 + 49 + deb.sury.org ~ xenial + 4).
Prashant Barve du
1
$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.

Persianuser
la source
1
sans pilote, cet utilisateur recevra toujours la même exception
eggmatters
1

J'ai rencontré le même problème après avoir supprimé le package php5 (qui inclut également tous les pilotes) afin d'installer le package php7. J'ai en fait 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)

Roshimon
la source
1

Juste une autre chose à confirmer car certaines personnes copient / collent un exemple de code sur Internet pour commencer. Assurez-vous que MySQL est entré ici:

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

Dans certains exemples, cela montre

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

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

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 très bien.

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

J'espère que cela peut aider.

Balmipour
la source
1

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

aneth101
la source
1

Partout où je vais, je lis que le chemin de extension_dirdoit être changé de extà un chemin absolu. Ça a marché pour moi. Cependant, lorsque j'ai essayé de construire un serveur du PC de mon collègue, j'ai dû laisser la valeur à extau lieu de mettre un chemin absolu.

Si vous avez mis un chemin absolu et que c'est le cas, l'extension n'est toujours pas trouvée, envisagez d'essayer à la fois avec le chemin absolu et ext.

papillon
la source
1

Une installation incorrecte de PHP était 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éé un phpinfo.phpfichier dans le publicdossier et exécuté le phpinfo()pour rechercher l'emplacement de mon php.inifichier.

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

Problème L'
appel c:\xampp\htdocs> php -vest revenu PHP 7.2.3mais a phpinfo.phpmontré 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 ça a marché.

RealSollyM
la source
1

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

Alexandr Nizhnik
la source
1
PHP Fatal error:  Uncaught PDOException: could not find driver

J'ai lutté et lutté 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 aux bases et de réinitialiser les autorisations de fichier sur le site Web Dans la question.

Ces 3 commandes réinitialisent les autorisations de fichiers et de dossiers sur le site Web et le font 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 '{}' \;
SamTzu
la source
0

J'ai eu la même exception lors de la tentative d'utilisation pdo_sqlite. Le problème était que les liens créés automatiquement 20-pdo_sqlite.iniet les 20-sqlite3.iniliens symboliques (in /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.

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

ioleo
la source