Herramientas Informaticas

Etiqueta: PHP8 Página 8 de 9

Comprimir y generar Respaldo en Windows automáticamente a una hora determinada

Para respaldar información importante como base de datos, documentos ETC, en muchos lugares se opta por las nubes como Google Drive, Dropbox ETC

Pero en ocasiones simplemente se opta por comprimir y pasarlo a otro equipo de computo

Para ello normalmente se usa cobian pero en una ocasión en nuestro caso falló y no alcanzaba a copiarse el archivo completo

Así que mostraremos como hacer el comando para que comprima y copie el archivo aunque exista problemas de intermitencia en la red

Para comprimir es necesario tener instalado winRar, ya instalado para comprimir usamos el siguiente comando, en este caso copiamos el respaldo de la base de datos de SQL Server

"C:\Program Files"\WinRAR\rar a -r -rr -v4700M "C:\respaldoDB\Respaldo%date:~-4,4%-%date:~-7,2%-%date:~-10,2%.rar" "C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\"

Una vez comprimido se procede a realizar la copia en el otro equipo para ello usamos el siguiente comando, con robocopy en caso de que se caiga la red vuelve a intentar a copiarlo hasta que lo copia bien y completamente

robocopy "C:\respaldoDB" "\\IPDELOTROEQUIPO\Respaldo de prueba\carpetadestino"

Y procedemos a borrar el archivo creado en el equipo local

DEL /F /A C:\respaldoDB\Respaldo_%date:~-4,4%-%date:~-7,2%-%date:~-10,2%.rar

  

al final el archivo bat quedaría de la siguiente forma

"C:\Program Files"\WinRAR\rar a -r -rr -v4700M "C:\respaldoDB\Respaldo%date:~-4,4%-%date:~-7,2%-%date:~-10,2%.rar" "C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\"

  

robocopy "C:\respaldoDB" "\\IPDELOTROEQUIPO\Respaldo de prueba\carpetadestino"

  

DEL /F /A C:\respaldoDB\Respaldo_%date:~-4,4%-%date:~-7,2%-%date:~-10,2%.rar

  

Ya listo para ejecutarlo a la hora que sea automáticamente con el programador de tareas de windows

Crear un Conversor de Facturas XML Mexicanas a PDF en CodeIgniter4

En este pequeño tutorial vamos a mostrar como crear rápidamente un conversor XML a PDF de las facturas electrónicas Mexicanas
Requisitos

  1. Tener instalado la versión mas reciente de Composer
  2. Conocimiento básico de PHP y Programación
  3. Ganas de aprender

Paso uno creamos el proyecto en CodeIgniter 4

composer create-project codeigniter4/appstarter convertidorXMLPDF

Actualizamos

composer update

Instalamos de composer el paquete que convierte el xml PDF

composer require phpcfdi/cfditopdf

creamos el archivo FileUpload.php en controladores

<?php 
namespace App\Controllers;
// use App\Models\FormModel;
use CodeIgniter\Controller;
class FileUpload extends Controller
{
    public function index() 
    {
        return view('home');
    }
    function upload() { 
        helper(['form', 'url','filesystem']);



 
            $xml = $this->request->getFile('file');
           /* $img->move(WRITEPATH . 'uploads');
    
            $data = [
               'name' =>  $img->getName(),
               'type'  => $img->getClientMimeType()
            ];
    
            $save = $db->insert($data);
            print_r('File has successfully uploaded');     */


         //  echo $_FILES['file']['tmp_name'];
            $string = file_get_contents($_FILES['file']['tmp_name']);

         
            // clean cfdi
            $xml = \PhpCfdi\CfdiCleaner\Cleaner::staticClean($string);

            
         
            // create the main node structure
            $comprobante = \CfdiUtils\Nodes\XmlNodeUtils::nodeFromXmlString($xml);

            // create the CfdiData object, it contains all the required information
            $cfdiData = (new \PhpCfdi\CfdiToPdf\CfdiDataBuilder())
                ->build($comprobante);

            // create the converter
            $converter = new \PhpCfdi\CfdiToPdf\Converter(
                new \PhpCfdi\CfdiToPdf\Builders\Html2PdfBuilder()
            );

            // create the invoice as output.pdf
            $converter->createPdfAs($cfdiData,  'output.pdf');
            
                $filename = WRITEPATH . 'uploads\output.pdf';
                
                echo '
                <script type="text/javascript">
                    window.open("/output.pdf" , "_blank");
                  </script>';
                
             
               return view('welcome_message');
                  
                
        }
     
    
}

*Agregamos el formulario en las vistas en este caso al archivo welcome_message.php

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Conversor CFDI!</title>
        <meta name="description" content="Pequeño y poderoso conversor de CFDI XML a PDF hecho en CodeIgnter">
        <meta name="keywords" content="CFDI, CFDI 4.0, CFDI 3.3, Representación Impresa, CodeIgniter, Factura Electrónica"/>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="shortcut icon" type="image/png" href="/favicon.ico"/>

        <!-- STYLES -->

        <style {csp-style-nonce}>
            * {
                transition: background-color 300ms ease, color 300ms ease;
            }
            *:focus {
                background-color: rgba(221, 72, 20, .2);
                outline: none;
            }
            html, body {
                color: rgba(33, 37, 41, 1);
                font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
                font-size: 16px;
                margin: 0;
                padding: 0;
                -webkit-font-smoothing: antialiased;
                -moz-osx-font-smoothing: grayscale;
                text-rendering: optimizeLegibility;
            }
            header {
                background-color: rgba(247, 248, 249, 1);
                padding: .4rem 0 0;
            }
            .menu {
                padding: .4rem 2rem;
            }
            header ul {
                border-bottom: 1px solid rgba(242, 242, 242, 1);
                list-style-type: none;
                margin: 0;
                overflow: hidden;
                padding: 0;
                text-align: right;
            }
            header li {
                display: inline-block;
            }
            header li a {
                border-radius: 5px;
                color: rgba(0, 0, 0, .5);
                display: block;
                height: 44px;
                text-decoration: none;
            }
            header li.menu-item a {
                border-radius: 5px;
                margin: 5px 0;
                height: 38px;
                line-height: 36px;
                padding: .4rem .65rem;
                text-align: center;
            }
            header li.menu-item a:hover,
            header li.menu-item a:focus {
                background-color: rgba(221, 72, 20, .2);
                color: rgba(221, 72, 20, 1);
            }
            header .logo {
                float: left;
                height: 44px;
                padding: .4rem .5rem;
            }
            header .menu-toggle {
                display: none;
                float: right;
                font-size: 2rem;
                font-weight: bold;
            }
            header .menu-toggle button {
                background-color: rgba(221, 72, 20, .6);
                border: none;
                border-radius: 3px;
                color: rgba(255, 255, 255, 1);
                cursor: pointer;
                font: inherit;
                font-size: 1.3rem;
                height: 36px;
                padding: 0;
                margin: 11px 0;
                overflow: visible;
                width: 40px;
            }
            header .menu-toggle button:hover,
            header .menu-toggle button:focus {
                background-color: rgba(221, 72, 20, .8);
                color: rgba(255, 255, 255, .8);
            }
            header .heroe {
                margin: 0 auto;
                max-width: 1100px;
                padding: 1rem 1.75rem 1.75rem 1.75rem;
            }
            header .heroe h1 {
                font-size: 2.5rem;
                font-weight: 500;
            }
            header .heroe h2 {
                font-size: 1.5rem;
                font-weight: 300;
            }
            section {
                margin: 0 auto;
                max-width: 1100px;
                padding: 2.5rem 1.75rem 3.5rem 1.75rem;
            }
            section h1 {
                margin-bottom: 2.5rem;
            }
            section h2 {
                font-size: 120%;
                line-height: 2.5rem;
                padding-top: 1.5rem;
            }
            section pre {
                background-color: rgba(247, 248, 249, 1);
                border: 1px solid rgba(242, 242, 242, 1);
                display: block;
                font-size: .9rem;
                margin: 2rem 0;
                padding: 1rem 1.5rem;
                white-space: pre-wrap;
                word-break: break-all;
            }
            section code {
                display: block;
            }
            section a {
                color: rgba(221, 72, 20, 1);
            }
            section svg {
                margin-bottom: -5px;
                margin-right: 5px;
                width: 25px;
            }
            .further {
                background-color: rgba(247, 248, 249, 1);
                border-bottom: 1px solid rgba(242, 242, 242, 1);
                border-top: 1px solid rgba(242, 242, 242, 1);
            }
            .further h2:first-of-type {
                padding-top: 0;
            }
            footer {
                background-color: rgba(221, 72, 20, .8);
                text-align: center;
            }
            footer .environment {
                color: rgba(255, 255, 255, 1);
                padding: 2rem 1.75rem;
            }
            footer .copyrights {
                background-color: rgba(62, 62, 62, 1);
                color: rgba(200, 200, 200, 1);
                padding: .25rem 1.75rem;
            }
            @media (max-width: 629px) {
                header ul {
                    padding: 0;
                }
                header .menu-toggle {
                    padding: 0 1rem;
                }
                header .menu-item {
                    background-color: rgba(244, 245, 246, 1);
                    border-top: 1px solid rgba(242, 242, 242, 1);
                    margin: 0 15px;
                    width: calc(100% - 30px);
                }
                header .menu-toggle {
                    display: block;
                }
                header .hidden {
                    display: none;
                }
                header li.menu-item a {
                    background-color: rgba(221, 72, 20, .1);
                }
                header li.menu-item a:hover,
                header li.menu-item a:focus {
                    background-color: rgba(221, 72, 20, .7);
                    color: rgba(255, 255, 255, .8);
                }
            }
        </style>
    </head>
    <body>

        <!-- HEADER: MENU + HEROE SECTION -->
        <header>

            <div class="menu">
                <ul>
                    <li class="logo">
                        <a href="https://cesarsystems.com.mx/" target="_blank">
                            <img src="<?php echo base_url();?>/logo.png"
                                 aria-label="Visita mi pagina oficial para mas programas y utilidades!"/></img>
                        </a>
                    </li>
                    <li class="menu-toggle">
                        <button onclick="toggleMenu();">&#9776;</button>
                    </li>
                    <li class="menu-item hidden"><a href="#">Inicio</a></li>
                    <li class="menu-item hidden"><a href="https://cesarsystems.com.mx/" target="_blank">Descargas</a>
                    </li>
                    <li class="menu-item hidden"><a href="https://www.youtube.com/c/rasec555" target="_blank">Comunidad</a></li>
                    <li class="menu-item hidden"><a
                            href="https://patreon.com/user?u=74078772&utm_medium=clipboard_copy&utm_source=copyLink&utm_campaign=creatorshare_creator" target="_blank">Patrocinar</a>
                    </li>
                </ul>
            </div>

            <div class="heroe">

                <h1>Bienvenido a Conversor XML A PDF V2</h1>

                <h2>Un simple software para convertir los CFDI XML a PDF</h2>

            </div>

        </header>

        <!-- CONTENT -->

        <section>

            <h1>Acerca de este programa</h1>

            <p>Este programa toma los archivos XML de la factura 3.3 o 4.0 para convertirlos a una representación generica impresa de un Comprobante Fiscal Digital</p>

            <p>Para convertir el XML a PDF puede arrastrar el archivo XML en el Boton llamado "Seleccionar archivo" </p>

            <p>En caso de que no salga el PDF asegurate de no tener bloqueado el popup o desbloquealo para esta pagina ya que el pdf saldra en el popup" </p>



            <form method="post" action="<?php echo base_url('FileUpload/upload'); ?>" enctype="multipart/form-data">
                <div class="form-group">
                    <label>Seleccione el archivo XML </label>
                    <input type="file" name="file" id="file"  accept=".xml" class="form-control">
                </div>
                <div class="form-group">
                    <button type="submit" class="btn btn-danger">Generar PDF</button>
                </div>
            </form>

        </section>

        <div class="further">

            <section>

                <h1>¡Ir por más!</h1>

                <h2>
                    <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'><rect x='32' y='96' width='64' height='368' rx='16' ry='16' style='fill:none;stroke:#000;stroke-linejoin:round;stroke-width:32px'/><line x1='112' y1='224' x2='240' y2='224' style='fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-width:32px'/><line x1='112' y1='400' x2='240' y2='400' style='fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-width:32px'/><rect x='112' y='160' width='128' height='304' rx='16' ry='16' style='fill:none;stroke:#000;stroke-linejoin:round;stroke-width:32px'/><rect x='256' y='48' width='96' height='416' rx='16' ry='16' style='fill:none;stroke:#000;stroke-linejoin:round;stroke-width:32px'/><path d='M422.46,96.11l-40.4,4.25c-11.12,1.17-19.18,11.57-17.93,23.1l34.92,321.59c1.26,11.53,11.37,20,22.49,18.84l40.4-4.25c11.12-1.17,19.18-11.57,17.93-23.1L445,115C443.69,103.42,433.58,94.94,422.46,96.11Z' style='fill:none;stroke:#000;stroke-linejoin:round;stroke-width:32px'/></svg>
                    Descargas y tutoriales
                </h2>

                <p>Puedes encontrar mas aplicativos, manuales y tutoriales en la siguiente pagina <a href="https://cesarsystems.com.mx/"
                                                target="_blank">Pagina Principal</a> !</p>

                <h2>
                    <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'><path d='M431,320.6c-1-3.6,1.2-8.6,3.3-12.2a33.68,33.68,0,0,1,2.1-3.1A162,162,0,0,0,464,215c.3-92.2-77.5-167-173.7-167C206.4,48,136.4,105.1,120,180.9a160.7,160.7,0,0,0-3.7,34.2c0,92.3,74.8,169.1,171,169.1,15.3,0,35.9-4.6,47.2-7.7s22.5-7.2,25.4-8.3a26.44,26.44,0,0,1,9.3-1.7,26,26,0,0,1,10.1,2L436,388.6a13.52,13.52,0,0,0,3.9,1,8,8,0,0,0,8-8,12.85,12.85,0,0,0-.5-2.7Z' style='fill:none;stroke:#000;stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><path d='M66.46,232a146.23,146.23,0,0,0,6.39,152.67c2.31,3.49,3.61,6.19,3.21,8s-11.93,61.87-11.93,61.87a8,8,0,0,0,2.71,7.68A8.17,8.17,0,0,0,72,464a7.26,7.26,0,0,0,2.91-.6l56.21-22a15.7,15.7,0,0,1,12,.2c18.94,7.38,39.88,12,60.83,12A159.21,159.21,0,0,0,284,432.11' style='fill:none;stroke:#000;stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/></svg>
                    Grupos
                </h2>

                <p>Puede seguirnos en los siguientes grupos y redes sociales como <a href="https://www.youtube.com/c/rasec555"
                                      target="_blank">Canal de youtube </a>, 
                                      
                                      <a href="https://t.me/CesarSystems"
                                      target="_blank">Canal de Telegram</a> ,
                                      
                                      <a href="https://twitter.com/JulioLeyvaR"
                                      target="_blank">Twitter</a> ,
                                      
                                       <a href="https://odysee.com/@JulioCesarLeyvaRodriguez:9"
                                      target="_blank">Odysee</a> y
                                      
                                      <a href="https://www.facebook.com/rasec555/"
                                      target="_blank">Facebook</a> 
                
                
                </p>

                <h2>
                    <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'><line x1='176' y1='48' x2='336' y2='48' style='fill:none;stroke:#000;stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><line x1='118' y1='304' x2='394' y2='304' style='fill:none;stroke:#000;stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><path d='M208,48v93.48a64.09,64.09,0,0,1-9.88,34.18L73.21,373.49C48.4,412.78,76.63,464,123.08,464H388.92c46.45,0,74.68-51.22,49.87-90.51L313.87,175.66A64.09,64.09,0,0,1,304,141.48V48' style='fill:none;stroke:#000;stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/></svg>
                    Patrocinar
                </h2>

                <p>Puedes apoyar nuestros proyectos en Patreon y obtendras acceso exclusivo a los fuentes mas recientes
                    <a href="https://patreon.com/user?u=74078772&utm_medium=clipboard_copy&utm_source=copyLink&utm_campaign=creatorshare_creator" target="_blank">
                        Unete</a> </p>

            </section>

        </div>

        <!-- FOOTER: DEBUG INFO + COPYRIGHTS -->

        <footer>
            <div class="environment">

                <p>Tiempo de Renderizado {elapsed_time} seconds</p>

            

            </div>

            <div class="copyrights">

                <p>&copy; <?= date('Y') ?> Conversor XML a PDF es un proyecto de código abierto lanzado con la licencia MIT
                    open source licence.</p>

            </div>

        </footer>

        <!-- SCRIPTS -->

        <script>
            function toggleMenu() {
                var menuItems = document.getElementsByClassName('menu-item');
                for (var i = 0; i < menuItems.length; i++) {
                    var menuItem = menuItems[i];
                    menuItem.classList.toggle("hidden");
                }
            }
        </script>

        <!-- -->

    </body>
</html>

Y por último agregamos esto en las rutas

$routes->get('/', 'FileUpload::index');
$routes->match(['get', 'post'], 'FileUpload/upload', 'FileUpload::upload');

y listo pueden ver un ejemplo de como quedo en el siguiente enlace https://xml2pdf.cesarsystems.com.mx/

Guardando configuraciones en Gambas3

Esta utilidad sirve para guardar configuraciones de sistema, configuraciones que solo son por equipo y se quedan guardadas en la maquina y aun si se cierra el programa al volverlo abrir mostrara la información guardada

Para activar esta función nos vamos a propiedades del proyecto seleccionamos componentes y activamos el componente gb.settings

Añadiendo controles al formulario

En el diseño ya tenemos el menú, ahora nos toca insertar los controles que vamos a necesitar.

Se usaran los mas básicos que son el textbox, dir chooser y button

En la esquina inferior derecha están todos los controles clasificados en pestañas, para agregarlo solo seleccionamos y lo arrastramos hacia la ventana, en este caso escogeremos el control dir chooser
Quedaría de esta forma, en el atributo name le ponemos ruta
Ahora arrastramos el control label
Quedaría de esta forma, en el nombre del control le ponemos lblNombreTabla, en text le ponemos Nombre Tabla:
Ahora elegimos el control textbox, lo seleccionamos y lo arrastramos a la ventana
Quedaría de esta forma en el atributo name le ponemos txtTabla y en el atributo public le ponemos true ya que usaremos este control fuera de este archivo en otro modulo
Ahora seleccionamos el control button y lo arrastramos a la ventana
El botón quedaría de la siguiente forma, en el atributo Name le ponemos btnGeneral y en el atributo Text le ponemos Crear Catálogo
Si corremos el programa así se vera
Video demostrativo

En la próxima publicación crearemos la ventana de configuración donde meteremos los parámetros para acceder a la base de datos de MySQL y mostraremos como lanzarlo desde el

Añadiendo menú a la ventana principal del programa

Lo primero que necesita cualquier programa es un menú para tener acceso a las diferentes funciones del sistema.

Para crear los menús y sub menú es muy sencillo

Existes tres formas una es vía teclado con CTRL+E, también existe un botón en la parte de arriba llamado editor de menú y la tercer forma es simplemente dar click derecho en la ventana y dar click en editar menú

MANUAL PARA CREADOR DE CATÁLOGOS PARA EL SISTEMA DE PUNTO DE VENTA JCPOS 2021

Anteriormente para crear un simple catalogo en el sistema de punto de venta hecho en PHP JCPOS2021 tardábamos algo de tiempo ya que teníamos que crear el modelo la vista y el controlador totalmente a mano.

Todo eso quedo atrás ya que hemos creado una herramienta que hará todo ese código en automático, solo necesitamos crear la tabla, siempre tenemos que poner la primer columna con el nombre de “id” que sea primera e autoincrementable.

Ya después de allí creamos las demás columnas como varchar, ya despues si es datatime o otro tipo de dato lo podemos cambiar después.

Este programa fue desarrollado en el lenguaje Gambas3, luego les dejo un tutorial con el fuente de como se hizo, es necesario tener Linux para hacer funcionar este programa y tener instalado Gambas3.

Si ya tienen Linux y el Gambas3 instalado pueden descargar el creador de catálogos.

Ahora el manual de uso, simularemos que crearemos el catalogo de proveedores, entonces lo primero que se tiene que hacer es crear la tabla proveedores, con el primer campo llamado id que debe ser primaria y autoincrementable, les dejo el codigo de ejemplo de como creamos la tabla en phpmyadmin

CREATE TABLE `pos`.`proveedores` ( `id` INT NOT NULL AUTO_INCREMENT ,  `nombre` VARCHAR(256) NULL ,  `apellido` VARCHAR(256) NULL ,  `direccion` VARCHAR(256) NULL ,    PRIMARY KEY  (`id`)) ENGINE = InnoDB;

Ahora ejecutamos el programa, en mi caso no sale el icono pero es problema de mi sistema operativo.

En mi caso no se ve el icono pero no es problema, el programa funciona igual
Al abrirse el programa se mostrara como se muestra en la imagen
Nos vamos al menú Archivo ->Configuración y nos saldrá esta ventana en donde escribimos los datos de conexión a la base de datos
No posicionamos en donde esta el fuente, escribimos el nombre de la tabla en el campo Nombre Tabla: y le damos al botón Generar Catalogo
Vemos como ya se crearon los archivos
Ahora solo agregamos manualmente la ruta de proveedores en el archivo plantilla.php
Ahora agregamos el en menú para poder usarlo
Y listo ya tenemos nuestro catalogo listo para hacerle altas bajas y cambios

GUARDAR IMAGENES EN FILE SYSTEM O EN BASE DE DATOS?

En este vídeo meditaremos cual sera la mejor opción para el punto de venta, si guardar las imagenes en filesystem o en base de datos
FORO
https://foro.cesarsystems.com.mx/

DISCORD
https://discord.gg/7cJSkMxA

FACEBOOK
https://www.facebook.com/rasec555

TWITTER
https://twitter.com/JulioLeyvaR

CHANNEL TELEGRAM
https://telegram.me/CesarSystems

PAGINA WEB
https://cesarsystems.com.mx

TWITCH
https://www.twitch.tv/bardack21

DLIVE
https://dlive.tv/JulitoLeyva

ODYSEE
https://odysee.com/@JulioCesarLeyvaRodriguez:9

MOSTRAR IMAGEN DE PERFIL EN CONFIGURACIONES USANDO PHP MySQL, Base54

Ya quedaron las altas y modificaciones de la imagen en el campo de MySQL, ahora los mostraremos en el menu y en el perfil
FORO
https://foro.cesarsystems.com.mx/

DISCORD
https://discord.gg/7cJSkMxA

FACEBOOK
https://www.facebook.com/rasec555

TWITTER
https://twitter.com/JulioLeyvaR

CHANNEL TELEGRAM
https://telegram.me/CesarSystems

PAGINA WEB
https://cesarsystems.com.mx

TWITCH
https://www.twitch.tv/bardack21

DLIVE
https://dlive.tv/JulitoLeyva

ODYSEE
https://odysee.com/@JulioCesarLeyvaRodriguez:9

ACTUALIZAR IMAGEN EN CAMPO MYSQL

Ya hicimos el insert en la base de datos del archivo de la imagen, tambien la mostramos en las vistas, ahora sigue hacer la modificacion “UPDATE” en la base de datos
FORO

https://foro.cesarsystems.com.mx/
DISCORD

https://discord.gg/7cJSkMxA

FACEBOOK
https://www.facebook.com/rasec555

TWITTER
https://twitter.com/JulioLeyvaR

CHANNEL TELEGRAM
https://telegram.me/CesarSystems

PAGINA WEB
https://cesarsystems.com.mx

TWITCH
https://www.twitch.tv/bardack21

DLIVE
https://dlive.tv/JulitoLeyva

ODYSEE
https://odysee.com/@JulioCesarLeyvaRodriguez:9

Subir imágenes en base de datos con PHP8 y mariaDB

Les dejo un ejemplo básico en donde vemos como meter las imágenes en un campo en la base de datos en lugar de guardarlo en el filesystem.

Saludos espero que les sirva

HTML MODAL


<!--===================================== 
MODAL IMAGENES
 ======================================--> 


<div id="modalImagenesVehiculos" class="modal fade" role="dialog"> 

    <div class="modal-dialog"> 

        <div class="modal-content"> 

            <form role="form" method="post" enctype="multipart/form-data"> 

                <!--===================================== 
                CABEZA DEL MODAL 
                ======================================--> 

                <div class="modal-header" style="background:#3c8dbc; color:white"> 

                    <button type="button" class="close" data-dismiss="modal">&times;</button> 

                    <h4 class="modal-title"> Imagenes </h4> 

                </div> 
                <!--===================================== 
                CUERPO DEL MODAL 
                ======================================--> 

                <div class="modal-body"> 

                    <div class="box-body"> 




                        <!-- EMPEZAMMOS CON LAS PESTAÑAS -->
                        <ul class="nav nav-tabs">

                            <li class="active"><a data-toggle="tab" href="#Subir">Subir Imagenes</a></li>

                            <li><a data-toggle="tab" href="#Imagenes">Imagenes</a></li>


                        </ul>


                        <!-- CONTENIDO DE LAS PESTAÑAS -->
                        <div class="tab-content">

                            <div id="Subir" class="tab-pane fade in active">

                                <h3>Subir Imagen</h3>

                                <p>    
                                    <!-- ENTRADA PARA SUBIR FOTO -->

                                <div class="form-group">



                                    <input type="file" class="nuevaFoto" name="editarFoto" id="editarFoto">

                                    <p class="help-block">Peso máximo de la foto 2MB</p>

                                    <img src="vistas/img/plantilla/imagenesDocumentos.jpeg" class="img-thumbnail previsualizarEditar" width="100px">



                                </div>


                                <!-- ENTRADA PARA LA DESCRIPCION --> 

                                <div class="form-group"> 

                                    <div class="input-group"> 

                                        <span class="input-group-addon">Descripcion: </span>  

                                        <input type="text" class="form-control input-lg" name="descripcionImagen" id="descripcionImagen" placeholder="Ingresar Descripcion" required> 

                                        <input type="hidden" class="form-control input-lg" name="idVehiculo" id="idVehiculo" name="idVehiculo"> 

                                    </div> 

                                </div> 


                            </div> 


                            <div id="Imagenes" class="tab-pane fade">

                                <h3>Imagenes</h3>

                                <p>    

                                    <!--=====================================
                                    CONTROLES
                                    ======================================-->

                                <table class="table table-bordered table-striped dt-responsive tablaImagenesVehiculos" width="100%">


                                    <thead>


                                        <tr>

                                            <th style="width:10px">ID</th>
                                            <th>Descripción</th>
                                            <th>Imagen </th>
                                            <th>Acciones </th>



                                        </tr> 

                                    </thead>

                                    <tbody>

                                        <tr>
                                            <td>1</td>
                                            <td>9000</td>
                                            <td>1000</td>
                                            <td>1000</td>

                                        </tr>



                                    </tbody>

                                </table>


                            </div> 

                        </div> 


                        </p>
                    </div>
                </div>
                <!--===================================== 
                PIE DEL MODAL 
                ====================================== --> 

                <div class="modal-footer"> 

                    <button type="button" class="btn btn-default pull-left" data-dismiss="modal">Salir</button> 

                    <button type="button" class="btn btn-primary guardarImagen">Guardar</button> 

                </div> 


            </form> 

        </div> 

    </div> 

</div> 

Código Javascript

 //SUBIR IMAGENES
    $(".modal-footer").on("click", ".guardarImagen", function () {


        console.log("Prueba");



        //VALIDADACIONES


        if ($("#descripcionImagen").val() == "") {
            swal({
                type: "error",
                title: "Falta Capturar la Descripcion",
                showConfirmButton: true,
                confirmButtonText: "Cerrar"
            })

            return;
        }



        //VERIFICA SI ESCRIBIO EL CORREO ELECTRONICO
        if ($(".nuevaFoto").val() == "") {
            swal({
                type: "error",
                title: "Falta capturar la foto",
                showConfirmButton: true,
                confirmButtonText: "Cerrar"
            })

            return;
        }



         $(".guardarImagen").attr("disabled",true);
         $(".guardarImagen").html("Guardando...");

        //SUBIR ARCHIVO

        var descripcionImagen = $("#descripcionImagen").val();
        var imagen = $(".nuevaFoto").prop("files")[0];
        var idVehiculo = $("#idVehiculo").val();

        console.log("Imagen:", imagen);

        var datosDocumento = new FormData();


        datosDocumento.append("guardarImagenVehiculo", "guardarImagenVehiculo");

        datosDocumento.append("descripcionImagen", descripcionImagen);
        datosDocumento.append("idVehiculo", idVehiculo);
        datosDocumento.append("imagen", imagen);




        $.ajax({

            url: "controladores/imagenVehiculos.controlador.php",
            method: "POST",
            data: datosDocumento,
            cache: false,
            contentType: false,
            processData: false,
            //dataType: "json",
            success: function (respuesta) {

                console.log(respuesta);
                if (respuesta == "ok") {
                    swal({
                        type: "success",
                        title: "Guardado Correctamente",
                        showConfirmButton: true,
                        confirmButtonText: "Cerrar"
                    }).then(function (result) {
                        if (result.value) {
                            
                              $(".guardarImagen").removeAttr("disabled");
                              $(".guardarImagen").html("Guardar");

                            $('.tablaImagenesVehiculos').DataTable().destroy();
                            cargaImagenesVehiculos(idVehiculo);

                        }


                    });





                    return;
                } else {

                    if (respuesta.match(/Duplicate entry.*/)) {
                        swal({
                            type: "error",
                            title: "El UUID de documento ya esta en uso, favor de recargar la pagina",
                            showConfirmButton: true,
                            confirmButtonText: "Cerrar"

                        })

                        return;
                    }

                    $(".guardarImagen").removeAttr("disabled");
                    $(".guardarImagen").html("Guardar");
                 
                    swal({
                        type: "error",
                        title: "" + respuesta + "",
                        showConfirmButton: true,
                        confirmButtonText: "Cerrar"
                    })
                }
            }

        })

    });



    //TRAER LISTA DE IMAGENES EN DATATABLE
    $(".tablaVehiculos").on("click", ".btnImagenesVehiculos", function () {


        var idVehiculo = $(this).attr("idVehiculo");
        
        $('.tablaImagenesVehiculos').DataTable().destroy();
        $("#idVehiculo").val(idVehiculo);
        console.log("asd");
        cargaImagenesVehiculos(idVehiculo);


        return;

    });



    //ELIMINAR  IMAGEN
    $(".tablaImagenesVehiculos").on("click", ".btnEliminarImagenVechiculo", function () {


        var idImagen = $(this).attr("idimagenvehiculo");
        
        var idVehiculo = $(this).attr("idVehiculo");

        console.log("PRUEBA ELIMINAR:", idImagen);


        swal({
            title: '¿Está seguro de borrar la imagen?',
            text: "¡Si no lo está puede cancelar la accíón!",
            type: 'warning',
            showCancelButton: true,
            confirmButtonColor: '#3085d6',
            cancelButtonColor: '#d33',
            cancelButtonText: 'Cancelar',
            confirmButtonText: 'Si, borrar venta!'
        }).then(function (result) {
            if (result.value) {
                
                
                var datosDocumento = new FormData();


                datosDocumento.append("eliminarImagenVehiculo", "eliminarImagenVehiculo");

                datosDocumento.append("idImagen", idImagen);



                $.ajax({

                    url: "controladores/imagenVehiculos.controlador.php",
                    method: "POST",
                    data: datosDocumento,
                    cache: false,
                    contentType: false,
                    processData: false,
                    //dataType: "json",
                    success: function (respuesta) {

                        console.log(respuesta);
                        if (respuesta == "ok") {
                            swal({
                                type: "success",
                                title: "Eliminado Corecctamente",
                                showConfirmButton: true,
                                confirmButtonText: "Cerrar"
                            }).then(function (result) {
                                if (result.value) {

                                    $('.tablaImagenesVehiculos').DataTable().destroy();
                                    cargaImagenesVehiculos(idVehiculo);

                                }


                            });





                            return;
                        }
                    }


                })
            }

        })


        return;

    });




    function cargaImagenesVehiculos(idVehiculo
            )
    {






        var dataTable = $('.tablaImagenesVehiculos').DataTable({

            "processing": true,
            "serverSide": false,
            "deferRender": true,
            "retrieve": true,
            "pageLength": 5,
            "lengthMenu": [5, 10, 25, 50, 100, 150, 200],

            "language": {

                "sProcessing": "Procesando...",
                "sLengthMenu": "Mostrar _MENU_ registros",
                "sZeroRecords": "No se encontraron resultados",
                "sEmptyTable": "Ningún dato disponible en esta tabla",
                "sInfo": "Mostrando registros del _START_ al _END_ de un total de _TOTAL_",
                "sInfoEmpty": "Mostrando registros del 0 al 0 de un total de 0",
                "sInfoFiltered": "(filtrado de un total de _MAX_ registros)",
                "sInfoPostFix": "",
                "sSearch": "Buscar:",
                "sUrl": "",
                "sInfoThousands": ",",

                "sLoadingRecords": "Cargando...",
                "oPaginate": {
                    "sFirst": "Primero",
                    "sLast": "Último",
                    "sNext": "Siguiente",
                    "sPrevious": "Anterior"
                },
                "oAria": {
                    "sSortAscending": ": Activar para ordenar la columna de manera ascendente",
                    "sSortDescending": ": Activar para ordenar la columna de manera descendente"
                }

            },
            "ajax": {
                url: "ajax/datatable-imagenesVehiculo.ajax.php",
                type: "POST",

                data: {
                    tablaImagenVechiculos: "tablaImagenVechiculos",
                    idVehiculo1: idVehiculo

                }


            }

        });

    }

Archivo AJAX para datatable de las imagenes

<?php


require_once "../modelos/generales.modelo.php";
session_start();

if (!$_SESSION["iniciarSesion"]) {
    return;
}



if(isset($_POST["tablaImagenVechiculos"])){
    
    $idVehiculo = $_POST["idVehiculo1"];
    
       $campos = " * ";
  
       $where=" and a.idVehiculo = $idVehiculo ";

       $nominas = ModeloGenerales::mdlMostrarTabla(" imagenesVehiculos  ",$campos,$where);
    

        if (count($nominas) == 0) {

            echo '{"data": []}';

            return;
        }

        $datosJson = '{

		
		  "data": [';

        for ($i = 0; $i < count($nominas); $i++) {



            $imagen="<img src='data:image/png;base64, ".base64_encode($nominas[$i]["imagen"])."' data-action='zoom' class='img-thumbnail' width='40px'>";
            $botones = "<div class='btn-group'><button type='button' class='btn btn-danger btnEliminarImagenVechiculo' idVehiculo='" . $nominas[$i]["idVehiculo"] ."' idImagenVehiculo='" . $nominas[$i]["id"] ."'><i class='fa fa-trash-o'></i></button></div>";
            
         
            
            $datosJson .= '[
						"' . $nominas[$i]["id"] . '", 
						"' . $nominas[$i]["descripcion"] . '",
						
						
                                                "'.$imagen.'",
                                                "'.$botones.'"
			    ],';
        }

        $datosJson = substr($datosJson, 0, -1);

        $datosJson .= '] 

		 }';

        echo $datosJson;
}

imagenVehiculos.controlador.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of imagenVehiculos
 *
 * @author Julio Cesar Leyva Rodriguez
 */
class ControladorImagenVehiculos {
    
    
}



//GUARDA ESTADO DESDE SISTEMA
if (isset($_POST["guardarImagenVehiculo"])){
    
    include "../modelos/conexion.php";
    include "../modelos/imagenVehiculos.modelo.php";

    
    date_default_timezone_set('America/Chihuahua');
    
     if ((isset($_FILES['imagen'])) && ($_FILES['imagen'] != '')) {

        $file = fopen($_FILES['imagen']['tmp_name'], "rb");

        $fileName = "";
        $fileExtension = "";
    } else {
        $file = "";
    }
    
    

    
    $datos["idVehiculo"]=$_POST["idVehiculo"];
    $datos["descripcion"]=$_POST["descripcionImagen"];
    $datos["imagen"]=$file;
    
    $resultado = ModeloImagenVehiculos::mdlIngresarImagenesVehiculos("imagenesVehiculos",  $datos);


    echo $resultado;
    
}


//GUARDA ESTADO DESDE SISTEMA
if (isset($_POST["eliminarImagenVehiculo"])){
    
    include "../modelos/conexion.php";
    include "../modelos/imagenVehiculos.modelo.php";

    
    date_default_timezone_set('America/Chihuahua');
   

    
    $datos["id"]=$_POST["idImagen"];

    
    $resultado = ModeloImagenVehiculos::mdlEliminarImagenVechiculo("imagenesVehiculos",  $datos);


    echo $resultado;
    
}

imagenVehiculos.modelo.php

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of imagenVehiculos
 *
 * @author Julio Cesar Leyva Rodriguez
 */
require_once "conexion.php";


Class ModeloImagenVehiculos {
    
    
    
   // INGRESA MOVIMIENTO DESDE SISTEMA
    static public function mdlIngresarImagenesVehiculos($tabla, $datos) {

        $stmt = Conexion::conectar()->prepare("INSERT INTO $tabla(idVehiculo
                                                                ,descripcion
                                                                ,imagen
                                                                 ) 
                                                            VALUES (:idVehiculo
                                                                ,:descripcion
                                                                ,:imagen
                                                            )");

        $stmt->bindParam(":idVehiculo", $datos["idVehiculo"], PDO::PARAM_STR);
        $stmt->bindParam(":descripcion", $datos["descripcion"], PDO::PARAM_STR);
        $stmt->bindParam(":imagen", $datos["imagen"], PDO::PARAM_LOB);

        if ($stmt->execute()) {

            return "ok";
        } else {

            $arr = $stmt->errorInfo();
            return $arr[2];
        }

        $stmt->close();
        $stmt = null;
    }
    
    
    
     static public function mdlEliminarImagenVechiculo($tabla, $datos) {

        $stmt = Conexion::conectar()->prepare("delete from $tabla where id=:id
                                                            ");

        $stmt->bindParam(":id", $datos["id"], PDO::PARAM_INT);

        if ($stmt->execute()) {

            return "ok";
        } else {

            $arr = $stmt->errorInfo();
            return $arr[2];
        }

        $stmt->close();
        $stmt = null;
    }
    
    
}

Página 8 de 9

Creado con WordPress & Tema de Anders Norén