conexion - pdo php mysql ejemplo
PDOException "no se pudo encontrar el controlador" (30)
¿Revisó su php.ini (verifique la ubicación correcta con phpinfo ()) si MySQL y el controlador están instalados correctamente?
Acabo de instalar Debian Lenny con Apache, MySQL y PHP y recibo una excepción PDOException could not find driver
.
Esta es la línea específica de código 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_PASS
son constantes que he definido. Funciona bien en el servidor de producción (y en mi configuración anterior de Ubuntu Server).
¿Es esto algo que ver con mi instalación de PHP?
La búsqueda en Internet no ha ayudado, todo lo que obtengo son expertos, intercambio de ideas y ejemplos, pero no soluciones.
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 es así, no 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.
Cuando los agregue a su php.ini, asegúrese de que la referencia a php_pdo.dll sea la primera antes que las dll dbs de la db; de lo contrario, esto también provocará este mensaje de error. Agrégalos así:
[PHP_PDO]
extension=php_pdo.dll
[PHP_PDO_MYSQL]
extension=php_pdo_mysql.dll
Donde quiera que vaya, leo que la ruta de extension_dir
debe cambiarse de ext
a una ruta absoluta. Funcionó para mí. Sin embargo, al intentar construir un servidor de la PC de mi colega, tuve que dejar que el valor se ext
lugar de poner una ruta absoluta.
Si colocó una ruta absoluta y la extensión aún no se encuentra, considere la posibilidad de intentar tanto con la ruta absoluta como con la ext
.
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.
Comprueba que tienes la extensión mysql instalada en tu servidor.
En Ubuntu / Debian comprueba 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
El problema es que falta un php a la biblioteca mysql. En CentOs lo arreglé ejecutando # yum install php-mysql
y luego reiniciando apache con # /bin/systemctl restart httpd.service
Tenga en cuenta que la denominación es ligeramente diferente de las distribuciones basadas en debian / ubuntu, php-> php5 y httpd-> apache2 .
En Ubuntu solo ejecuta
sudo apt-get install php5-mysql
En mi caso, estaba usando PDO con php-cli, y funcionó bien.
Solo cuando intenté conectarme desde Apache, tuve el problema del "controlador faltante", que no entendí del todo.
Un simple apt-get install php-mysql
resolvió. (Ubuntu 16.04 / PHP7. Los créditos van a la respuesta seleccionada y al comentario de Ivan)
Espero que pueda ayudar.
En mi caso, mi cadena DSN era incorrecta, específicamente no contenía mysql://.
Habría esperado un mensaje de error diferente, tal vez algo como ''La cadena DSN no especifica el controlador / protocolo''.
Al agregar mysql://
al principio de la cadena DSN se resolvió el problema.
En mi máquina Windows, tuve que dar la ruta absoluta a la extensión dir en mi php.ini:
extension_dir = "c:/php5/ext"
Me encontré con el mismo problema después de quitar 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 tecleando en el terminal:
1) $ apt-cache search php7 que enumera todos los módulos, revisando los módulos que encontré,
php7.0-mysql - módulo MySQL para PHP
2) $ sudo apt-get install php7.0-mysql
Eso es. Funcionó para mí en mi sistema Linux.
(Use la versión de php apropiada, la suya podría ser php5)
Necesitas tener un módulo llamado pdo_mysql. Buscando seguir en phpinfo (),
pdo_mysql
PDO Driver for MySQL, client library version => 5.1.44
Para PHP 5.5
en CentOS
solucioné esto instalando el paquete php55-mysqlnd
.
sudo yum -y install php55w-mysqlnd # For Webtatic
sudo yum -y install php55u-mysqlnd # For Remi
Para obtener ayuda para la instalación, escriba un comentario, ya que depende de la forma en que PHP está instalado en su sistema. Los repositorios disponibles son webtatic
y remi
.
Para Linux Mint
Tuve el mismo problema al usar PhpBrew (5.5.9 / 7.0.14) y al intentar crear una conexión PDO.
Después de haber probado la mayoría de las soluciones en este post, hice lo siguiente:
Apagado PhpBrew
Ejecutado
sudo apt-get install php7.0
(Linux Mint 17.2 / PHP7.0.16) - versión nueva instalada de php
Para aquellos que usan Symfony2 / 3 y se preguntan por qué está 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" se debe colocar 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
Para las versiones más nuevas de Ubuntu que tienen PHP 7.0, puede obtener el paquete php-mysql
:
sudo apt-get install php-mysql
Luego reinicie su servidor:
sudo service apache2 restart
Pasé el último día tratando de averiguar por qué estaba recibiendo 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, el uso de la línea de comandos (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 comprobar 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 la versión de su CLI tenga el complemento mysql, ya que no viene con el predeterminado.
Recomiendo sumamente mysqllnd
lugar de mysql
ya que tendrías muchos problemas, como la conversión de números y el tipo de bit que evalúa el problema con la extensión de mysql
.
en ubuntu, instale mysqllnd
con el siguiente comando:
sudo apt-get install php5-mysqlnd
Si está utilizando sqlite para realizar pruebas, necesitará php sqlite pdo drive. Puede instalarlos como a continuación.
Para Ubuntu 14.04
sudo apt-get install php5-sqlite
sudo service apache2 restart
En ubuntu 16.04 no hay php5-sqlite
sudo apt-get install php7.0-sqlite
sudo service apache2 restart
Si lees todas las respuestas anteriores y aún no funciona ...
Asegúrese de que su cadena de conexión de PHP PDO está bien. No como el mio
$dbh = new PDO(''"mysql:host='' . DB_HOST . '';dbname='' . DB_NAME, DB_USER, DB_PASS)
No hay información en el mensaje de error que no se encontró el controlador.
Después de reinstalar todas las bibliotecas de PDO y MySQL posibles, descubrí que había " al inicio de mi cadena de conexión.
Solo una cosa más para confirmar, ya que algunas personas están copiando / pegando código de ejemplo de Internet para comenzar. Asegúrese de tener MySQL ingresado aquí:
... $dbh = new PDO ("mysql: ...
En algunos ejemplos esto muestra.
$dbh = new PDO ("dblib ...
Solucioné este problema en mi Debian 6. Normalmente, acababa de instalar php5-common
paquete php5-common
. Después de la instalación, debe reiniciar su servidor web (apache o nginx, dependiendo de cuál haya instalado). Luego simplemente hago un lsof
en el id del proceso de 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 que Drupal o cualquier otro motor php no pudo encontrar la biblioteca y muestra ese error: PDOException: could not find driver
Simplemente no sé por qué está instalado en una ruta tan extraña, para mí es solo un error en el script de instalación del paquete de la biblioteca en Debian 6. Resolví el problema creando un símbolo para todos los archivos en /usr/lib/php5/20090626/
a /usr/lib/php5/
con este comando:
ln -s /usr/lib/php5/20090626/* /usr/lib/php5/
Tuve el mismo problema durante la ejecución de pruebas con php.ini 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.
Tuve el mismo problema. La solución depende del sistema operativo. En mi caso, tengo debian, así que para resolverlo:
- Actualicé mi versión 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.ini
en /etc/php/7.0/apache2/php.iniuncomment the line : extension=php_pdo_mysql.dll
Luego reinicie apache:
service apache2 restart
Esto resuelve mi problema
Tuve la misma excepción al intentar usar pdo_sqlite
. El problema era que los enlaces simbólicos 20-pdo_sqlite.ini
y 20-sqlite3.ini
creados automáticamente (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
arreglado el problema
Nota: esto no funcionará para versiones anteriores de php ya que no buscaron configuraciones en
/etc/php5/mods-enabled
para Windows 8.1 / 10 en: // php.ini file, debe descomentar la línea "extension = pdo_mysql"
Actualización : las versiones más nuevas deben usar php-sqlite3
paquete php-sqlite3
lugar de php5-sqlite
. Así que usa esto, si estás 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 de Ubuntu), solo necesita ejecutar las líneas de arriba y estará listo.
Se estaba llamando a la 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)
phpinfo.php
archivo phpinfo.php
en la carpeta public
y phpinfo()
para buscar la ubicación de mi archivo php.ini
.
Ubicación de PHP.ini = c:/xampp/php/php.ini
Problema
Llamar a c:/xampp/htdocs> php -v
devolvió PHP 7.2.3
pero phpinfo.php
mostró PHP 7.2.2
.
Solución
En lugar de llamar
php artisan migrate:install
Lo que me dio este error, lo utilicé.
c:/xampp/php/php artisan migrate:install
Y funcionó.
$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í.
sudo apt-get install php-mysql
Funcionó bien en Ubuntu y PHP 7