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