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.
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
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:
Sudo apt-get install php5-mysql
Sudo apt-get install php7.0-mysql
Enfin, pour le faire fonctionner, vous devrez redémarrer votre serveur Web:
Sudo /etc/init.d/Apache2 restart
Sudo /etc/init.d/nginx restart
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.
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
Sur ma machine Windows, je devais donner le chemin absolu à l'extension dir dans mon php.ini:
extension_dir = "c:\php5\ext"
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:
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
Sur Ubuntu, exécutez simplement
Sudo apt-get install php5-mysql
Sudo apt-get install php-mysql
a bien fonctionné sur Ubuntu et PHP 7
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
Avez-vous vérifié votre php.ini (vérifiez le bon emplacement avec phpinfo ()) si MySQL et le pilote sont installés correctement?
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
.
pour Windows 8.1/10 dans: le fichier \\ php.ini vous devez annuler le commentaire de la ligne "extension = pdo_mysql"
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.
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
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.
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.
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.
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 ...
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
Vérifiez le chemin correct dans extension_dir dans votre phpinfo ().
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)
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/
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
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
.
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.
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
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:
Éteint PhpBrew
Sudo apt-get install php7.0
exécuté (Linux Mint 17.2/PHP7.0.16) - Nouvelle version de php installée
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 '{}' \;
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
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
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é.
$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.