Herramientas Informaticas

Mes: octubre 2021

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;
    }
    
    
}

No la armo

Alli si pierdo

Select2 Con Server Side Miles de registros en el ComboBox

Cuando se requiere poner miles o cientos de miles de options en un select no es bueno ponerlos todos ya que la carga de la pagina y la pagina misma se pondría lenta

La mejor opción es ponerlo via ajax y solo muestre de 5 a 10 registros cuando se haga la busqueda, a continuación mostraremos como hacerlo, basado en el sistema de punto de venta POS 2021, usando el modelo vista controlador

Ejemplo

CREATE TABLE `unidadMedidasSAT` (
  `id` bigint(20) NOT NULL,
  `c_ClaveUnidad` varchar(3) DEFAULT NULL,
  `Nombre` varchar(106) DEFAULT NULL,
  `Descripción` varchar(551) DEFAULT NULL,
  `Nota` varchar(221) DEFAULT NULL,
  `Fecha de inicio de vigencia` varchar(10) DEFAULT NULL,
  `Fecha de fin de vigencia` varchar(10) DEFAULT NULL,
  `Símbolo` varchar(21) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Insertando datos



INSERT INTO `unidadMedidasSAT` (`id`, `c_ClaveUnidad`, `Nombre`, `Descripción`, `Nota`, `Fecha de inicio de vigencia`, `Fecha de fin de vigencia`, `Símbolo`) VALUES
(1, '18', 'Tambor de cincuenta y cinco galones (EUA)', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(2, '19', 'Camión cisterna', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(3, '26', 'Tonelada real', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(4, '29', 'Libra por mil pies cuadrados', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, 'Lb / kft²'),
(5, '30', 'Día de potencia de caballos por tonelada métrica de aire seco', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(6, '31', 'Pescar', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(7, '32', 'Kilogramo por tonelada métrica seca del aire', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(8, '36', 'Pie cúbico por minuto por pie cuadrado', 'Se requiere factor de conversión', 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, 'Ft³ / (min / ft²)'),
(9, '44', 'Bolsa a granel de quinientos kilos', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(10, '45', 'Bolsa a granel de trescientos kilos', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL),
(11, '46', 'Bolsa a granel de cincuenta libras', NULL, 'Las unidades marcadas como borradas en el catálogo internacional de UNECE, serán retenidas indefinidamente en las listas de códigos. En su caso, estas unidades podrán ser reinstalado a través del proceso de mantenimiento.', '13/08/2017', NULL, NULL);

HTML

<div class="form-group">
                            <span class="input-group-addon">Unidad De Medida SAT</span>


                            <select class="form-control input-lg nuevoUnidades select2 " id="nuevoUnidades" name="nuevoUnidades" required style="width: 100%;"> 

                                <option value="">Selecionar unidades</option>



                            </select>


                        </div>

<script src="vistas/js/productos.js"></script>

JAVASCRIPT


// TRAE EL CODIGO DE LAS UNIDADES 
$('.nuevoUnidades').select2({
  ajax: {
    url: 'ajax/autocompletarUnidades.php',
    dataType: 'json'
    // Additional AJAX parameters go here; see the end of this chapter for the full code of this example
  }
});

AJAX


<?php

require_once "../modelos/unidadMedidasSAT.modelo.php";


if(isset($_GET["term"])){
    $buscar = "%".$_GET["term"]."%";
}else{
    $buscar ="%%";
}


$datos = ModeloUnidadMedidasSAT::mdlMostrarAjax("unidadMedidasSAT", $buscar);


//echo json_encode($datos);



$jsonVariable =' { "results": [';

foreach ($datos as $key => $value) {
    
    $jsonVariable .=' {
      "id": '.$value["id"].',
      "text": "'.$value["text"].'"
    },';
    
    
}
      $jsonVariable = substr($jsonVariable, 0, -1);


$jsonVariable .= ' ]
}';

echo $jsonVariable; 

Modelo


<?php
require_once "conexion.php";

Class ModeloUnidadMedidasSAT {



   
     /* =============================================
     MOSTRAR UNIDADMEDIDASSAT
      ============================================= */

    Static Public Function mdlMostrarAjax($tabla, $buscar) {

       If ($buscar != Null) {

           $stmt = Conexion:: conectar() -> prepare( "Select id
,Nombre as text

           From unidadMedidasSAT a WHERE Nombre like :buscar  limit 10");  

             $stmt -> bindParam( ":buscar" , $buscar, PDO::PARAM_STR);

           Try {
               $stmt -> execute();

                Return $stmt -> fetchAll();
           } Catch (PDOException $e) {

               $arr = $stmt -> errorInfo();
                $arr[3] = " Error ";

               If ($e -> getMessage() == 23000) {
                   $mensaje = " El registro esta duplicado, Favor de checar el numero de nomina ";
                   Return $mensaje;
               } Else {
                  Return $arr[2];
              }
           }
           
           
       } Else {

           $stmt = Conexion:: conectar() -> prepare("Select id
,Nombre as text

           

           From unidadMedidasSAT a limit 10 "); 

           $stmt -> execute();

           Return $stmt -> fetchAll();
       }


       $stmt -> close();

        $stmt = Null;
   }


}

Archivo Conexión



<?php
include_once "../configuracion.php";

include_once "../../../configuracion.php";

include_once "../../configuracion.php";
class Conexion{

	static public function conectar(){

		
            try { 
                
                $link = new PDO("mysql:host=".BD_HOST.";dbname=".BD_NOMBRE."",
                    BD_USUARIO,
                   BD_CONTRA);
                }
            catch (PDOException $e){
                
                
                if($e->getCode()==2002){
                    echo '<!DOCTYPE html> <html lang=&quot;es&quot;>      
                    <head> 		
                    <meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /> 		
                    <meta name=&quot;description&quot; content=&quot;Esta Tienda está desarrollada con PrestaShop&quot; />         
                    <style>   s          ::-moz-selection {background: #b3d4fc; text-shadow: none;}             ::selection {background: #b3d4fc; text-shadow: none;}        
                    html {padding: 30px 10px; font-size: 16px; line-height: 1.4; color: #737373; background: #f0f0f0;                
                    -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%;}             html,             
                    input {font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;}             body 
                    {max-width:700px; _width: 700px; padding: 30px 20px 50px; border: 1px solid #b3b3b3;                 
                    border-radius: 4px;margin: 0 auto; box-shadow: 0 1px 10px #a7a7a7, inset 0 1px 0 #fff;                 background: #fcfcfc;}            
                    h1 {margin: 0 10px; font-size: 50px; text-align: center;}             h1 span {color: #bbb;}            
                    h2 {color: #D35780;margin: 0 10px;font-size: 40px;text-align: center;}             h2 span {color: #bbb;font-size: 80px;}            
                    h3 {margin: 1.5em 0 0.5em;}             p {margin: 1em 0;}             ul {padding: 0 0 0 40px;margin: 1em 0;}             .container 
                    {max-width: 380px;_width: 480px;margin: 0 auto;}             input::-moz-focus-inner {padding: 0;border: 0;}         </style>     </head>     
                    <body>         <div class=&quot;container&quot;>             <h2><span>500</span> Error interno del servidor</h2>             
                    <p>¡Vaya! Algo salió mal.<br /><br />No se pudo conectar con la base de datos, revise los datos de conexion.</p>         
                    </div>     
                    </body> 
                    </html>';
                }
                
                
                return "ERROR DE CONEXION";
             
            }

		$link->exec("set names utf8");

		return $link;
                
        
	}

}

DRIVERS AUTOINSTALABLES LAPTOP LENOVO THINKPAD T430 PARA WINDOWS 10

Buenas tardes, les dejo los controladores auto instalables para la laptop Thinkpad t430

En caso de error ir al administrador de dispositivos y volver al controlador anterior

Whatda

Muevete Luz VERDE

FINALES FELICES

FACEBOOK CAIDO Inquietante simulacro: “CYBER POLYGON”

Facebook, WhatsApp e Instagram presentaron fallas en su funcionamiento este lunes 4 de octubre.

El servicio de redes sociales mostró problemas a nivel mundial cerca de las 10 a.m., hora del centro de Estados Unidos.

Ninguna de las plataformas dio a conocer de inmediato el motivo del apagón de sus servicios ni la duración estimada del problema.

Con aproximadamente 2,890 millones de usuarios activos mensuales en el segundo trimestre de 2021, Facebook es la red social más grande del mundo, de acuerdo a cifras reveladas por la compañía, y recolectadas por Statista.com. Unas 3,510 millones de personas usan al menos uno de los productos principales de la compañía (FacebookWhatsApp, Instagram o Messenger) cada me

La economía y la sociedad actual son cada vez más dependientes de la interconexión que internet proporciona. Esta realidad se ha visto acentuada con el crecimiento de la “nube” como almacén de programas y datos y del auge del teletrabajo. La interrelación actual entre el mundo físico y el mundo digital hace muy difícil separar uno del otro.

Los últimos ciberataques a dos empresas estadounidensesColonial Pipeline y JBS, han puesto de manifiesto la vulnerabilidad frente a un riesgo que no suele estar en la mente de los inversores. El riesgo a ciberataques en distintos eslabones de las cadenas de aprovisionamiento ha llevado a EE.UU. a comenzar a considerar estos ciberataques como terrorismo.

El ciberataque a Colonial Pipeline dejó fuera de servicio las instalaciones e infraestructuras del principal suministrador de gasolina de cinco estados de la costa este de EE.UU. El incidente duró una semana y provocó escasez de gasolina en muchas áreas y subidas de los precios de los carburantes en las zonas afectadas. Finalmente, la compañía pirateada decidió pagar un rescate de 5 millones de dólares (en bitcoins) a los hackers para liberar sus sistemas informáticos y poder retomar la actividad.

Hace apenas una semana, JBS, uno de los principales suministradores de carne de Estados Unidos, con una cuota de mercado del 23% (vacuno y cerdo) también sufrió un ciberataque que provocó el parón de toda su producción. De nuevo, se ha producido escasez de sus productos en muchos puntos del país. Tras pagar un rescate de 11 millones de dólares (en bitcoins) a los hackers, se ha conseguido recuperar el control de los sistemas informáticos.

En este ambiente de noticias de ciberataques aislados a empresas, va a tener lugar durante el mes de julio CYBER POLYGON 2021, un evento organizado por el Foro Económico Mundial (WEF). En este evento se simulará una ciberpandemia que podría provocar un “apagón digital” global o que afectaría a numerosas cadenas de suministros. “El ataque a una sola compañía puede poner en peligro todo el sistema”.

Como explica el Foro Económico Mundial en un breve vídeo introductorio de CYBER POLYGON 2021, se pretende poner de manifiesto los riesgos del actual mundo digital. Un ciberataque con características similares al Covid 19 se extendería diez veces más rápido que lo vivido con el coronavirus. En 2003, el virus informático Slammer/Sapphire doblaba su propagación cada 8 segundos, infectando 11 millones de aparatos conectados a internet en apenas 24 horas. Como única solución a la propagación exponencial de la eventual ciberpandemia se establece la necesaria desconexión de internet de millones de ordenadores y otros aparatos entre sí y de internet. Además, esto deberá hacerse en cuestión de pocos días.

Como menciona el video, un solo día sin internet generaría elevadas pérdidas económicas, además de daños elevados en la actividad económica y serios daños sociales. Servicios esenciales como los transportes, las comunicaciones o los servicios sanitarios se verían gravemente afectados.

En octubre de 2019, apenas unos meses antes de la declaración de la pandemia del Covid 19 por parte de la OMS, el Foro Económico Mundial conjuntamente con la Fundación Rockefeller, la fundación Bill y Melinda Gates y la Universidad John Hopkins desarrollaron el Evento 201simulando una pandemia global de un nuevo coronavirus que se extendía por el mundo causando 65 millones de muertos. De hecho, algunas de las medidas durante la pandemia real, como la actuación de las grandes tecnológicas respecto a la “verificación” de la información, forman parte de la estrategia a seguir definida en la simulación realizada.

CYBER POLYGON 2021 es la continuación de la edición realizada en 2020. Aun así, la coincidencia del inicio de la pandemia global del Covid, justo después del Evento 201, seguro que atrae suspicacias y teorías de todo tipo.

En cualquier caso, como menciona el vídeo promocional del Foro Económico Mundial de CYBER POLYGON 2021, el riesgo de ciberataques es conocido, aunque generalmente ninguneado por los inversores. Como dato, sólo tres compañías, AWS (Amazon Web Services), Azure (de Microsoft) y Google Cloud, controlan el 60% del mercado mundial de servicios en la nube. La dependencia del funcionamiento de internet de un puñado de empresas claves es una realidad. Los riesgos son inevitables, aunque mitigables. Su materialización es una incógnita.

Creado con WordPress & Tema de Anders Norén