Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Evitar eliminar registros con php

Estas en el tema de Evitar eliminar registros con php en el foro de PHP en Foros del Web. Hola a todos, acá estoy con un dilema verán tengo 2 tablas: roles(rolId, rolNombre) usuarios(usuId, usuNick, usuPass, usuMail, usuNombre, usuApellido, usuStatus, rolId) roles(rolId) => rolId ...
  #1 (permalink)  
Antiguo 07/01/2016, 21:40
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Evitar eliminar registros con php

Hola a todos, acá estoy con un dilema verán tengo 2 tablas:

roles(rolId, rolNombre)

usuarios(usuId, usuNick, usuPass, usuMail, usuNombre, usuApellido, usuStatus, rolId)
roles(rolId) => rolId

la cuestión es que los usuarios usan su rol, hasta ahí bien, pero cuando elimino el rol también se borrarían los usuarios de ese rol, quería preguntarles que es mejor usar un trigger en mysql o una función que determine la cantidad de usuarios con ese rol??

este es el código para eliminar:

public function eliminame($rol){
$sql="delete from roles where rolId=?";
$consulta = $this->getBD()->prepare($sql);
$consulta->execute(array($rol->getId()));
return ($consulta->rowCount() > 0) ? $rol->getId() : null;
}

Quiero evitar de que los roles que estan en uso no sean borrados, los que no sí.

Espero sus respuestas y saludos
  #2 (permalink)  
Antiguo 08/01/2016, 06:47
 
Fecha de Ingreso: enero-2016
Mensajes: 71
Antigüedad: 8 años, 3 meses
Puntos: 14
Respuesta: Evitar eliminar registros con php

Puedes usar
Código:
NOT IN
en tu query.
Quedaría de esta forma (parametrizalo para poder reutilizar el método como antes).
Código PHP:
public function eliminame($rol$notUsed true) {
    
$sql "DELETE FROM roles WHERE rolId = ?";

    if (
$notUsed === true) {
        
$sql .= ' AND NOT IN (SELECT DISTINCT rolId FROM usuarios)';
    }

    
$consulta $this->getBD()->prepare($sql);
    
$consulta->execute(array($rol->getId()));

    return (
$consulta->rowCount() > 0) ? $rol->getId() : null;

  #3 (permalink)  
Antiguo 08/01/2016, 16:10
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Evitar eliminar registros con php

hola x_atrix probé el código del cual me lo diste pero sale este error:

DELETE FROM roles WHERE rolId = ? AND NOT IN (SELECT DISTINCT rolId FROM usuarios) // esto es un echo

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IN (SELECT DISTINCT rolId FROM usuarios)' at line 1

¿porque será? saludos y espero respuestas.
  #4 (permalink)  
Antiguo 08/01/2016, 16:36
 
Fecha de Ingreso: enero-2016
Mensajes: 71
Antigüedad: 8 años, 3 meses
Puntos: 14
Respuesta: Evitar eliminar registros con php

Le falta el rolId despues del AND
Código PHP:
public function eliminame($rol$notUsed true) { 
    
$sql "DELETE FROM roles WHERE rolId = ?"

    if (
$notUsed === true) { 
        
$sql .= ' AND rolId NOT IN (SELECT DISTINCT rolId FROM usuarios)'
    } 

    
$consulta $this->getBD()->prepare($sql); 
    
$consulta->execute(array($rol->getId())); 

    return (
$consulta->rowCount() > 0) ? $rol->getId() : null

Un saludo,
  #5 (permalink)  
Antiguo 08/01/2016, 17:33
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Evitar eliminar registros con php

Hola x_atrix, lo probé y funcionó a la perfeccción, me validó lo más bien los mensajes q tenía en mi controlador:

public function delete(){
if($this->checkUser()){
if (isset($_GET['p'])){
$rol = $this->modelo->obtenerPorId($_GET['p']);
$id= $this->modelo->eliminame($rol);
Session::set("msg", (isset($id)) ? "Rol Borrado" : "No se pudo borrar el rol");
header("Location:index.php?c=roles&a=index");
}
}
}

Mil gracias, ahora adaptaré esto otros delete q tengo, nuevamente Mil gracias!!
  #6 (permalink)  
Antiguo 08/01/2016, 18:18
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Evitar eliminar registros con php

Lo adapté al código a otros delete y funciona lo más bien, ahora x_atrix quería preguntarte lo siguiente:

roles(rolId, rolNombre)

Tengo el rolNombre para ingresar y en la base de datos esta como clave única pero quería saber cómo hacer para mostrar un mensaje de: "El rol ya existe" tanto para guardar y editar, sólo que en el editar sucede que si no modifico el nombre y lo demás me puede salir ese mensaje.

Te muestro el código:

RolModel:

Código PHP:
Ver original
  1. public function guardame($rol){
  2.         $sql="insert into roles(rolNombre) values(?)";
  3.         $consulta = $this->getBD()->prepare($sql);
  4.         $consulta->execute(array($rol->getNombre()));
  5.         return ($consulta->rowCount() > 0) ? $this->getBD()->lastInsertId() : null;
  6.     }
  7.     public function modificame($rol){
  8.         $sql="update roles set rolNombre=? where rolId=?";
  9.         $consulta = $this->getBD()->prepare($sql);
  10.         $consulta->execute(array($rol->getNombre(),$rol->getId()));
  11.         return ($consulta->rowCount() > 0) ? $rol->getId() : null;
  12.     }

RolesController:

Código PHP:
Ver original
  1. public function add(){
  2.         if($this->checkUser()){
  3.             if (isset($_POST['btnaceptar'])) {
  4.                 if($this->checkDates()) {                
  5.                     $rol = new Rol(0, $_POST['txtnom']);
  6.                     $this->modelo->guardame($rol);
  7.                     Session::set("msg","Rol Creado");
  8.                     header("Location:index.php?c=roles&a=index");
  9.                     exit();
  10.                 }
  11.             }
  12.             $this->redirect(array('add.php'));
  13.         }
  14.     }  
  15.     public function edit(){        
  16.         if($this->checkUser()){
  17.             Session::set("id",$_GET['p']);
  18.             if (Session::get('id')!=null && isset($_POST['btnaceptar'])){                            
  19.                 if($this->checkDates()) {                
  20.                     $rol= new Rol($_POST['hid'],$_POST['txtnom']);
  21.                     $this->modelo->modificame($rol);
  22.                     Session::set("msg","Rol Editado");
  23.                     header("Location:index.php?c=roles&a=index");
  24.                     exit();
  25.                 }
  26.             }
  27.             $this->redirect(array('edit.php'),array(
  28.                 "rol" => $this->modelo->obtenerPorId(Session::get('id'))
  29.             ));
  30.         }        
  31.     }

Te lo pregunto xq me gustó mucho cómo me ayudaste con el borrar... Saludos y espero respuestas.
  #7 (permalink)  
Antiguo 08/01/2016, 21:50
 
Fecha de Ingreso: enero-2016
Mensajes: 71
Antigüedad: 8 años, 3 meses
Puntos: 14
Respuesta: Evitar eliminar registros con php

Necesitas un metodo de validacion del nombre.

Ejemplo (dentro de tu modelo ya que es responsabilidad de un modelo saber si un nombre existe).
Código PHP:
public function existeNombre($nombre) {
    
$query 'SELECT rolId FROM roles WHERE rolNombre = ?';

    
$consulta $this->getBD()->prepare($query);
    
$consulta->execute([$nombre]);

    
// Indicar si hay algo en la base de datos con este nombre
    
return $consulta->rowCount() > 0;

Dentro de los dos metodos del controlador deberias comprobar si este nombre ya existe pero con una diferencia. Para el caso de modificar primero comprueba que no tenga el mismo nombre de antes (basicamente no se intenta actualizar con el mismo nombre).

Para el caso de alta:
Si ya existe guardar en sesion el mensaje de que ya existe.

Para el caso de actualizar:
Si el nombre es el mismo que el anterior mostrar que no se modificó nada, si el nombre es diferente, usar el mismo metodo de nombre existente y si ya existe mostrar error de que el nombre ya existe en caso contrario, todo esta ok...

Como lo ves para implementarlo tu esto?

TIP* Segun lo tienes estructurado necesitaras un metodo que te diga el nombre del rol buscando por ID para saber si se ha cambiado o no...

Para mejorar:
1. Piensa un solo método para guardar sin importar si existe o no el Rol e internamente la clase RolModel debe saber si es un insert o es un update. Esta lógica no le pertenece al controlador...
2. Seria mas legible algo asi:
Código PHP:
$rol = new Rol(0$_POST['txtnom']);
$rol->guardar(); 
que esto otro:
Código PHP:
$rol = new Rol(0$_POST['txtnom']);
$this->modelo->guardame($rol); 
  #8 (permalink)  
Antiguo 09/01/2016, 15:18
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Evitar eliminar registros con php

Hola x_atrix ¿cómo estás? mira, hice lo que me dijiste y anduvo, te muestro a ver cómo lo ves:

RolesController.php

Código PHP:
Ver original
  1. public function add(){
  2.         if($this->checkUser()){
  3.             if (isset($_POST['btnaceptar'])) {
  4.                 if($this->checkDates()) {                
  5.                     $rol = new Rol(0, $_POST['txtnom']);
  6.                     $id= $this->modelo->guardame($rol);
  7.                     Session::set("msg",(isset($id)) ? "Rol Creado" : Session::get('msg'));
  8.                     header("Location:index.php?c=roles&a=index");
  9.                     exit();
  10.                 }
  11.             }
  12.             $this->redirect(array('add.php'));
  13.         }
  14.     }  
  15.     public function edit(){        
  16.         if($this->checkUser()){
  17.             Session::set("id",$_GET['p']);
  18.             if (Session::get('id')!=null && isset($_POST['btnaceptar'])){                            
  19.                 if($this->checkDates()) {                
  20.                     $rol= new Rol($_POST['hid'],$_POST['txtnom']);
  21.                     $id= $this->modelo->modificame($rol);
  22.                     Session::set("msg",(isset($id)) ? "Rol Editado" : Session::get('msg'));
  23.                     header("Location:index.php?c=roles&a=index");
  24.                     exit();
  25.                 }
  26.             }
  27.             $this->redirect(array('edit.php'),array(
  28.                 "rol" => $this->modelo->obtenerPorId(Session::get('id'))
  29.             ));
  30.         }        
  31.     }

RolModel.php

Código PHP:
Ver original
  1. public function guardame($rol){
  2.         if($this->checkRol($rol->getNombre())){
  3.             Session::set('msg', 'El rol ya existe');
  4.             return null;
  5.         }
  6.         $sql="insert into roles(rolNombre) values(?)";
  7.         $consulta = $this->getBD()->prepare($sql);
  8.         $consulta->execute(array($rol->getNombre()));
  9.         return ($consulta->rowCount() > 0) ? $this->getBD()->lastInsertId() : null;
  10.     }
  11.     public function modificame($rol){
  12.         $aux = $this->obtenerPorId($rol->getId());
  13.         if(!$rol->equals($aux)){
  14.             if($this->checkRol($rol->getNombre())){
  15.                 Session::set('msg', 'El rol ya existe');
  16.                 return null;
  17.             }        
  18.         }
  19.         $sql="update roles set rolNombre=? where rolId=?";
  20.         $consulta = $this->getBD()->prepare($sql);
  21.         $consulta->execute(array($rol->getNombre(),$rol->getId()));
  22.         return ($consulta->rowCount() > 0) ? $rol->getId() : null;
  23.     }
  24.     private function checkRol($nombre) {
  25.         $query = 'SELECT rolId FROM roles WHERE rolNombre = ?';
  26.         $consulta = $this->getBD()->prepare($query);
  27.         $consulta->execute([$nombre]);
  28.         // Indicar si hay algo en la base de datos con este nombre
  29.         return $consulta->rowCount() > 0;
  30.     }

y lo único que agregue fue el equals a la clase Rol:

Código PHP:
Ver original
  1. <?php
  2. namespace Clases;
  3. class Rol {
  4.     private $id;
  5.     private $nombre;
  6.     function getId() {
  7.         return $this->id;
  8.     }
  9.     function getNombre() {
  10.         return $this->nombre;
  11.     }    
  12.     function setNombre($nombre) {
  13.         $this->nombre = $nombre;
  14.     }
  15.     function __construct($xid, $xnombre) {
  16.         $this->id = $xid;
  17.         $this->nombre = $xnombre;
  18.     }
  19.     public function equals(Rol $obj){
  20.         return $this->nombre == $obj->nombre;                
  21.     }
  22. }

Con respecto a la mejora que me dijiste lo tengo muy presente además eso me serviría muy bien para el guardame, modificame y eliminame, pero te pregunto: ¿cómo haría para el obtenerPorId o los obtenerDatos? lo único que se me ocurre es poner un constructor vacío, a las clases conozcan a sus modelos, pero quiero una opinión tuya con respecto a eso, por otro lado Mil gracias, luego adaptare lo que me dijiste.

PD: lástima que php no tenga para sobreescribir el equals como java
  #9 (permalink)  
Antiguo 10/01/2016, 11:05
 
Fecha de Ingreso: enero-2016
Mensajes: 71
Antigüedad: 8 años, 3 meses
Puntos: 14
Respuesta: Evitar eliminar registros con php

Hola,

Según lo que veo en añadir el ID lo pones a 0 y en editar sabes cual es su id real.

Comprueba este ID para saber si ejecutas el guardame o modificame. Ejemplo:
Código PHP:
Ver original
  1. public function guardar() {
  2.     if ($this->id === 0) {
  3.         return $this->guardame();
  4.     } else {
  5.         return $this->modificame();
  6.     }
  7. }
Los métodos guardame y modificame los cambias a protegidos para no poder acceder a ellos directamente desde fuera y estar obligado a usar el guardar().
  #10 (permalink)  
Antiguo 10/01/2016, 22:26
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Evitar eliminar registros con php

Hola x_atrix, adapté lo que me dijiste y funciona, gracias:

Rol.php

Código PHP:
Ver original
  1. <?php
  2. namespace Clases;
  3. use \Model\RolModel;
  4. class Rol
  5. {
  6.     private $id;
  7.     private $nombre;
  8.     private $mod;
  9.     function getId() {
  10.         return $this->id;
  11.     }
  12.     function getNombre() {
  13.         return $this->nombre;
  14.     }    
  15.     function setNombre($nombre) {
  16.         $this->nombre = strtoupper($nombre);
  17.     }
  18.     function __construct($xid, $xnombre) {
  19.         $this->id = $xid;
  20.         $this->nombre = strtoupper($xnombre);
  21.     }
  22.     public function equals(Rol $obj){
  23.         return $this->nombre == $obj->nombre;                
  24.     }
  25.     public function save(){
  26.         $this->mod = new RolModel();
  27.         return ($this->id == 0) ? $this->mod->guardame($this) : $this->mod->modificame($this);
  28.     }
  29.     public function del(){
  30.         $this->mod = new RolModel();
  31.         return $this->mod->eliminame($this);
  32.     }
  33. }

RolesController.php

Código PHP:
Ver original
  1. <?php
  2. namespace Controller;
  3. use \App\Controller;
  4. use \App\Session;
  5. use \Model\RolModel;
  6. use \Clases\Rol;
  7. class RolesController extends Controller
  8. {
  9.     private $modelo;
  10.     function __construct() {
  11.         parent::__construct();
  12.         $this->modelo= new RolModel();
  13.     }
  14.     public function index(){
  15.         if($this->checkUser()){
  16.             $this->redirect(array("index.php"),array(
  17.                 "roles" => $this->modelo->obtenerTodos()
  18.             ));
  19.         }  
  20.     }
  21.     public function add(){
  22.         if($this->checkUser()){
  23.             if (isset($_POST['btnaceptar'])) {
  24.                 if($this->checkDates()) {                
  25.                     $rol = new Rol(0, $_POST['txtnom']);
  26.                     //$id= $this->modelo->guardame($rol);
  27.                     $id = $rol->save();
  28.                     Session::set("msg",(isset($id)) ? "Rol Creado" : Session::get('msg'));
  29.                     header("Location:index.php?c=roles&a=index");
  30.                     exit();
  31.                 }
  32.             }
  33.             $this->redirect(array('add.php'));
  34.         }
  35.     }  
  36.     public function edit(){        
  37.         if($this->checkUser()){
  38.             Session::set("id",$_GET['p']);
  39.             if (Session::get('id')!=null && isset($_POST['btnaceptar'])){                            
  40.                 if($this->checkDates()) {                
  41.                     $rol= new Rol($_POST['hid'],$_POST['txtnom']);
  42.                     //$id= $this->modelo->modificame($rol);
  43.                     $id = $rol->save();
  44.                     Session::set("msg",(isset($id)) ? "Rol Editado" : Session::get('msg'));
  45.                     header("Location:index.php?c=roles&a=index");
  46.                     exit();
  47.                 }
  48.             }
  49.             $this->redirect(array('edit.php'),array(
  50.                 "rol" => $this->modelo->obtenerPorId(Session::get('id'))
  51.             ));
  52.         }        
  53.     }
  54.     public function delete(){
  55.         if($this->checkUser()){
  56.             if (isset($_GET['p'])){
  57.                 $rol = $this->modelo->obtenerPorId($_GET['p']);
  58.                 //$id= $this->modelo->eliminame($rol);
  59.                 $id= $rol->del();
  60.                 Session::set("msg", (isset($id)) ? "Rol Borrado" : "No se pudo borrar el rol");
  61.                 header("Location:index.php?c=roles&a=index");
  62.             }                          
  63.         }
  64.     }
  65.     private function checkDates(){
  66.         if(empty($_POST['txtnom'])){
  67.             Session::set("msg","Ingrese los datos obligatorios (*) para continuar.");
  68.             return false;
  69.         }
  70.         else{
  71.             return true;
  72.         }
  73.     }
  74.     private function checkUser(){
  75.         if(Session::get("log_in")!= null and Session::get("log_in")->getRol()->getNombre() == "ADMIN"){
  76.             return true;
  77.         }
  78.         else {
  79.             Session::set("msg","Debe ser administrador para acceder.");
  80.             $this->redirect(array('Main','index.php'));
  81.         }
  82.     }
  83. }

Pero tuve el problema que en la clase Rol no podía instanciar el modelo en el constructor xq si lo hacía parte del sistema me dejaba de funcionar, ¿porque será?
En el controlador te pregunto ¿cómo hacer algo parecido a lo que me dijiste pero con obtenerTodos y obtenerPorId? porque según lo puesto estaríamos haciendo que la clase persista sus propios datos, probé agregarle a la clase Rol otro constructor vacío para instanciar el modelo pero php no deja hacer más de un controlador ¿que debo hacer?

Saludos y espero respuestas.
  #11 (permalink)  
Antiguo 11/01/2016, 05:58
 
Fecha de Ingreso: enero-2016
Mensajes: 71
Antigüedad: 8 años, 3 meses
Puntos: 14
Respuesta: Evitar eliminar registros con php

Cual es la diferencia entre la clase Rol y la clase RolModel? No deberías tener dos. Es la misma clase. Todo el código para tratar con los roles debería ir en RolModel o Rol como lo quieras llamar pero solo una no dos.

En PHP para simular la sobrecarga como en java (método sobrecargado) hay que darle valores por defecto a los parámetros.

Código PHP:
public function __construct($id 0$nombre '') {
    
// Codigo ... 

En este caso te funcionará new Rol() o bien new Rol(22) o bien new Rol(22, 'Admin') - parecido a tener definidos tres constructores. Esto funciona para cualquier tipo de método no solo para __construct.

Que código tienes en la clase RolModel?
  #12 (permalink)  
Antiguo 11/01/2016, 12:08
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Evitar eliminar registros con php

Hola x_atrix, digamos que en Rol tengo los atributos de la clase en sí, pero en RolModel tengo lo necesario para persistir los datos del rol

Rol.php

Código PHP:
Ver original
  1. <?php
  2. namespace Clases;
  3. use \Model\RolModel;
  4. class Rol
  5. {
  6.     private $id;
  7.     private $nombre;
  8.     private $mod;
  9.     function getId() {
  10.         return $this->id;
  11.     }
  12.     function getNombre() {
  13.         return $this->nombre;
  14.     }    
  15.     function setNombre($nombre) {
  16.         $this->nombre = strtoupper($nombre);
  17.     }
  18.     function __construct($xid, $xnombre) {
  19.         $this->id = $xid;
  20.         $this->nombre = strtoupper($xnombre);
  21.     }
  22.     public function equals(Rol $obj) {
  23.         return $this->nombre == $obj->nombre;                
  24.     }
  25.     public function save(){
  26.         $this->mod = new RolModel();
  27.         return ($this->id == 0) ? $this->mod->guardame($this) : $this->mod->modificame($this);
  28.     }
  29.     public function del(){
  30.         $this->mod = new RolModel();
  31.         return $this->mod->eliminame($this);
  32.     }
  33. }

RolModel.php

Código PHP:
Ver original
  1. <?php
  2. namespace Model;
  3. use \PDO;
  4. use \App\Model;
  5. use \App\Session;
  6. use \Clases\Rol;
  7. class RolModel extends Model
  8. {
  9.     function __construct() {
  10.         parent::__construct();
  11.     }
  12.     public function obtenerTodos(){
  13.         $sql="select * from roles";
  14.         $datos= array();
  15.         $consulta = $this->getBD()->prepare($sql);
  16.         $consulta->execute();
  17.         foreach($consulta->fetchAll(PDO::FETCH_ASSOC) as $row){
  18.             $rol = new Rol($row['rolId'], $row['rolNombre']);
  19.             array_push($datos, $rol);
  20.         }
  21.         return $datos;
  22.     }
  23.     public function guardame($rol){
  24.         if($this->check($rol->getNombre())){
  25.             Session::set('msg', 'El rol ya existe');
  26.             return null;
  27.         }
  28.         $sql="insert into roles(rolNombre) values(?)";
  29.         $consulta = $this->getBD()->prepare($sql);
  30.         $consulta->execute(array($rol->getNombre()));
  31.         return ($consulta->rowCount() > 0) ? $this->getBD()->lastInsertId() : null;
  32.     }
  33.     public function modificame($rol){
  34.         $aux = $this->obtenerPorId($rol->getId());
  35.         if(!$rol->equals($aux)){
  36.             if($this->check($rol->getNombre())){
  37.                 Session::set('msg', 'El rol ya existe');
  38.                 return null;
  39.             }        
  40.         }
  41.         $sql="update roles set rolNombre=? where rolId=?";
  42.         $consulta = $this->getBD()->prepare($sql);
  43.         $consulta->execute(array($rol->getNombre(),$rol->getId()));
  44.         return ($consulta->rowCount() > 0) ? $rol->getId() : null;
  45.     }
  46.     private function check($unique) {
  47.         $query = 'SELECT rolId FROM roles WHERE rolNombre = ?';
  48.         $consulta = $this->getBD()->prepare($query);
  49.         $consulta->execute([$unique]);
  50.         // Indicar si hay algo en la base de datos con este nombre
  51.         return $consulta->rowCount() > 0;
  52.     }
  53.     public function eliminame($rol, $notUsed = true) {
  54.         $sql = "DELETE FROM roles WHERE rolId = ?";
  55.         if ($notUsed === true) {
  56.             $sql .= ' AND rolId NOT IN (SELECT DISTINCT rolId FROM usuarios)';
  57.         }
  58.         $consulta = $this->getBD()->prepare($sql);
  59.         $consulta->execute(array($rol->getId()));
  60.         return ($consulta->rowCount() > 0) ? $rol->getId() : null;
  61.     }
  62.     public function obtenerPorId($id) {
  63.         $consulta = $this->getBD()->prepare("SELECT * FROM roles WHERE rolId = ?");
  64.         $consulta->execute(array($id));
  65.         if($consulta->rowCount() > 0) {
  66.             $res= $consulta->fetchAll(PDO::FETCH_ASSOC)[0];
  67.             return new Rol($res['rolId'], $res['rolNombre']);
  68.         }
  69.         else {
  70.             return null;
  71.         }
  72.     }
  73. }

lo que no entiendo es porque en el constructor dónde le paso los parámetros del rol, no puedo instanciar el modelo y deja de funcionar parte del sistema??

Espero respuestas y saludos.
  #13 (permalink)  
Antiguo 11/01/2016, 12:27
 
Fecha de Ingreso: enero-2016
Mensajes: 71
Antigüedad: 8 años, 3 meses
Puntos: 14
Respuesta: Evitar eliminar registros con php

Por los parámetros que necesita ... si le defines parámetros de entrada pero no se los pasas falla.
  #14 (permalink)  
Antiguo 11/01/2016, 20:50
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Evitar eliminar registros con php

Hola x_atrix adapté un poco las cosas en Rol al final me quedó así:

Rol.php

Código PHP:
Ver original
  1. <?php
  2. namespace Clases;
  3. use \Model\RolModel;
  4. class Rol
  5. {
  6.     private $id;
  7.     private $nombre;
  8.     private $modelo;
  9.     function getId() {
  10.         return $this->id;
  11.     }
  12.     function getNombre() {
  13.         return $this->nombre;
  14.     }    
  15.     function setNombre($nombre) {
  16.         $this->nombre = strtoupper($nombre);
  17.     }
  18.     function __construct() {
  19.         $args = func_get_args();
  20.         $nargs = func_num_args();
  21.         switch($nargs){
  22.             case 1:
  23.                 self::__construct0();
  24.                 break;
  25.             case 2:
  26.                 self::__construct1($args[0], $args[1]);
  27.                 break;
  28.         }
  29.     }
  30.     function __construct0() { }
  31.     function __construct1($xid, $xnombre) {
  32.         $this->id = $xid;
  33.         $this->nombre = strtoupper($xnombre);
  34.     }
  35.     public function equals(Rol $obj) {
  36.         return $this->nombre == $obj->nombre;                
  37.     }
  38.     public function save(){
  39.         $this->modelo = new RolModel();
  40.         return ($this->id == 0) ? $this->modelo->guardame($this) : $this->modelo->modificame($this);
  41.     }
  42.     public function del(){
  43.         $this->modelo = new RolModel();
  44.         return $this->modelo->eliminame($this);
  45.     }
  46.     public function obtenerTodos(){
  47.         $this->modelo = new RolModel();
  48.         return $this->modelo->obtenerTodos();
  49.     }
  50.     public function obtenerPorId($id){
  51.         $this->modelo = new RolModel();
  52.         return $this->modelo->obtenerPorId($id);
  53.     }
  54. }

RolesController.php

Código PHP:
Ver original
  1. <?php
  2. namespace Controller;
  3. use \App\Controller;
  4. use \App\Session;
  5. use \Clases\Rol;
  6. class RolesController extends Controller
  7. {
  8.     function __construct() {
  9.         parent::__construct();
  10.     }
  11.     public function index(){
  12.         if($this->checkUser()){
  13.             $this->redirect(array("index.php"),array(
  14.                 "roles" => (new Rol())->obtenerTodos()
  15.             ));
  16.         }  
  17.     }
  18.     public function add(){
  19.         if($this->checkUser()){
  20.             if (isset($_POST['btnaceptar'])) {
  21.                 if($this->checkDates()) {                
  22.                     $rol = new Rol(0, $_POST['txtnom']);
  23.                     $id = $rol->save();
  24.                     Session::set("msg",(isset($id)) ? "Rol Creado" : Session::get('msg'));
  25.                     header("Location:index.php?c=roles&a=index");
  26.                     exit();
  27.                 }
  28.             }
  29.             $this->redirect(array('add.php'));
  30.         }
  31.     }  
  32.     public function edit(){        
  33.         if($this->checkUser()){
  34.             Session::set("id",$_GET['p']);
  35.             if (Session::get('id')!=null && isset($_POST['btnaceptar'])){                            
  36.                 if($this->checkDates()) {                
  37.                     $rol= new Rol($_POST['hid'],$_POST['txtnom']);
  38.                     $id = $rol->save();
  39.                     Session::set("msg",(isset($id)) ? "Rol Editado" : Session::get('msg'));
  40.                     header("Location:index.php?c=roles&a=index");
  41.                     exit();
  42.                 }
  43.             }
  44.             $this->redirect(array('edit.php'),array(
  45.                 "rol" => (new Rol())->obtenerPorId(Session::get('id'))
  46.             ));
  47.         }        
  48.     }
  49.     public function delete(){
  50.         if($this->checkUser()){
  51.             if (isset($_GET['p'])){
  52.                 $rol = (new Rol())->obtenerPorId($_GET['p']);
  53.                 $id= $rol->del();
  54.                 Session::set("msg", (isset($id)) ? "Rol Borrado" : "No se pudo borrar el rol");
  55.                 header("Location:index.php?c=roles&a=index");
  56.             }                          
  57.         }
  58.     }
  59.     private function checkDates(){
  60.         if(empty($_POST['txtnom'])){
  61.             Session::set("msg","Ingrese los datos obligatorios (*) para continuar.");
  62.             return false;
  63.         }
  64.         else{
  65.             return true;
  66.         }
  67.     }
  68.     private function checkUser(){
  69.         if(Session::get("log_in")!= null and Session::get("log_in")->getRol()->getNombre() == "ADMIN"){
  70.             return true;
  71.         }
  72.         else {
  73.             Session::set("msg","Debe ser administrador para acceder.");
  74.             $this->redirect(array('Main','index.php'));
  75.         }
  76.     }
  77. }
  #15 (permalink)  
Antiguo 11/01/2016, 20:51
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Evitar eliminar registros con php

Pero cuando quiero hacer parecido con Modelo me da este error:

Fatal error: Call to a member function getId() on a non-object in /var/www/html/amnesia_1/Model/ModeloModel.php on line 57

No me toma la marca que le paso por parámetro, te paso el código, puede que sea una tontería y no me doy cuenta:

Modelo.php

Código PHP:
Ver original
  1. <?php
  2. namespace Clases;
  3. use \Model\ModeloModel;
  4. class Modelo {
  5.     private $id;
  6.     private $nombre;
  7.     private $marca;
  8.     private $modelo;
  9.     function getId() {
  10.         return $this->id;
  11.     }
  12.     function getNombre() {
  13.         return $this->nombre;
  14.     }
  15.     function getMarca() {
  16.         return $this->marca;
  17.     }
  18.     function setId($id) {
  19.         $this->id = $id;
  20.     }
  21.     function setNombre($nombre) {
  22.         $this->nombre = strtoupper($nombre);
  23.     }
  24.     function setMarca($marca) {
  25.         $this->marca = $marca;
  26.     }
  27.     function __construct() {
  28.         $args = func_get_args();
  29.         $nargs = func_num_args();
  30.         switch($nargs){
  31.             case 1:
  32.                 self::__construct0();
  33.                 break;
  34.             case 2:
  35.                 self::__construct1($args[0], $args[1],$args[2]);
  36.                 break;
  37.         }
  38.     }
  39.     function __construct0() { }
  40.     function __construct1($xid, $xnombre, $xmarca) {
  41.         $this->id = $xid;
  42.         $this->nombre = strtoupper($xnombre);
  43.         $this->marca = $xmarca;
  44.     }
  45.     public function equals(Modelo $obj){
  46.         return $this->nombre == $obj->nombre;                
  47.     }
  48.     public function save(){
  49.         $this->modelo = new ModeloModel();
  50.         return ($this->id == 0) ? $this->modelo->guardame($this) : $this->modelo->modificame($this);
  51.     }
  52.     public function del(){
  53.         $this->modelo = new ModeloModel();
  54.         return $this->modelo->eliminame($this);
  55.     }
  56.     public function obtenerXBus($criterio){
  57.         $this->modelo = new ModeloModel();
  58.         return $this->modelo->buscador($criterio);
  59.     }
  60.     public function obtenerXMarcas($criterio){
  61.         $this->modelo = new ModeloModel();
  62.         return $this->modelo->obtenerXDataList($criterio);
  63.     }
  64.     public function obtenerPorId($id){
  65.         $this->modelo = new ModeloModel();
  66.         return $this->modelo->obtenerPorId($id);
  67.     }
  68. }

ModelosController.php

Código PHP:
Ver original
  1. <?php
  2. namespace Controller;
  3. use \App\Controller;
  4. use \App\Session;
  5. use \Clases\Marca;
  6. use \Clases\Modelo;
  7. class ModelosController extends Controller
  8. {
  9.     function __construct() {
  10.         parent::__construct();
  11.     }
  12.     public function index(){
  13.         if($this->checkUser()){
  14.             Session::set('mar', '');
  15.             Session::set('p', isset($_GET['p']) ? $_GET['p'] : 1);
  16.             Session::set('b',(isset($_POST['txtbuscador'])) ? $_POST['txtbuscador'] : Session::get('b'));
  17.             $modelos =(Session::get('b')!="") ? $this->getPaginator()->paginar((new Modelo)->obtenerXBus(Session::get('b')), Session::get('p')) : array();
  18.             $this->redirect(array("index.php"),array(
  19.                 "modelos" => $modelos,
  20.                 "paginador" => $this->getPaginator()->getPages()
  21.             ));        
  22.         }
  23.     }
  24.     public function add(){
  25.         if($this->checkUser()){
  26.             Session::set('mar', isset($_POST['txtmar']) ? $_POST['txtmar'] : Session::get('mar'));
  27.             $marcas = (Session::get('mar')!="") ? (new Modelo)->obtenerXMarcas(Session::get('mar')) : array();
  28.             if (isset($_POST['btnaceptar'])) {
  29.                 if($this->checkDates()) {
  30.                     $marca = (new Marca())->obtenerPorId($_POST['txtmar']);
  31.                     $modelo = new Modelo(0,$_POST['txtnom'] , $marca);
  32.                     $id = $modelo->save();
  33.                     Session::set("msg",(isset($id)) ? "Modelo Creado" : Session::get('msg'));
  34.                     header("Location:index.php?c=modelos&a=index");
  35.                     exit();
  36.                 }
  37.             }
  38.             $this->redirect(array('add.php'),array(
  39.                 'marcas' => $marcas
  40.             ));
  41.         }
  42.     }
  43.     public function edit(){
  44.         if($this->checkUser()){          
  45.             Session::set("id",$_GET['p']);
  46.             Session::set('mar', isset($_POST['txtmar']) ? $_POST['txtmar'] : Session::get('mar'));
  47.             $marcas = (Session::get('mar')!="") ? (new Modelo)->obtenerXMarcas(Session::get('mar')) : array();
  48.             if (Session::get('id')!=null && isset($_POST['btnaceptar'])){                                        
  49.                 if($this->checkDates()) {
  50.                     $marca = (new Marca())->obtenerPorId($_POST['txtmar']);
  51.                     $modelo = new Modelo($_POST['hid'],$_POST['txtnom'] , $marca);
  52.                     $id = $modelo->save();
  53.                     Session::set("msg",(isset($id)) ? "Modelo Editado" : Session::get('msg'));
  54.                     header("Location:index.php?c=modelos&a=index");
  55.                     exit();
  56.                 }
  57.             }
  58.             $this->redirect(array('edit.php'),array(
  59.                 "modelo" => (new Modelo)->obtenerPorId(Session::get('id')),
  60.                 'marcas' => $marcas
  61.             ));
  62.         }
  63.     }
  64.     public function delete(){
  65.         if($this->checkUser()){
  66.             if (isset($_GET['p'])){
  67.                 $modelo= (new Modelo)->obtenerPorId($_GET['p']);
  68.                 $id = $modelo->del();
  69.                 Session::set("msg", (isset($id)) ? "Modelo Borrado" : "No se pudo borrar el modelo");
  70.                 header("Location:index.php?c=modelos&a=index");
  71.             }                          
  72.         }
  73.     }
  74.     private function checkDates(){
  75.         if(empty($_POST['txtnom']) || empty($_POST['txtmar'])){
  76.             Session::set("msg","Ingrese los datos obligatorios (*) para continuar.");
  77.             return false;
  78.         }
  79.         else {
  80.             return true;
  81.         }
  82.     }
  83.     private function checkUser(){
  84.         if(Session::get("log_in")!= null and Session::get("log_in")->getRol()->getNombre() == "ADMIN"){
  85.             return true;
  86.         }
  87.         else {
  88.             Session::set("msg","Debe ser administrador para acceder.");
  89.             $this->redirect(array('Main','index.php'));
  90.         }
  91.     }
  92. }

Pareciera que el problema esta en el constructor de Modelo.php pero no sé x_atrix

Espero respuestas y saludos
  #16 (permalink)  
Antiguo 12/01/2016, 06:14
 
Fecha de Ingreso: enero-2016
Mensajes: 71
Antigüedad: 8 años, 3 meses
Puntos: 14
Respuesta: Evitar eliminar registros con php

Hola,

El error que te da es bastante claro ... estas llamando al metodo getId() en una variable que no es un objeto ...
Ejemplo:
Código PHP:
$object 'hola';
$object->getId(); // Esto falla con el error que indicas ... 
No hagas esto: self::metodoEstatico(). Self se utiliza para llamar a metodo estaticos y siempre se refiere a la clase donde estas. No es tu caso.
Código PHP:
    function __construct() {
        
$args func_get_args();
        
$nargs func_num_args();
        switch(
$nargs){ 
            case 
1:
                
self::__construct0();
                break;
            case 
2:
                
self::__construct1($args[0], $args[1]);
                break;
        }
    }
    function 
__construct0() { }
    function 
__construct1($xid$xnombre) {
        
$this->id $xid;
        
$this->nombre strtoupper($xnombre);
    } 
Definicion basica de una funcion o un metodo:
Código PHP:
function hazAlgo($parametro ''){
    
// Código para hacer algo ... 

Ahora, la funcion de arriba la puedes llamar asi:
Código PHP:
hazAlgo(); // Funciona sin problemas 
O asi:
Código PHP:
hazAlgo('Un parametro'); // Tambien funciona 
Aplicandolo a un constructor tuyo este concepto de parametros con valores por defecto quedaria asi:
Código PHP:
    function __construct($xid 0$xnombre null$xmarca null) {
        
$this->id $xid;
        
$this->nombre strtoupper($xnombre);
        
$this->marca $xmarca;
    } 
  #17 (permalink)  
Antiguo 12/01/2016, 20:23
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Evitar eliminar registros con php

Hola x_atrix, hice lo que me dijiste y funcionó a la perfección, te pongo el repositorio de github:

https://github.com/detectivejd/amnesia_php_mvc

Por otro lado, me quedé curioso porque para que la clase se pueda persistir a si mismo tenía que instanciarla según su modelo correspondiente y no me dejaba instanciarla en el constructor:

Código PHP:
Ver original
  1. <?php
  2. namespace Clases;
  3. use \App\IPersiste;
  4. use \Model\RolModel;
  5. class Rol implements IPersiste
  6. {
  7.     private $id;
  8.     private $nombre;
  9.     private $modelo;
  10.     function getId() {
  11.         return $this->id;
  12.     }
  13.     function getNombre() {
  14.         return $this->nombre;
  15.     }    
  16.     function setNombre($nombre) {
  17.         $this->nombre = strtoupper($nombre);
  18.     }
  19.     function __construct($xid = 0, $xnombre = null) {
  20.         $this->id = $xid;
  21.         $this->nombre = strtoupper($xnombre);
  22.     }
  23.     public function equals(Rol $obj) {
  24.         return $this->nombre == $obj->nombre;                
  25.     }
  26.     public function save(){
  27.         $this->modelo = new RolModel();
  28.         return ($this->id == 0) ? $this->modelo->create($this) : $this->modelo->update($this);
  29.     }
  30.     public function del(){
  31.         $this->modelo = new RolModel();
  32.         return $this->modelo->delete($this);
  33.     }
  34.     public function find($criterio = null){
  35.         $this->modelo = new RolModel();
  36.         return $this->modelo->find();
  37.     }
  38.     public function findById($id){
  39.         $this->modelo = new RolModel();
  40.         return $this->modelo->findById($id);
  41.     }
  42. }

Lo otro que no pude hacer bien es que al chequear la fecha de vencimiento del pago no me hace bien la condición, es decir muestra el mensaje con y sin cumplir la condición, en el repositorio esta en:

Clases/Compra.php ->función checkFecVenc()
Clases/Pago.php
Controller/PagosController.php -> función index()

Porque lo demás ante bien de bien, gracias a tu ayuda.

Espero tus respuestas y saludos
  #18 (permalink)  
Antiguo 13/01/2016, 05:55
 
Fecha de Ingreso: enero-2016
Mensajes: 71
Antigüedad: 8 años, 3 meses
Puntos: 14
Respuesta: Evitar eliminar registros con php

Hola,
var_dump aqui:
Código PHP:
<?php
namespace Controller
;
use 
AppController;
use 
AppSession;
use 
ClasesCompra;
use 
ClasesPago;
class 
PagosController extends Controller
{
    function 
__construct() {
        
parent::__construct();
    }
    public function 
index(){
        if(
$this->checkUser()){
            
Session::set("id",$_GET['p']);
            
$com = (new Compra())->obtenerPorId(Session::get('id'));

var_dump($com);

            
Session::set('pg', isset($_GET['pg']) ? $_GET['pg'] : 1);
            if(
$com->getCuotas() == $com->obtenerNroPago() -1){
                
Session::set("msg","Deuda Saldada...");
            }
            else if(
$com->checkFecVenc() == true){ 
                
Session::set("msg","Pago atrasado...");            
            }           
            
$this->redirect(array('index.php'),array(
                
'pagos' => $this->getPaginator()->paginar($com->getPagos()),
                
"paginador" => $this->getPaginator()->getPages()
            ));
        }
    }
Para ver que valores tienes y en que formato.
  #19 (permalink)  
Antiguo 14/01/2016, 18:43
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Evitar eliminar registros con php

Hola x_atrix con respecto al verificar la fecha de vencimiento en los pagos, la cambié por sql:

CompraModel.php

Código PHP:
Ver original
  1. public function checkFecVenc($compra){
  2.         $consulta = $this->getBD()->prepare("SELECT pagFecVenc as vence from pagos where comId = ? order by pagId desc limit 0,1");
  3.         $consulta->execute(array($compra->getId()));
  4.         return date("Y/m/d") > $consulta->fetch(PDO::FETCH_ASSOC)['vence'];
  5.     }

Compra.php

Código PHP:
Ver original
  1. public function checkFecVenc(){  
  2.         $this->modelo = new CompraModel();
  3.         return $this->modelo->checkFecVenc($this);
  4.     }

PagosController.php

Código PHP:
Ver original
  1. public function index(){
  2.         if($this->checkUser()){
  3.             Session::set("id",$_GET['p']);
  4.             $com = (new Compra())->findById(Session::get('id'));
  5.             Session::set('pg', isset($_GET['pg']) ? $_GET['pg'] : 1);
  6.             if($com->getCuotas() == $com->obtenerNroPago() -1){
  7.                 Session::set("msg","Deuda Saldada...");
  8.             }
  9.             else if($com->checkFecVenc()){
  10.                 Session::set("msg","Pago atrasado...");            
  11.             }          
  12.             $this->redirect(array('index.php'),array(
  13.                 'pagos' => $this->getPaginator()->paginar($com->getPagos()),
  14.                 "paginador" => $this->getPaginator()->getPages()
  15.             ));
  16.         }
  17.     }

Pero el mensaje de Pago atrasado me sigue dando al cumplir o no la condición... ¿porque será?

Espero respuestas y saludos.

Última edición por detective_jd; 15/01/2016 a las 19:28
  #20 (permalink)  
Antiguo 15/01/2016, 19:39
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: Evitar eliminar registros con php

Hola x_atrix, te cuento que solucioné el problema: lo único que tenía hacer era esto

CompraModel.php

Código PHP:
Ver original
  1. public function checkFecVenc($compra){
  2.         $consulta = $this->getBD()->prepare("SELECT pagFecVenc as vence from pagos where comId = ? order by pagId desc limit 0,1");
  3.         $consulta->execute([$compra->getId()]);
  4.         return count($this->findPagosByCompra($compra))>0 and date("Y-m-d") > $consulta->fetch(PDO::FETCH_ASSOC)['vence'];
  5.     }

Cambiar el formato del date xq sino no me hacia la comparación....

Gracias x_atrix

Etiquetas: mysql, registros, sql, tabla, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:25.