PDOException "não foi possível encontrar o driver"


292

Acabei de instalar o Debian Lenny com Apache, MySQL e PHP e estou recebendo uma PDOException could not find driver.

Esta é a linha de código específica à qual se refere:

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

DB_HOST, DB_NAME, DB_USER, EDB_PASS são constantes que eu definidos. Funciona bem no servidor de produção (e na minha configuração anterior do Ubuntu Server).

Isso tem algo a ver com minha instalação do PHP?

Pesquisando na Internet não ajudou, tudo o que recebo é troca de especialistas e exemplos, mas não há soluções.


21
Procure na sua php.ini' file and uncomment extensão = php_pdo_mysql.dll . The path to your . O arquivo php.ini` pode ser encontrado consultando o seu phpinfo ().
styfle

3
Para seus futuros leitores, se você receber esse erro e o GoDaddy for seu host, faça login na sua conta de administrador. Detalhes de hospedagem-> Linguagens de Programação. Faça upgrade da sua versão do PHP para a versão mais recente ou pelo menos 5,4 #
Joe

@ Joe fiz um upgrade, mas ainda obter um erro (GoDaddy)
Eugen Sunic

@styfle 1up, Em uma máquina Linux, eu configurei extension=msql.soe funciona!
AjayKumarBasuthkar

Para quem possa interessar: se você estiver usando o php 7.1+ no docker, poderá docker execentrar no contêiner e executar docker-php-ext-install pdo pdo_mysql.
Cleybertandre

Respostas:


240

Você precisa ter um módulo chamado pdo_mysql. Procurando seguir em phpinfo (),

pdo_mysql

PDO Driver for MySQL, client library version => 5.1.44

2
@ZZ Coder Isso não está presente no phpinfo (). Você sabe como eu posso instalar pdo_mysql?
Mike Moore

14
@letseatfood ... Como você descobriu isso? Estou tendo o mesmo problema!
precisa

17
Posso recomendar o pacote Ubuntu "php5-mysql" para instalar suporte DOP para MySQL
Tom Carver

3
Observe que, para aqueles que usam o Apache ou outro servidor web, é necessário reiniciar o Apache para que as alterações entrem em vigor:sudo systemctl restart httpd.service
Mugoma J. Okomba

50
Para o Ubuntu 16.04 e uso PHP7sudo apt-get install php-mysql
Ivan Marjanovic

199

O dsn no seu código revela que você está tentando se conectar ao driver mysql. Sua mensagem de erro indica que este driver não está disponível.

Verifique se você possui a extensão mysql instalada no seu servidor.

No Ubuntu / Debian, você verifica o pacote com:

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

Instale o pacote php5-mysql se você não o tiver.

No Ubuntu / Debian você pode usar:

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

Por fim, para fazê-lo funcionar, você precisará reiniciar o servidor da web:

  • Apache: sudo /etc/init.d/apache2 restart
  • Nginx: sudo /etc/init.d/nginx restart

3
ahh ... o reinício é o que me mordeu!
KOGI

Eu tive o mesmo problema, reinicie o php5-fpm!
precisa saber é o seguinte

Passei quase uma noite inteira tentando entender isso, até que vi sua resposta. Tinha feito tudo corretamente, mas esqueceu de reiniciar o apache.
Mugoma J. Okomba

O php-mysql já é a versão mais recente (1: 7.1 + 49 + deb.sury.org ~ xenial + 4). Ao tentar executar o comando sudo apt-get install php-mysql no ubuntu 16.04 com o nginx php fpm, eu também reinicio o php fpm e, em seguida, o nginx.
Prashant Barve

Atualmente, parece ser php-mysql e php7.1-mysql. Espero que este seja o padrão a seguir em frente.
John P

83

Atualização : as versões mais recentes devem usar o php-sqlite3pacote em vez de php5-sqlite. Então use isso, se você estiver usando uma versão recente do ubuntu:

sudo apt-get install sqlite php-sqlite3

A resposta original à pergunta está aqui:

sudo apt-get install sqlite php5-sqlite
sudo /etc/init.d/apache2 restart

Se o seu phpinfo () não está mostrando a linha pdo_sqlite (no meu caso, no meu Ubuntu Server), você só precisa executar as linhas acima e então estará pronto.


57
Por que você deu instruções para o sqlite quando o OP está usando o MySQL?
Andrew Ensley

7
@ Andrew, se você usa pdo_sqlitee não instalou, php5-sqliteobtém apenas uma PDOExceptioninformação sem informações sobre o sqlite ausente e tenta instalar php5-mysqlduas vezes.
Aitch

2
Observe que o php5-sqlite se tornou obsoleto e pode não estar mais disponível para o seu sistema, por exemplo, Ubuntu 16.04. Instale o php-sqlite3.
Matthias

2
@briankip Claro que sim, se você está tentando se conectar ao SQLite e esse driver está faltando. Mas o OP está tentando se conectar ao MySQL. A instalação do sqlite poderia / não poderia resolver o problema dele.
Andrew Ensley

2
@AndrewEnsley. O título desta página é o erro que todos recebem independentemente da plataforma db. Como resultado, esta página tem a classificação mais alta na pesquisa do Google se você pesquisar no Google apenas o erro. Portanto, na IMO, qualquer resposta a essa pergunta relevante para outros bancos de dados deve ser bem-vinda aqui. Se eles não trabalham para o OP, que assim seja ... O OP não precisa aceitar essas respostas. Isso não significa que essa resposta não seja "útil" para outras pessoas que investigam a mensagem de erro no título que atribuiu a essa pergunta a classificação de pesquisa de Zoltar. 1
elrobis 5/03/19

34

Para versões mais recentes do Ubuntu que possuem PHP 7.0, você pode obter o php-mysqlpacote:

sudo apt-get install php-mysql

Em seguida, reinicie o servidor:

sudo service apache2 restart

Eu acho que hoje em dia você tem que ser específico com a versão sudo apt-get install php7.2-mysql
Stan Sokolov

25

Eu tive o mesmo problema. A solução depende do sistema operacional. No meu caso, eu tenho o debian, para resolvê-lo:

  • Atualizei minha versão php de ( php5 para php7 )
  • Instale o php-mysql e o php7.0-mysql

    apt-get install php-mysql
    apt-get install php7.0-mysql
  • Editei minha php.inilocalização em /etc/php/7.0/apache2/php.ini

    uncomment the line : extension=php_pdo_mysql.dll
  • Em seguida, reinicie o apache:

    service apache2 restart

Isso resolve meu problema


Como um aparte para aqueles que como eu encontrei este não chegou a ser suficiente e não quer ir através dos passos para remover completamente php5 antes de verificar que php7 vai funcionar: a2dismod php5, a2enmod php7.0e service apache2 restartfinalmente me voltar a funcionar.
depwl9992

21

Na minha máquina Windows, tive que fornecer o caminho absoluto para o diretório de extensão no meu php.ini:

extension_dir = "c:\php5\ext"


2
Acabei de confirmar que isso é verdade (Win2008). Estranho - as outras extensões funcionam apenas com o recomendado extension_dir = "ext", mas não com este.
Scipilot

o mesmo aqui. adicionou o caminho e começou a trabalhar. Windows10, php7.1
Chris Gibb

14

No Ubuntu basta executar

sudo apt-get install php5-mysql

1
Eu estava por trás de um Symfony2 e Ubuntu. Pdo_mysql não foi encontrado ([PDOException] não pôde encontrar o driver). Isso resolveu o problema.
Reinherd

2
Para mim, estava faltando o Postgresql, por isso acabou sendo:sudo apt-get install php5-pgsql
Kzqai 20/16

@Kzqai 2:30 am agora e você acabou de resolver o meu problema, eu foi't usando mysql eu estava usando postgres (> ლ)
Dheeraj

9
sudo apt-get install php-mysql 

funcionou bem no ubuntu e php 7


Funcionou para mim, embora não esteja usando o php7, mas o php5.6. Mas eu tenho 7 instalados. Eu instalei 5,6 tarde e mudou para que sem desinstalar php7
Mubashar Abbas

9

Verifique se o módulo está disponível com php -m | grep pdo_mysql .

Caso contrário, para o PHP 7.2, você pode instalar o pacote relevante com sudo apt install php7.2-mysql .

Use comando semelhante em outras versões do PHP e gerenciadores de pacotes.


6

Ao adicioná-los ao seu php.ini, verifique se a referência php_pdo.dll é a primeira antes das DLLs dos drivers db, caso contrário, isso também causará essa mensagem de erro. Adicione-os assim:

[PHP_PDO]
extension=php_pdo.dll
[PHP_PDO_MYSQL]
extension=php_pdo_mysql.dll

2
desde o PHP v5.3, o php_pdo.dllmódulo não é mais necessário (não existe). php.net/manual/en/pdo.installation.php é provavelmente a resposta final para esta pergunta.
Martin Zeitler

5

Você checou seu php.ini (verifique a localização correta com phpinfo ()) se o MySQL e o driver estão instalados corretamente?


2
Estou procurando no php.ini, mas o que devo procurar? Eu vejo uma seção que começa com[MySQL]
Mike Moore

4

Pois PHP 5.5no CentOSeu corrigi isso instalando o php55-mysqlndpacote.

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

Para obter ajuda na instalação, escreva um comentário, pois depende da maneira como o PHP está instalado no seu sistema. Os repositórios disponíveis são webtatice remi.


4

para Windows 8.1 / 10 em: \\ arquivo php.ini, remova o comentário da linha "extension = pdo_mysql"


3

No meu caso, minha string DSN estava incorreta, especificamente não continha mysql://. Eu esperaria uma mensagem de erro diferente, talvez algo como 'String DSN não especifique driver / protocolo'.

A adição mysql://ao início da string DSN resolveu o problema.


3

Passei o último dia tentando descobrir por que estava recebendo o seguinte erro. Estou executando o Ubuntu 14.04.

O Problema:
Notei que minha versão do PHP-CLI estava executando o php7.0, mas php_info () (a versão da Web) exibia o php 5.5.9. Embora o php_info () tenha dito que o pdo estava ativado, o uso da linha de comando (CLI) não estava reconhecendo o comando pdo_mysql. Acontece que o mysql foi ativado para minha versão antiga, mas não para a versão CLI. Tudo o que fiz foi instalar o mysql para php7.0 e ele foi capaz de funcionar.

Isto é o que funcionou:

Para verificar a versão:

php -v

Para instalar o mysql for php7.0

sudo apt-get install php7.0-mysql

1) verifique se a sua versão da CLI é igual à sua versão da web
2) Se forem diferentes, verifique se a sua versão da CLI possui o plug-in mysql, pois não vem com ele como padrão.


2

Verifique se extension_dir no arquivo de configuração php está definido corretamente. Tente comentar / descomentar algumas extensões e veja se isso está refletido no phpinfo (). Caso contrário, o arquivo de configuração php não pode ser carregado (local errado) extension_dir é comentado ou definido para o local errado.


2

O problema é um php ausente na biblioteca mysql. No CentOs, eu o corrigi executando # yum install php-mysqle reiniciando o apache com # /bin/systemctl restart httpd.serviceObserve que a nomeação é um pouco diferente das distribuições baseadas no debian / ubuntu, php-> php5 e httpd-> apache2.


2

Eu tive o mesmo problema durante a execução de testes com o php.ini separado. Eu tive que adicionar essas linhas ao meu próprio arquivo php.ini:

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

Aviso: exatamente nesta ordem


2

Eu recomendo extremamente, em mysqllndvez de mysqlpor causa de você ter muitos problemas, como conversão de número e tipo de bit avalia o problema commysql extensão.

no ubuntu install mysqllndcom o seguinte comando:

sudo apt-get install php5-mysqlnd

1

Corrigi esse problema no meu Debian 6. Normalmente, acabei de instalar o php5-commonpacote. Após a instalação, você deve reiniciar o servidor da web (apache ou nginx, dependendo de qual você instalou). Então eu apenas faço um lsofno processo apache id ( lsof -p process_id) da seguinte maneira:

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

Como você pode ver acima, os módulos são instalados em um caminho de arquivo não conhecido ou guiado pelo caminho comum da biblioteca: / usr/lib/php5/20090626/. Para sua instalação, pode ser diferente, mas apenas o caminho de pdo_mysql.so, pdo.so, mysqli.so. Portanto, é por isso que o Drupal ou qualquer outro mecanismo php não conseguiu encontrar a biblioteca e mostra esse erro:PDOException: could not find driver

Eu só não sei por que ele está instalado em um caminho tão estranho, para mim é apenas um bug no script de instalação pacote de biblioteca no debian 6. I resolveu o problema criando um símbolo para todos os arquivos sob /usr/lib/php5/20090626/a /usr/lib/php5/com este comando:

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


O php-mysql já é a versão mais recente (1: 7.1 + 49 + deb.sury.org ~ xenial + 4).
Prashant Barve

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

Isso funcionou para mim.


1
sem motorista, este usuário ainda vai ter a mesma exceção
eggmatters

1

Eu enfrentei o mesmo problema depois que removi o pacote php5 (que inclui todos os drivers também) para instalar o pacote php7. Na verdade, eu instalei o pacote php7 sem um módulo mysql.

Consegui resolvê-lo digitando o terminal:

1) $ apt-cache search php7 que lista todos os módulos, olhando através dos módulos que encontrei,

php7.0-mysql - módulo MySQL para PHP

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

É isso aí. Funcionou para mim no meu sistema linux.

(use a versão php apropriada, a sua pode ser php5)


1

Apenas mais uma coisa para confirmar, já que algumas pessoas estão copiando / colando códigos de exemplo da Internet para começar. Verifique se o MySQL foi digitado aqui:

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

Em alguns exemplos, isso mostra

$dbh = new PDO ("dblib ...

1

No meu caso, eu estava usando DOP com php-cli, e funcionou bem.

Somente quando tentei me conectar pelo apache, obtive o problema do "driver ausente", que não entendi direito.

Um simples apt-get install php-mysqlresolveu. (Os créditos do Ubuntu 16.04 / PHP7. Vão para a resposta selecionada e o comentário de Ivan)

Espero que possa ajudar.


1

Para aqueles que usam o Symfony2 / 3 e se perguntam por que está recebendo esse erro. Se você estiver usando "mapping_types", poderá encontrar este erro. O motivo é que "mapping_types" é colocado no nível errado. Por exemplo :

doctrine:
  dbal:
    mapping_types:
        set: string

Este "mapping_types" deve ser colocado neste nível:

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

Eu espero que isso ajude

Encontrei a solução aqui: https://github.com/doctrine/DoctrineBundle/issues/327


1

Onde quer que eu vá, leio que o caminho de extension_dirdeve ser alterado extpara um caminho absoluto. Funcionou para mim. No entanto, ao tentar construir um servidor no PC do meu colega, tive que deixar o valor em extvez de colocar um caminho absoluto.

Se você colocou um caminho absoluto e a extensão ainda não foi encontrada, considere tentar ambos com o caminho absoluto e ext.


1

A instalação incorreta do PHP estava sendo chamada

Eu estava com o mesmo problema. E espero que isso ajude alguém que está tendo um problema semelhante ao meu.

Cenário

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

Criei um phpinfo.phparquivo na publicpasta e execute o phpinfo()para procurar a localização do meuphp.ini arquivo.

Localização do PHP.ini = c:\xampp\php\php.ini

Problema A
chamada c:\xampp\htdocs> php -vretornou, PHP 7.2.3mas phpinfo.phpmostrou PHP 7.2.2.

Solução em
vez de ligar

php artisan migrate:install   

que me deu esse erro, eu usei

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

e funcionou.



1
PHP Fatal error:  Uncaught PDOException: could not find driver

Eu lutei e lutei com "apt install php-mysql php7toInfinity e não se esqueça do sqlite-what-ever's" e simplesmente não consegui me livrar dessa mensagem de erro até voltar ao básico e redefinir as permissões de arquivo no site em questão.

Esses três comandos redefinem as permissões de arquivo e pasta no site e o fazem funcionar novamente.

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

Eu tive a mesma exceção ao tentar usar pdo_sqlite. O problema era que os links automaticamente criados 20-pdo_sqlite.inie os 20-sqlite3.inilinks simbólicos (in /etc/php5/mods-enabled) foram quebrados.

Removendo os links simbólicos quebrados e adicionando-os manualmente com:

  • 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

corrigiu o problema.

Nota: isto não funcionará para versões php mais antigas, pois elas não procuraram configurações no /etc/php5/mods-enabled

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.