Iniciar sesión

Ver la versión completa : [Ayuda] configurar soporte PDO en XAMPP 1.7.4



akualung
22/09/2011, 23:00
Hola. Después de tres dias seguidos nada más que buscando y buscando y buscando y buscando y buscando y buscando sin sacar en claro nada, me remito a los cracks de este foro a ver si me podeis echar un cable.

Tengo instalado xampp 1.7.4. Estaba haciendo un ejercicio en PHP que saqué de un libro "profesional PHP 6", de la editorial Wrox y anaya. Es tan sencillo como conectar con mi base de datos usando PDO, pero se me está convirtiendo en un jodido infierno.

Llevo 3 dias atascado porque, sencillamente, no me funciona. En la propia pagina web me salta una PDOException que con el método "$e->getMessage()" me imprime el mensaje "Error: could not find driver".

He mirado si puede ser que me falte alguna librería, pero por lo que he leido solo se necesita el archivo php_pdo_mysql.dll, y ese lo tengo. También lo tengo cargado en el php.ini: extension=php_pdo_mysql.dll

En esta versión de xampp viene el PHP 5.3.5 He leido de gente que le fallaba esto por no tener el archivo php_pdo.dll (a secas, sin el "mysql") pero he leido en la documentación oficial del php que, por encima del php 5.3.0 ya no hace falta ese archivo. (Concretamente lo dice aqui: http://php.net/manual/en/pdo.installation.php) Igualmente he probado a buscar ese archivo e incluirlo en la misma carpeta donde está el php_pdo_mysql.dll y configurar el php.ini para que lo coja, pero al arrancar el apache me dice que el archivo no es compatible con mi versión de php, algo acerca de una clave API obsoleta.



Os pongo un poco de información de mi phpinfo() por si os da alguna otra pista:

Configure Command: cscript /nologo configure.js "--enable-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--disable-isapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8-11g=D:\php-sdk\oracle\instantclient11\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet" "--with-mcrypt=static"

PDO
PDO support: enabled
PDO drivers: mysql, odbc, sqlite, sqlite2

pdo_mysql
PDO Driver for MySQL: enabled
Client API version: mysqlnd 5.0.7-dev - 091210 - $Revision: 304625 $

PDO_ODBC
PDO Driver for ODBC (Win32): enabled
ODBC Connection Pooling: Enabled, strict matching

pdo_sqlite
PDO Driver for SQLite 3.x: enabled
SQLite Library: 3.7.3


No es problema de usuario y contraseña porque el mismo ejercicio lo tengo hecho conectando de la manera "normal (usando mysql_connect(), mysql_query(), etc y sin problemas).

He probado a conectar como localhost, como 127.0.0.1, como el nombre del host... y nada.

Si a alguien se le ocurre algo, yo ya he hecho todo lo humanamente posible, sencillamente estoy al límite de buscar y romperme la cabeza.

Os añado el mensaje que me tira la función "$e->getTraceAsString()" de la PDOException, por si da alguna otra pista: #0 C:\xampp\htdocs\PDO_proyecto01\index.php(80): PDO->__construct(' mysql:host=Loc...') #1 {main}

Gracias.

< - >
Aqui os pongo el código donde realizo la conexión:

$strDSN = " mysql:host=Localhost;dbname=galeria;user=root;pass word=curs ";
try {
$objPDO = new PDO($strDSN);
$objPDO->setAttrbute(PDO::ATTR_MODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
echo "Error: ".$e->getMessage()." ".$e->getTraceAsString()."\n";
}

otto_xd
22/09/2011, 23:12
Sin tener ni **** idea de bases de datos, y por la experiencia de haber montado guarreridas en mi maquina virtual, te diria que el problema no esta en el driver pdo, sino en que no es capaz de conectar/operar con la base de datos.

Lo chungo es que la parte de los drivers de las bases de datos parece que esta ok.

Esta conectando bien a la base de datos??

Sin tener ni **** idea, esta creada la base de datos?

bitrider
22/09/2011, 23:17
Lo has copiado tal cual ? lo digo porque en la cadena de conexión ha espacios que no deberían estar ahí.

Has probado a usar:


$strDSN = "mysql:host=Localhost;dbname=galeria";
$strUser = "root";
$strPassword = "curs";
try {
$objPDO = new PDO($strDSN, $strUser, $strPassword);
$objPDO->setAttrbute(PDO::ATTR_MODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
echo "Error: ".$e->getMessage()." ".$e->getTraceAsString()."\n";
}

akualung
22/09/2011, 23:53
Lo has copiado tal cual ? lo digo porque en la cadena de conexión ha espacios que no deberían estar ahí.

Has probado a usar:


$strDSN = "mysql:host=Localhost;dbname=galeria";
$strUser = "root";
$strPassword = "curs";
try {
$objPDO = new PDO($strDSN, $strUser, $strPassword);
$objPDO->setAttrbute(PDO::ATTR_MODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
echo "Error: ".$e->getMessage()." ".$e->getTraceAsString()."\n";
}



Ostras, es verdad, me olvidé de dar un dato importante. Esos espacios los puse así porque es como lo vi en uno de los ejemplos que encontré cuado estuve buscando como loco al ver que no me funcionaba. Al principio tenía la cadena del DSN sin espacios al principio y al final, y el error que me salía era diferente: Error: SQLSTATE[42000] [1044] Access denied for user ''@'localhost' to database 'galeria'.

Lo raro es que me diga que no tengo acceso, porque el usuario root existe, y de hecho es con el mismo user y pass con el que conecto con el otro ejercicio, el que usa las funciones estandar mysql del php.


Acabo de probar lo que me has dicho y parece que ya sí que conecta :brindis: (aún no lo se seguro porque me falta rehacer en pdo la parte que itera por los resultados y me construye el contenido) pero ya no me da ningun fallo por pantalla, por lo que en teoria eso es que conecta bien.

Parece ser que el error que me daba al princpio de todo (el de "access denied") se debía a la forma en que construía la cadena del DSN: $strDSN = 'mysql:host=localhost;dbname=galeria;user=root;pas sword=curs';

Parece que no pilla bien el nombre de usuario o algo así y me da un error, pero poniendo el user y el pass como dos cadenas extras y pasándoselas al constructor de PDO como dos argumentos adicionales (que es como está hecho en tu código), parece que se subsana el problema.

Por cierto, también he tenido que comentar la linea de abajo de la instanciación del objeto pdo, la del setAttribute, porque la tenia mal escrita. Me faltaba la "i" de setAttribute, pero de todas formas no me funciona esa linea, se queja de los argumentos que le doy (y eso que la he copiado tal cual de un ejemplo de una web) así que la he quitado.

Voy a seguir haciendo el ejercicio y a ver si consigo que me funcione.

Merci, Bitrider, creo que me has salvado el dia :brindis::brindis::brindis:



Merci también a tí por contestar, otto_xd, acabo de ver tu mensaje ahora, se me había pasado. Con otro ejemplo que hice sí que me conectaba bien (con los mismos parámetros), era el de PDO que me daba fallo, por eso me extrañaba que fuera cosa de la BD (aunque ves a saber, de fallos surrealistas ya he tenido unos cuantos).


Creo que ya tengo el error del setAttribute. El primer argumento es PDO::ATTR_ERRMODE, no PDO::ATTR_MODE. Qué raro, juraría que hice copypaste de esa linea, o sea que o estaba ya mal de donde lo copié o ves a saber qué lío me monté yo solo.