Ver Mensaje Individual
  #4 (permalink)  
Antiguo 01/06/2006, 05:33
Casuis
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 3
Bueno va te voy a ayudar un poquillo jejeje. Voy a hacerte la clase model con unas cuantas funciones para que veas como va el tema.
Voy a utilizar adodb para optimizar un 400% las linias de código.

Estructura del miniproyecto:
+miniprueba
+adodb
- Model.php
- Mensajes.php
- index.php

la carpeta adodb seran las librerias adodb

te pongo la tabla mensajes
Cita:
CREATE TABLE `mensajes` (
`id` int(11) NOT NULL auto_increment,
`titulo` varchar(255) NOT NULL,
`mensaje` NOT NULL,
`fecha` datetime NOT NULL,
`autor` varchar(150) NOT NULL,
PRIMARY KEY (`id`)
) ;



INSERT INTO `mensajes` VALUES ('Tercer mensaje', 'Nuevo mensaje', '2006-05-01 16:55:29', 'Pepe');
INSERT INTO `mensajes` VALUES ('Tercer mensaje', 'Nuevo mensaje', '2006-05-01 17:00:39', 'Pablo');
Model.php (abstracto del que heredaran) los modelos

Código PHP:
require('adodb/adodb.inc.php');

class 
Model{
    
    var 
$tableName;
    var 
$fields;
    var 
$primaryKey;
    var 
$db;
    
    function 
Model(){
        
// obtenemos el nombre de la clase 
        
$this->tableName strtolower(get_class($this));
        
//esto normalmente se coje de la configuracion !!!
        //$dsn = 'mysql://user:pwd@localhost/mydb';
        
$dsn 'mysql://casuis:casuis@localhost/forosweb_development';
        
// creamos objeto adodb <-- tenemos que comprobar si hay error
        
$this->db ADONewConnection($dsn);
        
// obtenemos todos los campos en tiempo de ejecucion
        
$fields $this->db->MetaColumnNames($this->tableName);
        
$keys array_values($fields);
        foreach(
$keys as $fieldName){
            
$this->fields[$fieldName] = "";
        }    
        
//obtenemos un array para conseguir primarykey
        
$id $this->db->MetaPrimaryKeys($this->tableName);
        
// la primaryKey será la primera posición del array
        
$this->primaryKey array_shift($id);
    }
    
    function 
find($id){
        
$sql "select * from ".$this->tableName" where ".$this->primaryKey "=".intval($id);
        
$sql "select * from "$this->_table " where ".$this->_primaryKey ."=".intval($id);
        
$this->db->SetFetchMode(ADODB_FETCH_ASSOC); // asi tenemos un array asociativo
        
$rs $this->db->GetRow($sql);
        return 
$rs;        
    }
    function 
find_all($fields="*",$where=""$order=""){
        
        if(!
strlen($fields)) 
            
$fields "*";

        
$sql "select ".$fields " from "$this->tableName " where 1=1";
        
        if(
strlen($where)) 
            
$sql .= " AND ".$where;

        if(
strlen($order)) 
            
$sql .= " ORDER BY ".$order;
        
//echo $sql; exit; // solamente para debug
        
$this->db->SetFetchMode(ADODB_FETCH_ASSOC); // asi tenemos un array asociativo
        
$rs $this->db->GetArray($sql);
        return 
$rs;

    }
    
    function 
select($id){
        
        
$sql "select * from ".$this->_table ."where " $this->_primaryKey intval($id);
        
$rs $this->db->Execute($sql);
        
$this->fields $rs->Fields();
        
    }
    function 
delete($id){
        
$sql "delete from ".$this->_table ." where ".$this->_primaryKey ."=".$id;
        
$this->db->Execute($sql);
    }
    function 
getFields(){
        return 
$this->fields;
    }
    function 
setFields($fields){
        
$this->fields $fields;
    }

    function 
save($rs=""){
        if(!
strlen($rs))
            
$insertSQL $this->db->GetInsertSQL($this->tableName$this->fields);
        else 
            
$insertSQL $this->db->GetInsertSQL($this->tableName$rs);
            
//echo $insertSQL; exit; //solamente debug
        
if(!$this->db->Execute($insertSQL)){
            echo 
"error insertando:".$this->db->ErrorMsg();
            die();
        }else{
            
//retornaremos la id autogenerada
            
return $this->db->Insert_ID();
        }

    }

Mensajes.php
Código PHP:
require_once("Model.php");
class 
Mensajes extends Model{} 
Index.php será para hacer las pruebas por ejemplo seleccionamos todos los campos
Código PHP:
require_once("Mensajes.php");

$mensajes = new Mensajes();
$rs $mensajes->find_all();
foreach(
$rs as $row){
    echo 
$row['id']. "<br />";
    echo 
$row['titulo']. "<br />";
    echo 
$row['autor']. "<br />";

Seleccionamos todos los mensajes con condiciones:
Código PHP:
$mensajes = new Mensajes();
$where "id >2";
$order "autor";
$rs $mensajes->find_all("",$where,$order);

foreach(
$rs as $row){
    echo 
$row['id']. "<br />";
    echo 
$row['titulo']. "<br />";
    echo 
$row['autor']. "<br />";

y por ejemplo insertamos un nuevo campo
Código PHP:
$mensajes = new Mensajes();

$rs $mensajes->getFields();

$rs['titulo'] = "hola q tal";
$rs['mensaje'] = "mensajes insertado";
$rs['autor'] = "casuis";
$rs['fecha'] = date("Y-m-d");
$id $mensajes->save($rs);
echo 
$id
Fácil no? bueno te faltan implementar algunas funciones pero lo dejo a tu manera tambien puedes poner de informacion como getTableName o setTableName etc... Es un comienzo solo nos falta el controlador y la vista. De hecho se puede hacer un MVC en unos minutillos pero esos secretos estan muy bien guardados ajajaja
Suerte

Por cierto en la linia
Código PHP:
$this->db ADONewConnection($dsn); 
no estaria del todo bien ya que cada modelo crearia una nueva instancia de adodb
Para evitar esto tendriamos que hacer
Código PHP:
$this->db dataManager::getInstance(); 
donde dataManager es una clase que implementa a mi amigo "singleton" que se asegurará de devolver una única instancia de adodb

Última edición por Casuis; 01/06/2006 a las 05:46