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->setAtribute( PDO::ATTR_ERRMODE, PDO::ERR_MODE_EXCEPTION );
}
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 ) );
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.