PDOException "no se pudo encontrar el controlador"

292

Acabo de instalar Debian Lenny con Apache, MySQL y PHP y estoy recibiendo una PDOException could not find driver .

Esta es la línea de código específica a la que se refiere:

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

DB_HOST, DB_NAME, DB_USER, Y DB_PASSson constantes que he definido. Funciona bien en el servidor de producción (y en mi configuración anterior de Ubuntu Server).

¿Tiene esto algo que ver con mi instalación de PHP?

Buscar en Internet no ha ayudado, todo lo que obtengo es intercambio de expertos y ejemplos, pero no soluciones.

Mike Moore
fuente
21
Busque en su php.ini' file and uncomment extensión = php_pdo_mysql.dll . The path to your El archivo php.ini` se puede encontrar mirando su phpinfo ().
styfle
3
Para su información para futuros lectores, si recibe este error y GoDaddy es su anfitrión, inicie sesión en su cuenta de administrador. Detalles de alojamiento-> Lenguajes de programación. Actualice su versión de PHP a la última o al menos 5.4
Joe
@ Joe, actualicé pero aún recibo un error (GoDaddy)
Eugen Sunic
@styfle 1up, en una máquina Linux, configuré extension=msql.soy ¡funciona!
AjayKumarBasuthkar
A quién le pueda interesar: si está utilizando php 7.1+ en Docker, puede docker execingresar al contenedor y ejecutar docker-php-ext-install pdo pdo_mysql.
cleybertandre

Respuestas:

240

Necesita tener un módulo llamado pdo_mysql. Buscando seguir en phpinfo (),

pdo_mysql

PDO Driver for MySQL, client library version => 5.1.44
Codificador ZZ
fuente
2
@ZZ Coder Esto no está presente en phpinfo (). ¿Sabes cómo puedo instalar pdo_mysql?
Mike Moore
14
@letseatfood ... ¿Cómo resolviste esto? ¡Estoy teniendo el mismo problema!
Hristo
17
Puedo recomendar el paquete Ubuntu "php5-mysql" para instalar el soporte PDO para MySQL
Tom Carver
3
Tenga en cuenta que, para aquellos que usan Apache u otro servidor web, uno necesita reiniciar Apache para que los cambios surtan efecto:sudo systemctl restart httpd.service
Mugoma J. Okomba
50
Para Ubuntu 16.04 y PHP7 usesudo apt-get install php-mysql
Ivan Marjanovic
199

El dsn en su código revela que está intentando conectarse con el controlador mysql. Su mensaje de error indica que este controlador no está disponible.

Compruebe que tiene instalada la extensión mysql en su servidor.

En Ubuntu / Debian verifica el paquete con:

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

Instale el paquete php5-mysql si no lo tiene.

En Ubuntu / Debian puedes usar:

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

Por último, para que funcione, deberá reiniciar su servidor web:

  • Apache: sudo /etc/init.d/apache2 restart
  • Nginx: sudo /etc/init.d/nginx restart
ghbarratt
fuente
3
ahh ... el reinicio es lo que me mordió!
KOGI
Tuve el mismo problema, ¡asegúrese de reiniciar php5-fpm!
Eko3alpha
Pasé casi toda una noche tratando de resolver esto, hasta que vi tu respuesta. Había hecho todo correctamente pero olvidé reiniciar Apache.
Mugoma J. Okomba
php-mysql ya es la versión más nueva (1: 7.1 + 49 + deb.sury.org ~ xenial + 4). Cuando intento ejecutar el comando sudo apt-get install php-mysql en ubuntu 16.04 con nginx php fpm, también reinicio el php fpm y luego reinicio el nginx.
Prashant Barve
Actualmente parece ser php-mysql y php7.1-mysql. Esperemos que este sea el patrón que avanza.
John P
83

Actualización : las versiones más nuevas deberían usar el php-sqlite3paquete en lugar de php5-sqlite. Entonces use esto, si está usando una versión reciente de ubuntu:

sudo apt-get install sqlite php-sqlite3

La respuesta original a la pregunta está aquí:

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

Si su phpinfo () no muestra la línea pdo_sqlite (en mi caso, en mi servidor Ubuntu), solo necesita ejecutar las líneas anteriores y estará listo para comenzar.

Sudipta Chatterjee
fuente
57
¿Por qué dio instrucciones para sqlite cuando el OP está usando MySQL?
Andrew Ensley
77
@Andrew si usó pdo_sqlitey no instaló php5-sqlite, solo obtiene un PDOExceptionsin información sobre sqlite faltante e intenta instalar php5-mysqldos veces.
Aitch
2
Tenga en cuenta que php5-sqlite se ha vuelto obsoleto y puede que ya no esté disponible para su sistema, es decir, Ubuntu 16.04. Instale php-sqlite3 en su lugar.
Matthias
2
@briankip Por supuesto que sí, si está intentando conectarse a SQLite y falta ese controlador. Pero el OP está intentando conectarse a MySQL. Instalar sqlite podría / no podría resolver su problema.
Andrew Ensley
2
@AndrewEnsley. El título de esta página es el error que todos obtienen independientemente de su plataforma db. Como resultado, esta página tiene el rango de búsqueda de Google más alto si googlea solo el error. Por lo tanto, OMI, cualquier respuesta a esta pregunta relevante para otras bases de datos debe ser bienvenida aquí. Si no funcionan para el OP, que así sea ... OP no tiene que aceptar esas respuestas. Eso no significa que esta respuesta no sea "útil" para que otros investiguen el mensaje de error en el título que dotó a esta pregunta con el rango de búsqueda de Zoltar. +1
elrobis
34

Para las versiones más nuevas de Ubuntu que tienen PHP 7.0, puede obtener el php-mysqlpaquete:

sudo apt-get install php-mysql

Luego reinicie su servidor:

sudo service apache2 restart
ThomasAFink
fuente
Creo que hoy en día debes ser específico con la versión sudo apt-get install php7.2-mysql
Stan Sokolov
25

Tuve el mismo problema. La solución depende del sistema operativo. En mi caso, tengo Debian, así que para resolverlo:

  • Actualicé mi versión de php de ( php5 a php7 )
  • Instalar php-mysql y php7.0-mysql

    apt-get install php-mysql
    apt-get install php7.0-mysql
  • Edité mi php.iniubicación en /etc/php/7.0/apache2/php.ini

    uncomment the line : extension=php_pdo_mysql.dll
  • Luego reinicie apache:

    service apache2 restart

Esto resuelve mi problema

sólo yo
fuente
En un aparte para aquellos como yo que esto no se encontró bastante suficiente y no quieren ir a través de los pasos para eliminar por completo php5 antes de verificar que php7 funcionará: a2dismod php5, a2enmod php7.0y service apache2 restartfinalmente me hizo volver a funcionar.
depwl9992
21

En mi máquina Windows, tuve que dar la ruta absoluta al directorio de extensión en mi php.ini:

extension_dir = "c:\php5\ext"

berdzi
fuente
2
Acabo de confirmar que esto es cierto (Win2008). Extraño: las otras extensiones funcionan solo con las recomendadas extension_dir = "ext", pero no con esta.
scipilot
igual que aquí. agregó el camino y comenzó a trabajar. Windows10, php7.1
Chris Gibb
14

En Ubuntu solo ejecuta

sudo apt-get install php5-mysql
Dmitry Sobolev
fuente
1
Estaba detrás de un Symfony2 y Ubuntu. No se encontró Pdo_mysql ([PDOException] no pudo encontrar el controlador). Esto resolvió el problema.
Reinherd
2
Para mí me faltaba Postgresql, así que terminó siendo:sudo apt-get install php5-pgsql
Kzqai
@Kzqai 2:30 am ahora y usted acaba de resolver mi problema, no estaba usando mysql estaba usando postgres (> ლ)
Dheeraj
9
sudo apt-get install php-mysql 

funcionó bien en ubuntu y php 7

Moses Nandwa
fuente
Funcionó para mí, aunque no estoy usando php7 sino php5.6. Pero tengo 7 instalados. Instalé 5.6 más tarde y cambié a eso sin desinstalar php7
Mubashar Abbas
9

Compruebe si el módulo está disponible con php -m | grep pdo_mysql.

Si no, para PHP 7.2, puede instalar el paquete relevante con sudo apt install php7.2-mysql .

Utilice comandos similares en otras versiones de PHP y gestores de paquetes.

Pratik
fuente
6

Al agregarlos a su php.ini, asegúrese de que la referencia php_pdo.dll sea primero antes que los db drivers dlls; de lo contrario, esto también causará este mensaje de error. Añádelos así:

[PHP_PDO]
extension=php_pdo.dll
[PHP_PDO_MYSQL]
extension=php_pdo_mysql.dll
Paul Foster
fuente
2
desde PHP v5.3 el php_pdo.dllmódulo ya no es necesario (ya no existe). php.net/manual/en/pdo.installation.php es probablemente la respuesta definitiva a esta pregunta.
Martin Zeitler
5

¿Revisó su php.ini (verifique la ubicación correcta con phpinfo ()) si MySQL y el controlador están instalados correctamente?

cem
fuente
2
Estoy buscando en php.ini, pero ¿qué debo buscar? Veo una sección que comienza con[MySQL]
Mike Moore
4

Para PHP 5.5el CentOSarreglé esto instalando el php55-mysqlndpaquete.

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

Para obtener ayuda con la instalación, escriba un comentario ya que depende de la forma en que PHP esté instalado en su sistema. Los repositorios disponibles son webtaticy remi.

SimonW
fuente
4

para Windows 8.1 / 10 en: \\ php.ini archivo, debe descomentar la línea "extension = pdo_mysql"

Egor Doynikov
fuente
3

En mi caso, mi cadena DSN era incorrecta, específicamente no contenía mysql://. , hubiera esperado un mensaje de error diferente, tal vez algo como 'La cadena DSN no especifica el controlador / protocolo'.

Agregar mysql://al comienzo de la cadena DSN resolvió el problema.

gposton
fuente
3

Pasé el último día tratando de descubrir por qué recibía el siguiente error. Estoy ejecutando Ubuntu 14.04.

El problema:
noté que mi versión de PHP-CLI ejecutaba php7.0 pero php_info () (la versión web) mostraba php 5.5.9. Aunque php_info () dijo que pdo estaba habilitado, usar la línea de comando (CLI) no reconocía el comando pdo_mysql. Resulta que mysql estaba habilitado para mi versión anterior pero no para la versión CLI. Todo lo que hice fue instalar mysql para php7.0 y fue capaz de funcionar.

Esto es lo que funcionó:

Para verificar la versión:

php -v

Para instalar mysql para php7.0

sudo apt-get install php7.0-mysql

1) asegúrese de que su versión de CLI sea la misma que su versión web
2) Si son diferentes, asegúrese de que su versión de CLI tenga el complemento mysql ya que no viene con él por defecto.

Pulga gruñona
fuente
2

Compruebe si extension_dir en el archivo de configuración de php está configurado correctamente. Intente comentar / descomentar algunas extensiones y ver si se refleja en phpinfo (). Si no lo hace, tampoco se puede cargar el archivo de configuración de php (ubicación incorrecta) extension_dir se comenta o se establece en la ubicación incorrecta.

hserge
fuente
2

El problema es una falta de php a la biblioteca mysql. En CentOs lo arreglé ejecutando # yum install php-mysqly luego reiniciando apache con # /bin/systemctl restart httpd.serviceNote que el nombre es ligeramente diferente de las distribuciones basadas en debian / ubuntu, php-> php5 y httpd-> apache2.

Japheth Ongeri - inkalimeva
fuente
2

Tuve el mismo problema durante la ejecución de pruebas con php.ini por separado. Tuve que agregar estas líneas a mi propio archivo php.ini:

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

Aviso: exactamente en este orden

Boca abajo
fuente
2

Lo recomiendo extremadamente en mysqllndlugar de mysqlporque tendría muchos problemas como la conversión de números y el tipo de bit evalúa el problema conmysql extensión.

en ubuntu instalar mysqllndcon el siguiente comando:

sudo apt-get install php5-mysqlnd
MSS
fuente
1

Solucioné este problema en mi Debian 6. Normalmente, acababa de instalar el php5-commonpaquete. Después de la instalación, debe reiniciar su servidor web (apache o nginx dependiendo de cuál instaló). Luego solo hago un lsofid en el proceso apache ( lsof -p process_id) como sigue:

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 puede ver arriba, los módulos se instalan en una ruta de archivo desconocida o guiada por una ruta de biblioteca común: / usr/lib/php5/20090626/. Para su instalación, puede ser diferente, pero solo la ruta de pdo_mysql.so, pdo.so, mysqli.so. Entonces, esta es la razón por la cual Drupal o cualquier otro motor php no pudo encontrar la biblioteca y muestra ese error:PDOException: could not find driver

Sólo que no sé por qué se instala en un camino tan extraño, para mí es sólo un error en la biblioteca de scripts de instalación de paquetes en debian 6. He resuelto el problema mediante la creación de un símbolo para todos los archivos bajo /usr/lib/php5/20090626/para /usr/lib/php5/con este comando:

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

douggynix
fuente
php-mysql ya es la versión más nueva (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

Esto funcionó para mí.

Usuario persa
fuente
1
sin un controlador, este usuario seguirá recibiendo la misma excepción
eggmatters
1

Me enfrenté al mismo problema después de eliminar el paquete php5 (que también incluye todos los controladores) para instalar el paquete php7. De hecho, instalé el paquete php7 sin un módulo mysql.

Logré resolverlo escribiendo en la terminal:

1) $ apt-cache search php7 que enumera todos los módulos, mirando a través de los módulos que encontré,

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

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

Eso es. Me funcionó en mi sistema Linux.

(use la versión adecuada de php, la suya podría ser php5)

Roshimon
fuente
1

Solo una cosa más para confirmar, ya que algunas personas están copiando / pegando el código de ejemplo de Internet para comenzar. Asegúrese de haber ingresado MySQL aquí:

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

En algunos ejemplos esto muestra

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

En mi caso, estaba usando PDO con php-cli, y funcionó bien.

Solo cuando intenté conectarme desde Apache, recibí el problema del "controlador perdido", que no entendí del todo.

Un simple lo apt-get install php-mysqlresolvió. (Ubuntu 16.04 / PHP7. Los créditos van a la respuesta seleccionada y al comentario de Ivan)

Espero que pueda ayudar.

Balmipour
fuente
1

Para aquellos que usan Symfony2 / 3 y se preguntan por qué están recibiendo este error. Si está utilizando "mapping_types", puede encontrar este error. La razón es que "mapping_types" se coloca en el nivel incorrecto. Por ejemplo :

doctrine:
  dbal:
    mapping_types:
        set: string

Este "mapping_types" debe colocarse en este nivel:

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

espero que esto ayude

Encontré la solución aquí: https://github.com/doctrine/DoctrineBundle/issues/327

aneth101
fuente
1

Donde quiera que vaya leo que la ruta de extension_dirdebería cambiarse de extuna ruta absoluta. Funcionó para mi. Sin embargo, al intentar construir un servidor de la PC de mi colega, tuve que dejar que el valor en extlugar de poner una ruta absoluta.

Si puso una ruta absoluta y lo hace, la extensión aún no se encuentra, considere intentar con la ruta absoluta y ext.

Papillon
fuente
1

Se estaba llamando a una instalación incorrecta de PHP

Estaba experimentando el mismo problema. Y espero que esto ayude a alguien que tiene un problema similar al mío.

Guión

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

Creé el phpinfo.phparchivo en la publiccarpeta y ejecuté el phpinfo()para buscar la ubicación de mi php.iniarchivo.

PHP.ini Ubicación = c:\xampp\php\php.ini

Problema La
llamada c:\xampp\htdocs> php -vvolvió PHP 7.2.3pero se phpinfo.phpmostró PHP 7.2.2.

Solución en
lugar de llamar

php artisan migrate:install   

que me dio este error, usé

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

Y funcionó.

RealSollyM
fuente
1

Verifique la ruta correcta en extension_dir en phpinfo ().

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

Luché y luché con "apt install php-mysql php7toInfinity y no olvides sqlite-what-ever's" y simplemente no pude deshacerme de este mensaje de error hasta que volví a lo básico y restablecí los permisos de archivo en el sitio web en cuestión.

Estos 3 comandos restablecen los permisos de archivos y carpetas en el sitio web y hacen que vuelva a funcionar.

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
fuente
0

Tuve la misma excepción al intentar usar pdo_sqlite. El problema era que el creado automáticamente 20-pdo_sqlite.iniy los 20-sqlite3.inienlaces simbólicos (en /etc/php5/mods-enabled) estaban rotos.

Eliminar los enlaces simbólicos rotos y agregarlos manualmente con:

  • 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

Se solucionó el problema.

Nota: esto no funcionará para versiones anteriores de php ya que no buscaron configuraciones en /etc/php5/mods-enabled

ioleo
fuente