Actualizar multiples registros php mysql mvc..

DEMOSTRACIÓN

DESCARGA

Saludos amigos esta vez les traigo una forma de actualizar multiples registros php mysql .
Simularemos publicaciones a las cuales les vamos a actualizar las categorias mediante un checkbox
para eso vamos a tomar en cuenta que vamos a utilizarlo como array , utilizando las categorias almacenadas en una tabla,
Utilizaremos una estructura MVC controlando las vistas desde el index.php, Voy a publicar solo lo necesario en este post, ya que
este sistema es muy extenso y no alcanzaría a explicar a detalle todo, pero esto está bien documentado para que no pierdan e hilo, empecemos.

archivos a utlizar:

index.php
class.php
config.php
controller/index.php
controller/singlepost.php
controller/404.php /no necesario/
model/bec.php
model/categorias.php
model/conexion.php
model/entidad.php
model/post.php
view/index.php
view/singlepost.php
tabla.sql

Utilizaremos como estilos a nuestro querido Bootstrap puedes descargalo
desde su página web. Aprenda cómo Utilizar Hosted CDN de jQuery y
haga lo mismo con bootstrap si no desea descargarlo.

la estructura debe estar organizado de la siguiente manera para su correcto funcionamiento.

index.php

será el encargado de mostrar el frontend , además que cargará archivos externos a ser utilizados en el sitio

  //ext file
  $ext = substr(strrchr(__FILE__, '.'), 1);

  /** Define ROOT_PATH para directorio app */
  if ( ! defined( 'ROOT_PATH' ) ) {
    define( 'ROOT_PATH', dirname(__FILE__) . '/' );
  }

  //requerimos la configuracion del host
  require ( ROOT_PATH . 'config.php' );

  //Autoload clases [cargamos los modelos]
  spl_autoload_register(function($NombreClase){
    require ( ROOT_PATH . 'model/' . $NombreClase . '.php' );
  });

  //requerimos classes
  require ( ROOT_PATH . 'class.php' );


  //iniciamos vistas del frontend
  if(isset($_GET['view'])) {
     if(file_exists( ROOT_PATH . 'controller/' . strtolower($_GET['view']) .'.'. $ext )) {
       //sicargamos un controlador y existe lo mostramos
       include( ROOT_PATH . 'controller/' . strtolower($_GET['view']) .'.'. $ext );
     } else {
       //si no existe mostramos una pagina de error
       include( ROOT_PATH.'controller/404.php');
     }
   } else {
     //mostramos el index por defecto
     include( ROOT_PATH.'controller/index.php');
   }
   //end front

class.php

es el encargado de instanciar y crear los objetos de los modelos, para luego ser usados en el sitio.
Adicionalmente e creado 3 funciones para realizar ciertas operaciones:
nombre_categoria : obtiene el nombre de una categoria dado un numero entero.
get_date_time : obtiene la fecha del post y tiene 2 formas de mostrar la fecha
limpiar : limpia las variables a ser usadas en los modelos
En los archivos de descarga los podrán verificar.

  //Creamos objetos y los instaciamos
  $categorias = new categorias();
  $post       = new post();
  $db         = new conexion();

config.php

Se encargará de mantener los datos de configuración del host dentro de constantes.

  /** El nombre de tu base de datos */
  define( 'DB_NAME', 'database' );

  /** Tu nombre de usuario de MySQL */
  define( 'DB_USER', 'root' );

  /** Tu contraseña de MySQL */
  define( 'DB_PASS', '' );

  /** Host de MySQL (es muy probable que no necesites cambiarlo) */
  define( 'DB_HOST', 'localhost' );

controller/index.php

Se encargará de mostrar las vistas, por el momento solo eso, ya que aquí podríamos montar todo un espectaculo
pero este pequeño demo no necesita de tanto .

  $publicaciones = $post->GetAllPost();
  require('view/index.php');

controller/singlepost.php

Se encargará de crear una condición y verificar si se envía por post o no en el controller

  //si se utiliza el metodo post activamos el modelo
if($_SERVER['REQUEST_METHOD'] == 'POST'){
  $post->UpdateCategoryPost();
}else{
  //caso contrario mostramos la pagina sin enviar datos
  //utilizamos los metodos de los modelos
  $publicaciones = $post->GetSinglePost();
  foreach($publicaciones as $singlepost){
    //exploramos las categorias del post para luego usarlas como array y verificar si existen en el post
    $checkboxvalue = explode(",", $singlepost->categorias);
    require('view/singlepost.php');
  }
}

model/categorias

Tiene la funcion de verificar las categorias y mostrarlas cuando las necesitemos.

  public function AllCategory($sql) {
    $query = ("SELECT * FROM $this->table $sql ;");
    $Data = $this->run_sql($query);
    return $Data;
  }

model/conexion

Su nombre mismo lo indica creamos una conexion a la base de datos asegurese de configurar config.php
Con los datos de su host. esta conexion la extendemos MYSQLI.

  private $host = DB_HOST;
  private $user = DB_USER;
  private $pass = DB_PASS;
  private $dbname = DB_NAME;
  private $setcharset = 'utf8mb4';

  public function __construct() {
    parent::__construct($this->host, $this->user, $this->pass, $this->dbname);
    $this->connect_errno ? die('
    <div class="container">
      <div class="py-5 text-center">
       <h2>UPPPPSSS... Algo ocurrió con la conexión a la Base de datos asegurate que los datos son los correctos.</h2>
      </div>
    </div>
    ') : null;
    $this->set_charset($this->setcharset);
  }

model/entidad

Se encargará de crear 2 funciones a ser utilizada en el sitio

  /*db_connect function la utilizamos como funcion en los modelos para recorrer datos*/
  public function db_connect(){
      return $this->db;
  }

  //Contar filas de cualquier tabla
  public function CountRows($row){
    $query = $this->db_connect()->query("SELECT $row FROM $this->table ;");
    $row_post = $query->num_rows;
    return $row_post;
  }

model/post.php

Se encargará de utilizar unas funciones para:
GetAllPost() : Ver todas las pubilicaciones
GetSinglePost(): muestra solo 1 publicación
UpdateCategoryPost() : metodo para actualizar la base de datos

  public function GetAllPost() {
    $query = ("SELECT * FROM $this->table ;");
    $Data = $this->run_sql($query);
    return $Data;
  }
  public function GetSinglePost() {
    $query = ("SELECT * FROM $this->table WHERE id = $this->idpost LIMIT 1 ;");
    $Data = $this->run_sql($query);
    return $Data;
  }
  public function UpdateCategoryPost(){
    $this->Error('?view=singlepost&idpost='.$this->idpost.'&error=',true);
    $this->db_connect()->query("UPDATE $this->table SET
     fecha = '$this->fecha_actu',
     categorias = '$this->categorias'
     WHERE id = '$this->idpost' LIMIT 1;");
     header('location: ?view=singlepost&idpost='.$this->idpost.'&success=true');
  }

view/index.php

Se mostrará el frontend de la pagina principal.

//verificamos las publicaciones dentro de la base de datos
if($publicaciones != false){
  //creamos un foreach para utilizar los post
 foreach($publicaciones as $allpost){
   //dividimos el string despues de cada coma
   $cat = explode(",", $allpost->categorias);
   //verificamos las categorias del post con el string dividido
   if(in_array("$categorias->id",$cat)){
     //con la funcion nombre categoria mostrará el nombre de la categoria reemplazando el id de los post
     echo '<span class="badge badge-'.$color.' badge-pill">'.nombre_categoria($categorias->id).'</span> ';
   }
  }
   }else{
     //caso contrario mostramos un mensaje que no hay publicaciones
    echo '<li class="list-group-item d-flex justify-content-between lh-condensed">
      <div>no hay publicaciones</div>
    </li>';
   }

view/singlepost.php

Aquí mostrará la pubicación y sus categorias lista para ser actualizada..

  //con un foreach extraemos todas las categorias de la base de datos
  foreach($AllCategory as $categorias){
    /*verificamos las categorias
    si existen y creamos una condición
    checked para mostrar clicado las categorias
     pertenecientes a cada publicacion*/
    if(in_array("$categorias->id",$checkboxvalue)){
      $Checked = "checked='checked'";
    }else{
      $Checked = NULL;
    }
    /*mostarmos las categorias y mediante un formulario y un boton
    enviamos los datos por post del controller al modelo*/
  <div class="custom-control custom-checkbox">
   <input type="checkbox" class="custom-control-input" id="<?php echo $categorias->id; ?>" name="cat[]" <?php echo $Checked; ?> value="<?php echo $categorias->id; ?>" >
   <label class="custom-control-label" for="<?php echo $categorias->id; ?>"><?php echo $categorias->nombre; ?></label>
  </div>
  }

tabla.sql

Estas son las tablas a ser usadas para esta demostracióna

//las tablas se encuentran de esta manera para esta demostración
CREATE TABLE `multiple_categorias` (
  `id` int(11) NOT NULL,
  `nombre` varchar(100) COLLATE utf8mb4_spanish2_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish2_ci;

INSERT INTO `multiple_categorias` (`id`, `nombre`) VALUES
(1, 'bootstrap'),
(2, 'css'),
(3, 'design web'),
(4, 'php'),
(5, 'mysql'),
(6, 'mdl'),
(7, 'tutoriales'),
(8, 'css3'),
(9, 'mdl lite'),
(10, 'vainilla js'),
(11, 'sin categoria');

CREATE TABLE `multiple_post` (
  `id` int(11) NOT NULL,
  `titulo` varchar(100) COLLATE utf8mb4_spanish2_ci NOT NULL,
  `descripcion` text COLLATE utf8mb4_spanish2_ci NOT NULL,
  `categorias` text COLLATE utf8mb4_spanish2_ci NOT NULL,
  `fecha` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish2_ci;

INSERT INTO `multiple_post` (`id`, `titulo`, `descripcion`, `categorias`, `fecha`) VALUES
(1, 'Cómo crear una web desde cero sin previo conocimiento..', 'Aprenderemos a crear una web desde cero sin previo conocimiento , con html y css empezaremos a crear maquetación y saldrás todo un experto.', '4,8,11', '2019-08-06 00:00:00'),
(2, 'Material design web qué es y para que sirve..?', 'Material Design Lite le permite agregar una apariencia de Material Design a sus sitios web. No se basa en ningún marco de JavaScript y tiene como objetivo optimizar el uso en dispositivos cruzados, degradarse con gracia en los navegadores más antiguos y ofrecer una experiencia accesible de inmediato. ', '2,4,8,9', '2019-08-06 17:22:56'),
(3, 'Phpmailer qué es y como funciona .? Aquí te enseñamos..!', 'Muchos desarrolladores de PHP utilizan el correo electrónico en su código. La única función PHP que admite esto es la mail()función. Sin embargo, no proporciona ninguna asistencia para hacer uso de funciones populares como correos electrónicos y archivos adjuntos basados ​​en HTML.', '4,8,9', '2019-08-06 17:21:18'),
(4, 'Bloguero-ec creando animaciones SVG..', 'Aprenderemos a crear animaciones SVG , creando marcos animados para mejor experiencia web se requiere....', '1,8', '2019-08-06 17:21:39'),
(5, 'Manejo de sesiones con php mysqli.', 'Aquí encontrarás a crear manejos de sesiones para web con php mysql basado en arquitectura MVC. empecemos ....', '2,9,10', '2019-08-06 17:08:52');

Espero esta demostración de cómo actualizar multiples registros php mysql dentro de una tabla y leerlos en una web les sirva para futuros proyectos.

Talvez les pueda interesar seleccionar multiples registros con jQuery bootstrap


Relacionado