Lenguaje PHP

Subir múltiples imágenes con PDO. PHP y MySQL

Subir múltiples imágenes con PDO. En este artículo, realizaremos un ejemplo para subir múltiples imágenes a la base de datos MySQL usando PDO-PHP y las imágenes subidas las mostraremos en la página web.

En un ejemplo anterior solo vimos como subir múltiples imágenes al servidor, pero ahora haremos un ejemplo más amplio, incorporando la opción de subir a una base de datos.

¿Cómo subir imágenes múltiples al servidor y MySQL?

  • Tabla MySQL.- Se puede realizar creando una tabla MySQL y una columna tipo varchar para subir el nombre de la imagen.
  • Crear carpeta.- Es vital crear una carpeta en su proyecto en la que se almacenará su imagen sida a través del formulario.
  • Usando PDO.- Para un óptimo desarrollo es conveniente usar PDO para tener la seguridad en la conexión con MySQL y usando estrategias de seguridad.
  • Formulario.- Para poder subir imágenes al servidor es necesario crear un formulario y que obligatoriamente contenga el atributo enctype='multipart/form-data'. Debiendo quedar así [<form method='post' action='' enctype='multipart/form-data'>].
Subir múltiples imágenes con PDO. PHP y MySQL
Subir múltiples imágenes con PDO. PHP y MySQL

Subir múltiples imágenes con PDO PHP

A continuación, veremos varios pasos para lograr el objetivo del artículo.

1. Estructura de la tabla MySQL:

Es necesario crear una tabla en la base de datos para guardar los nombres de las imágenes. Por lo tanto, las siguientes son las consultas SQL para crear una tabla donde el nombre de la base de datos será «e_uploadpdo» y el nombre de la tabla es «imagenes«.

CREATE TABLE `imagenes` (
`id` int(11) NOT NULL,
`nombre` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL,
`image` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


ALTER TABLE `imagenes`
ADD PRIMARY KEY (`id`);

ALTER TABLE `imagenes`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

2. Configuración de Conexión a MySQL

Para que el script funcione se debe de conectar a MySQL usando el lenguaje de programación PHP, en este ejemplo usaremos PDO porque es más seguro y robusto.

Código PHP:

Crearemos un archivo PHP llamado «conexion.php» y contendrá las variables y tipo de conexión hacia la base de datos.

Si observan el script, la variable de conexión es «$conn» y será requerida para la consulta de insertar los nombres de las imágenes en MySQL a través de la sentencia INSERT INTO que permite insertar registros a MySQL.

<?php

$server = "localhost";
$username = "root";
$password = "root";
$dbname = "e_uploadpdo";

try {
$conn = new PDO(
"mysql:host=$server;dbname=$dbname","$username","$password");

$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e) {
die('No se puede conectar a MySQL');
}

?>

3.HTML y archivos PHP:

index.php: A continuación, mostraremos este fichero, que en su estructura HTML mostrara el formulario encargado de cargar las imágenes hacia el servidor y también hacia la base de datos con PHP.

Este fichero además del formulario posee una instrucción PHP que se ejecuta al presionar el botón «cargar imagen» del formulario. Sin embargo, este botón tiene como nombre «submit» en el cual a través de una condicional IF procesara las imágenes, de acuerdo a la siguiente lista:

  • Contará la cantidad de imágenes
  • Preparada de la consulta SQL
  • Generamos el bucle de todos los archivos
  • Extraemos en variable el nombre de archivo
  • Designamos la carpeta de subida
  • Obtenemos la extensión del archivo
  • Validamos la extensión de la imagen
  • Subimos la imagen al servidor
  • Ejecutamos la consulta SQL
Formulario cargar imagenes con PDO
Formulario cargar imagenes con PDO
<?php
//Incluimos el fichero de conexión a MySQL
require "conexion.php";

if(isset($_POST['submit'])) {

// Contamos la cantidad de imagenes
$countfiles = count($_FILES['files']['name']);

// Declaración preparada de la consulta SQL
$query = "INSERT INTO imagenes (nombre,image) VALUES(?,?)";

$statement = $conn->prepare($query);

// Generamos el bucle de todos los archivos
for($i = 0; $i < $countfiles; $i++) {

// Extraemos en variable el nombre de archivo
$filename = $_FILES['files']['name'][$i];

// Designamos la carpeta de subida
$target_file = 'subidas/'.$filename;

// Obtenemos la extension del archivo
$file_extension = pathinfo($target_file, PATHINFO_EXTENSION);

$file_extension = strtolower($file_extension);

// Validamos la extensión de la imagen
$valid_extension = array("png","jpeg","jpg");

if(in_array($file_extension, $valid_extension)) {

// Subimos la imagen al servidor
if(move_uploaded_file(
$_FILES['files']['tmp_name'][$i],
$target_file)
) {

// Ejecutamos la consulta SQL
$statement->execute(
array($filename,$target_file));
}
}
}

$respuesta = "Carga de archivos correctamente";
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content=
"width=device-width, initial-scale=1.0">
<title>Cargar imagen con PHP PDO</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" >
</head>

<body>
<div class="container"> <br>
<div class="alert alert-primary" role="alert">
<h4>Cargar imagen con PHP PDO</h4>
</div>
<?php
if(isset($respuesta)){
echo ' <div class="alert alert-success" role="alert"> '.$respuesta.'</div>'; 
}?>

<div class="card">
<div class="card-header"> Subir imagenes </div>
<div class="card-body">
<form method='post' action='' enctype='multipart/form-data'>
<div class="input-group mb-3">
<div class="input-group-prepend"> <span class="input-group-text" id="inputGroupFileAddon01">Cargar</span> </div>
<div class="custom-file">
<input type='file' class="custom-file-input" id="inputGroupFile01" name='files[]' multiple />
<label class="custom-file-label" for="inputGroupFile01">Seleccione...</label>
</div>
</div>
<input class="btn btn-primary" type='submit' value='Cargar Imagen' name='submit' />
<a href="ver.php" class="btn btn-success">Ver imagenes</a>
</form>
</div>
</div>
</div>
</body>
</html>

4. VISUALIZAR ARCHIVOS CARGADOS

ver.php: El siguiente archivo contendrá en su primera línea un fichero de conexión a MySQL y luego ejecutaremos una consulta usando PDO para obtener los registros de la tabla «imagenes«. Además, usaremos el ciclo FOREACH para devolver todos los registros que contiene dicha tabla.

Recordemos que la información devuelta de la base de datos solo será los nombres de las imágenes y tendremos que agregar la etiqueta IMG más la carpeta donde se subió las imágenes, en este ejemplo seria la carpeta «SUBIDAS«.

Al ingresar al fichero ver.php mostrara las imágenes que están registradas en MySQL.

Ejemplo de visualización de imagen.

<img class="img-thumbnail" src="./subidas/<?=$imagen['nombre']?>" 
title="<?=$imagen['nombre'] ?>" width='200' height='200'>

Archivo completo de visualizar las imagenes

<?php
require "conexion.php";
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Cargar imagen con PHP PDO</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" >
</head>

<body>
<div class="container">
<div class="card">
<div class="card-header"> Lista de imagenes </div>
<div class="card-body">
<?php

$stmt = $conn->prepare('select * from imagenes');
$stmt->execute();
$lista_imagenes = $stmt->fetchAll();

foreach($lista_imagenes as $imagen) {
?>
<img class="img-thumbnail" src="./subidas/<?=$imagen['nombre']?>" title="<?=$imagen['nombre'] ?>" width='200' height='200'>
<?php
}
?>
</div>
</div>
</div>
</body>
</html>
Visualizando imagenes subidas con PDO
Visualizando imagenes subidas con PDO

5. Procedemos a ejecutar el script:

Los pasos que tenemos que realizar son los siguientes:

  • Ejecute el servidor local o servidor de producción y redirija a su página al index.php.
  • Elija una imagen o varias imágenes para cargar en el formulario.
  • Haga clic en el botón «Cargar imagen» para cargar la imagen a la base de datos y al servidor.
  • Luego hacer clic en el enlace «Ver imágenes» para verificar el o los archivos cargados.

Conclusión

En este artículo hemos aprendido a carga una o varias imágenes al servidor y también a MySQL usando PDO. Por lo tanto, no es complicado realizar esta tarea si nos apoyamos con ciclos que posee PHP como ser el ciclo FOR o Ciclo FOREACH.

Además, en el ejemplo hemos incorporado el Framework Booststrap 4.6 para darle una apariencia profesional a nuestro ejemplo. Recordemos que esta librería solo se declara en la etiqueta HEAD y luego solo usamos sus clases en nuestras etiquetas HTML.

Descargar

Nestor Tapia

Bloggero, amante de la programación PHP, innovador y me fascina compartir información. Desde que conocí el entorno informatico y el internet me llamó la atención la programación, Por tal motivo he creado mi blog BAULPHP.COM para compartir mis experiencias con todos ustedes. ¡Gracias por leerme!.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba