Ver Mensaje Individual
  #2 (permalink)  
Antiguo 16/10/2007, 08:03
Avatar de GatorV
GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 7 meses
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.