KumbiaPHP / ActiveRecord

New Active Record for KumbiaPHP
https://kumbiaphp.com
BSD 3-Clause "New" or "Revised" License
24 stars 11 forks source link

Problemas al hacer insert con LiteRecord #55

Closed ghost closed 9 years ago

ghost commented 9 years ago

Hago el contexto en primer lugar. Tenía una app más menos armada en beta2, pero quería saber qué tal iría al cargarla sobre 1.0rc. Estuve realizando arreglos principalmente en lo que respecta a las consultas (SELECT) sin mayores complicaciones, pero a la hora de intentar hacer el proceso de creación (INSERT) éstos no pasan. Por lo que pude revisar, la problemática es que me genera el campo id en la lista de valores a insertar, y no cuadra el número de atributos versus el número de valores. He revisado la tabla y ésta cuenta con la definición de clave primaria (en el campo id), y es autoincremental. De hecho, los insert funcionan a la perfección usando beta2, pero algo extraño sucede con PDO a la hora de calcular la lista de atributos que no deben contemplarse en el insert.

joanhey commented 9 years ago

Puedes pasar el código para verlo ?

ghost commented 9 years ago

Hola, en tener una ventana de tiempo subo un repositorio.

Saludos!

----- Reply message ----- De: "Joan Miquel" notifications@github.com Para: "KumbiaPHP/ActiveRecord" ActiveRecord@noreply.github.com CC: "Nelson Alberto Rojas Nuñez" nelson.rojas.n@gmail.com Asunto: [ActiveRecord] Problemas al hacer insert con LiteRecord (#55) Fecha: mié., jul. 29, 2015 08:28 Puedes pasar el código para verlo ?

— Reply to this email directly or view it on GitHub.

ghost commented 9 years ago

No puedo volver a reproducir el problema. Puede ser que haya tenido algo que ver con el hecho de que la base de datos la generé usando un programa de diseño (DbWrench). Acabo de probar una inserción sencilla y lo ha creado al primer intento. Lo que no me ha creado es un atributo con el sufijo _at (que es de tipo datetime). De todos modos el código que acabo de probar es el siguiente:

//esquema de la tabla CREATE TABLE categoria ( id int(11) NOT NULL AUTO_INCREMENT, nombre varchar(200) NOT NULL, creado_at datetime DEFAULT NULL, slug varchar(200) DEFAULT NULL, icono varchar(40) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;

//lite_record en app/lib/lite_record.php use Kumbia\ActiveRecord\LiteRecord as ORM;

class LiteRecord extends ORM { public static function listar() { return static::all("SELECT * FROM " . static::getSource()); }

public static function optionsForSelect($show)
{
    return static::all("SELECT id, {$show} FROM " . static::getSource());
}

public static function getFirst($id)
{
    return static::first("SELECT * FROM " . static::getSource() . 
                         " WHERE id = " . (int)$id);
}

}

//modelo de categoria en app/models/categoria.php class Categoria extends LiteRecord {

}

//controller con las funciones basicas en app/cotrollers/categorias_controller.php class CategoriasController extends AppController { function index() { $this->categorias = Categoria::listar(); }

function agregar()
{
    if (Input::hasPost('categoria')) {
        $categoria = new Categoria(Input::post('categoria'));
        if ($categoria->create()) {
            Flash::valid('Categoria guardada exitosamente');
            Redirect::to(); //index
        }
    }
}

}

//vista agregar.phtml

Agregar una categoria

<?= Form::open(); ?> <?= Form::label('NOMBRE'); ?> <?= Form::text('categoria.nombre'); ?> <?= Form::label('SLUG'); ?> <?= Form::text('categoria.slug'); ?> <?= Form::label('ICONO'); ?> <?= Form::text('categoria.icono'); ?> <?= Form::submit('AGREGAR'); ?> <?= Form::close(); ?>

joanhey commented 9 years ago

No especificas el error, para ayudarte. Pero si veo, que estas usando mal el LiteRecord, al usar los parámetros directamente en tu consulta, en vez de prepared query (que son seguras)

MAL static::all("SELECT id, {$show} FROM " . static::getSource()); BIEN static::all("SELECT id, ? FROM " . static::getSource(), $show);

MAL static::first("SELECT * FROM " . static::getSource() . " WHERE id = " . (int)$id); BIEN static::first("SELECT * FROM " . static::getSource() . " WHERE id = ?", (int)$id);

joanhey commented 9 years ago

Además se pueden simplificar esas consultas

joanhey commented 9 years ago

Leyendo otra vez, el LiteRecord no proporciona ni _at ni _in

ghost commented 9 years ago

Estimado Joanhey: Te agradezco el tiempo que dedicaste en responderme. Ciertamente tus comentarios me serán de gran utilidad para corregir los malos hábitos de programación.

Saludos cordiales :-)

2015-08-19 10:20 GMT-03:00 Joan Miquel notifications@github.com:

Leyendo otra vez, el LiteRecord no proporciona ni _at ni _in

— Reply to this email directly or view it on GitHub https://github.com/KumbiaPHP/ActiveRecord/issues/55#issuecomment-132592535 .

Nelson Rojas Nuñez Ingeniero de Ejecución en Computación e Informática (UCM Talca)

Correo: nelson.rojas.n@gmail.com / nelson_rojas_n@hotmail.com Sitio Web: http://nelsonrojas.wordpress.com Sitio Web Alternativo: http://profenelsonrojas.blogspot.com Canal de Youtube: https://www.youtube.com/nelsononrails