Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

ActiveTable con PDO. Error de configuración?

Estas en el tema de ActiveTable con PDO. Error de configuración? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Saludos a todos, estos días estoy empezando a programar con el patrón MVC, basándome en los ejemplos que GatorV ha dejado en su blog: patrón ...
  #1 (permalink)  
Antiguo 16/10/2007, 05:13
Avatar de Seixas  
Fecha de Ingreso: mayo-2004
Ubicación: Barcelona
Mensajes: 60
Antigüedad: 20 años
Puntos: 0
Pregunta ActiveTable con PDO. Error de configuración?

Saludos a todos,

estos días estoy empezando a programar con el patrón MVC, basándome en los ejemplos que GatorV ha dejado en su blog: patrón ActiveTable y ActiveRecord, PDO con singleton (Aprovecho para sumar una felicitación a su trabajo). Pues bien, para empezar a entender como funciona he copiado el código de las clases ActiveTable y ActiveRecord, las clases Automovil y Automoviles, la clase DB (que extiende PDO) y he creado una clase Config para los datos de la BD. Y tras empezar a probar todo el código juntito me da desgraciadamente hasta el momento tres errores que no consigo entender. Quizá alguno de vosotros, o el propio GatorV me pueda ayudar.



El primer error fue en la clase DB, en la siguiente línea:
Código PHP:
public function __construct() {
    
        
$config Config::getInstance();

        
$db $config->DBName;
        
$user $config->UserName;
        
$pwd $config->Password;
        
        
$attrs = array();
        
$dsn 'mysql:host=localhost;dbname=' $db;
        

        
parent::__construct$dsn$user$pwd$attrs );

            
$this->setAtributePDO::ATTR_ERRMODEPDO::ERR_MODE_EXCEPTION );


En la línea del $this-setAtribute(...) me da el siguiente error:
Fatal error: Call to undefined method DB::setAtribute()

Estube mirando por internet y me encontré que este tipo de método solo funciona utilizando MySQL 4.x. ¿Alguno confirma que es así? Al final lo que hice fue comentar la línea y dejarlo correr.



El segundo error que encontré fue en ActiveTable, en el método setup():

Código PHP:
$query "SHOW FIELDS FROM ?";
$command $this->_db->prepare$query );
        
$command->execute( array( $this->table ) ); 
Al hacer $command->execute me devuelve el siguiente error:
Call to a member function execute() on a non-object

Estuve provando y si sustituyo el "?" final en $query por el valor que debería tener , en este caso Automoviles, no me da tal error. ¿Alguien sabe a qué es debido?

Al final para poder seguir probando el código dejé Automoviles fijo, pero sería interesante poder poner el "?" para que la ActiveTable funcione con otras clases.



El tercer error con el que me encontré fue también en el método setup del ActiveTable.

Código PHP:
$command->execute( array( $table ) );

$fields = array();
$primary '';
        
while( 
$row $command->fetch() ) {
            
    
$fields[$field['Field']] = array(
        
"name" => $field['Field'],
        
"type" => $field['Type'],
        
"defaultValue" => $field['Default'],
        
"key" => $field['Key'],
    );
            
            
    if( 
$field['Key'] === "PRI" ) {
        
$primary $field['Field'];
    }
}

$this->_columns $fields;

if( empty( 
$primary ) ) {
    throw new 
Exception"Primary Column not found for Table: " $this->table );


Aquí el problema me lo encuentro en el while, ya que $command->fetch no devuelve ninguna fila, y no entiendo por qué, ya que en la base de datos tengo como mínimo un registro coche, y el nombre de la tabla corresponde a "Automoviles", como la clase. ¿Alguien cree saber a qué se debe?

He pensado que quizá se deba a la configuración de mi PDO en el servidor, pero no estoy seguro porque no dispongo de la posibilidad de cambiarlo.

Gracias de antemano por la ayuda. Espero haber sabido explicar bien mis problemas.

Última edición por Seixas; 16/10/2007 a las 05:32 Razón: Facilitar el entendimiento de mi post
  #2 (permalink)  
Antiguo 16/10/2007, 08:03
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: ActiveTable con PDO. Error de configuración?

Cita:
Iniciado por Seixas Ver Mensaje
Saludos a todos,

estos días estoy empezando a programar con el patrón MVC, basándome en los ejemplos que GatorV ha dejado en su blog: patrón ActiveTable y ActiveRecord, PDO con singleton (Aprovecho para sumar una felicitación a su trabajo). Pues bien, para empezar a entender como funciona he copiado el código de las clases ActiveTable y ActiveRecord, las clases Automovil y Automoviles, la clase DB (que extiende PDO) y he creado una clase Config para los datos de la BD. Y tras empezar a probar todo el código juntito me da desgraciadamente hasta el momento tres errores que no consigo entender. Quizá alguno de vosotros, o el propio GatorV me pueda ayudar.



El primer error fue en la clase DB, en la siguiente línea:
Código PHP:
public function __construct() {
    
        
$config Config::getInstance();

        
$db $config->DBName;
        
$user $config->UserName;
        
$pwd $config->Password;
        
        
$attrs = array();
        
$dsn 'mysql:host=localhost;dbname=' $db;
        

        
parent::__construct$dsn$user$pwd$attrs );

            
$this->setAtributePDO::ATTR_ERRMODEPDO::ERR_MODE_EXCEPTION );


En la línea del $this-setAtribute(...) me da el siguiente error:
Fatal error: Call to undefined method DB::setAtribute()

Estube mirando por internet y me encontré que este tipo de método solo funciona utilizando MySQL 4.x. ¿Alguno confirma que es así? Al final lo que hice fue comentar la línea y dejarlo correr.
Hay un pequenio error y es que le falta una t, el metodo correcto es:

setAttribute

Cita:
Iniciado por Seixas Ver Mensaje

El segundo error que encontré fue en ActiveTable, en el método setup():

Código PHP:
$query "SHOW FIELDS FROM ?";
$command $this->_db->prepare$query );
        
$command->execute( array( $this->table ) ); 
Al hacer $command->execute me devuelve el siguiente error:
Call to a member function execute() on a non-object

Estuve provando y si sustituyo el "?" final en $query por el valor que debería tener , en este caso Automoviles, no me da tal error. ¿Alguien sabe a qué es debido?

Al final para poder seguir probando el código dejé Automoviles fijo, pero sería interesante poder poner el "?" para que la ActiveTable funcione con otras clases.
Un error muy extranio, que version de PHP y PDO manejas? Que driver estas tratandod e utilizar?

Cita:
Iniciado por Seixas Ver Mensaje

El tercer error con el que me encontré fue también en el método setup del ActiveTable.

Código PHP:
$command->execute( array( $table ) );

$fields = array();
$primary '';
        
while( 
$row $command->fetch() ) {
            
    
$fields[$field['Field']] = array(
        
"name" => $field['Field'],
        
"type" => $field['Type'],
        
"defaultValue" => $field['Default'],
        
"key" => $field['Key'],
    );
            
            
    if( 
$field['Key'] === "PRI" ) {
        
$primary $field['Field'];
    }
}

$this->_columns $fields;

if( empty( 
$primary ) ) {
    throw new 
Exception"Primary Column not found for Table: " $this->table );


Aquí el problema me lo encuentro en el while, ya que $command->fetch no devuelve ninguna fila, y no entiendo por qué, ya que en la base de datos tengo como mínimo un registro coche, y el nombre de la tabla corresponde a "Automoviles", como la clase. ¿Alguien cree saber a qué se debe?

He pensado que quizá se deba a la configuración de mi PDO en el servidor, pero no estoy seguro porque no dispongo de la posibilidad de cambiarlo.

Gracias de antemano por la ayuda. Espero haber sabido explicar bien mis problemas.
Aqui el error puede ser en esta parte:
Código PHP:
while( $row $command->fetch() ) { 
Cambialo por:
Código PHP:
while( $field $command->fetch() ) { 
Ahora eso te tiene que forzosamente regresar filas ya que el comando SHOW FIELDS FROM `tabla` te devuelve un descriptor de todas las columnas y tablas de la base de datos.

Saludos.
  #3 (permalink)  
Antiguo 17/10/2007, 03:13
Avatar de Seixas  
Fecha de Ingreso: mayo-2004
Ubicación: Barcelona
Mensajes: 60
Antigüedad: 20 años
Puntos: 0
Re: ActiveTable con PDO. Error de configuración?

Antes que nada, gracias GatorV por tu respuesta

Respecto al error 1, ¡correcto! Ese era el problema. Ya está solucionado.

Ahora tras solventar éste, me sale un nuevo error que diría se relaciona con el error 2 que comentaba más arriba:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1' in ->ruta física al archivo y linia<-, dónde dicha línea es:

Código PHP:
$command $this->_db->prepare$query ); 
y $query es:

Código PHP:
$query "SHOW FIELDS FROM ?"
Mi versión de PHP es la 5.1.6, y tengo instalados los drivers de PDO para mysql y pgsql. La versión de MySQL es la 5.0.37. El servidor funciona bajo unix.

He estado mirando la página de pdo->prepare en php.net y he probado esta otra forma de hacerlo:

Código PHP:
$query "SHOW FIELDS FROM :tabla";
        
$command $this->_db->prepare$query, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY) );
        
$command->execute( array( 'tabla' => $this->table ) ); 
... pero con los mismos resultados. Es raro porque el método prepare devuelve FALSE si no se puede preparar la declaración (statement) que luego ejecutrará el método execute, si no que me da el error directamente.

Si pruebo de poner la tabla "Automoviles" como hacía antes, sí que prepara correctamente la declaración, pero luego me encuentro con un error al hacer:

Código PHP:
$command->fetch() 
El error dice: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2053 '

Al haber resuelto el problema con setAttribute el objeto PDO me lanza excepciones que antes no lanzaba. Creo que tiene pinta de ser un problema de configuración, que afecta tanto al método prepare como al fecth.

He googleado un poco buscando sobre estos números de error y lo único que he encontrado ha sido con el tema de la codificación (yo utilizo UTF-8) pero tras cambiar mi dreamweaver a Europeo Occidental sigo con el mismo problema.

Estoy estancado. ¿A alguien se le ocurre algo?

Gracias por la ayuda.
  #4 (permalink)  
Antiguo 17/10/2007, 07:50
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: ActiveTable con PDO. Error de configuración?

Muy raro, no entiendo porque te pasa ese error, haz intentado probarlo via local? Puede que sea un problema de configuracion en algun lado ya que los comandos deberian de funcionar, pero si no te deja puedes preparar el query tu solo:
Código PHP:
$query sprintf"SHOW FIELDS FROM `%s`"$this->table );
$rst $this->_db->query$query );

while( 
$field $rst->fetch() ) { 
Saludos.
  #5 (permalink)  
Antiguo 18/10/2007, 01:47
Avatar de Seixas  
Fecha de Ingreso: mayo-2004
Ubicación: Barcelona
Mensajes: 60
Antigüedad: 20 años
Puntos: 0
Re: ActiveTable con PDO. Error de configuración?

Gracias de nuevo GatorV. Con el código que me indicas consigo solventar el problema con el prepare(), pero me sigue dando el error cuando llega al fetch().

No lo he probado vía local, pero intentaré hacerlo lo antes posible. En cuanto saque conclusiones lo posteo aquí.

Gracias de nuevo por tu interés.

Si alguien tiene idea de qué puede estar pasando, su ayuda será bien recibida. Gracias!

Un saludo!
  #6 (permalink)  
Antiguo 18/10/2007, 05:50
Avatar de Seixas  
Fecha de Ingreso: mayo-2004
Ubicación: Barcelona
Mensajes: 60
Antigüedad: 20 años
Puntos: 0
Re: ActiveTable con PDO. Error de configuración?

Tengo la enorme satisfacción de anunciar que ya me funciona.

Al final he decidido cambiarlo de servidor. Las características del nuevo comparado con el otro son:

Servidor antiguo: unix PHP 5.1.6 MySQL 5.037
Servidor nuevo: unix PHP 5.2.1 MySQL 5.037

Los métodos fetch() y prepare() funcionan correctamente, pero el execute() me sigue dando problemas con los "?" en la sentencia SQL, así que he seguido la sugerencia de GatorV de más arriba y usar sprintf().

Durante mi investigación he encontrado un problema parecido, cuya solución no ha servido para mí, pero que quizá ayude a otros: Error PDO::Statement->execute()

Un cordial saludo!
  #7 (permalink)  
Antiguo 18/10/2007, 08:05
GPS
 
Fecha de Ingreso: diciembre-2003
Ubicación: Montevideo, Uruguay
Mensajes: 110
Antigüedad: 20 años, 4 meses
Puntos: 0
Re: ActiveTable con PDO. Error de configuración?

La verdad este post lo encuentro de gran ayuda, cuando recién arranque a leer sobre el patrón MVC el ejemplo del bolg de GatorV me fue de gran ayuda, aunque había tenido los mismo problemas que Seixas, y nunca me llego a funcionar correctamente.
Cuando este con tiempo nuevamente voy a probar las cosas que han comentado.
Saludos!
  #8 (permalink)  
Antiguo 05/03/2008, 11:17
 
Fecha de Ingreso: mayo-2003
Mensajes: 18
Antigüedad: 21 años
Puntos: 0
Pregunta Re: ActiveTable con PDO. Error de configuración?

Hola

leyendo la internet y probando ciertos framewoks pude conocer todo esto de ACTIVERECORD y ACTIVE TABLE, pero por mas que he querido implementar lo que se propone en el blog y en este post no me ha funcionado, he echo lo que se ha descrito y todo la unica diferencia es mi BASe de datos pues es POSTGRES 8.0 en ves de MYSQL y me arroja un error a la hora de consultar los datos iniciales de la tabla es decir :

Armo la cadena a consultar sin problemas pero me sale error a la hora de leer las propiedades de la tabla.

Código:
// Instancia de Objeto PDO
// PDOStatement Object ( [queryString] => SHOW FIELDS FROM productos )

ERRNO: 256
TEXT: SQLSTATE[42601]: Syntax error: 7 ERROR:  syntax error at or near "FROM" at character 13
LOCATION: D:\AppServ\www\proyecto\comunicacion\activetable.php, line 44
lo cual sale después de preparar la cadenaQuery con los métodos del PDO.

La verdad me interesa poder implementar una clase ACTIVERECORD y ACTIVETABLE sin necesidad de estar amarrado un framework en especial.

Hasta el momento ya tengo armada la arquitectura del sitio ( un manejador de errores - un manejador de Conexiones"PDO" - Plantillas"Smarty") implementando el Modelo Vista Controlador MVC y quería poder usar ACtiveRecord en el y asi no utilizar procedimientos almacenados o funciones en mi Base de datos y dejar la generación del código de las consultas a el PHP.


o si pueden darme alguna sugerencia de que puedo hacer para hacer mucho mas Agil el desarrollo de aplicaciones utilizando modelos de programación acepto cualquier idea o sugerencia.
  #9 (permalink)  
Antiguo 05/03/2008, 11:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: ActiveTable con PDO. Error de configuración?

El error no es de PHP, mas bien es que PostgreSQL no soporta el comando SHOW FIELDS FROM table, lo que debes de hacer es uno de dos cosas:

1.- Usar pg_class para obtener el meta info, te dejo este link: http://www.alberton.info/postgresql_meta_info.html, con eso podras sacar las columnas de tu tabla y encontrar el primary key.

2.- Inyectar manualmente el nombre/tipo de tus columnas en la clase para que a la hora de insertar PHP sepa que columnas usar.

Saludos.
  #10 (permalink)  
Antiguo 06/08/2008, 20:29
 
Fecha de Ingreso: febrero-2007
Mensajes: 35
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: ActiveTable con PDO. Error de configuración?

Hola.

Quisiera saber si lograron solucionar los problemas mencionados, ya que me topé con los mismos y no he podido hacer funcionar ActiveTable y ActiveRecord. (también seguí el artículo del blog de GatorV).

Probé en dos servidores distintos, uno con PHP 5.2.1 y Mysql 5.0.37 y el otro con PHP 5.2.6 y Mysql 5.0.51.

Las tablas y/o indices deben ser creadas con alguna característica en particular??..

Por cierto, GatorV, gracias a tus artículos, ya tengo mi clase extendida de PDO con singleton implementada. :D


Saludos.
  #11 (permalink)  
Antiguo 06/08/2008, 21:16
 
Fecha de Ingreso: febrero-2007
Mensajes: 35
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: ActiveTable con PDO. Error de configuración?

Probando algunas cosas, me di cuenta que hay dos errores.

El primero tiene relación con la preparación de la consulta tal como lo dijeron antes. Ya que si ingreso manualmente el nombre de la tabla, realiza la operación.

Luego, el segundo, me indica que no encuentra la clave primaria de la tabla que consulta. Ya que hice lo siguiente :
/* Comente este bloque
*************************
if( $field['Key'] === "PRI" ) {
$primary = $field['Field'];
}
*************************/
// Y asigno el nombre del id de forma manual... con eso trabaja sin problemas, cero error.
$primary = 'idTabla';

Con esa información quizá sea más simple saber el porque del segundo error.

Saludos.
  #12 (permalink)  
Antiguo 06/08/2008, 21:53
 
Fecha de Ingreso: febrero-2007
Mensajes: 35
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: ActiveTable con PDO. Error de configuración?

Bueno, el segundo error ya lo solucioné haciendo el cambió indicó GatorV de reemplazar

while( $row = $command->fetch() ) {
Por
while( $field = $command->fetch() ) {

Ahora, volviendo al primero, error que arroja es:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;

Y la documentación de Mysql indica :
Error: 1064 SQLSTATE: 42000 (ER_PARSE_ERROR)

Voy a seguir tratando de encontrar alguna solución...

Saludos !
  #13 (permalink)  
Antiguo 07/08/2008, 08:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: ActiveTable con PDO. Error de configuración?

Hola claudiosalazarb,

Tiene mucho que no mantengo el ejemplo básico de PDO, te recomiendo que te mudes a algo más mantenido, como Zend_Db_Table.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 06:02.