Código de PHP - Guardar y mostrar una imagen de una base de datos MySQL

Imágen de perfil

Guardar y mostrar una imagen de una base de datos MySQLgráfica de visualizaciones


PHP

estrellaestrellaestrellaestrellaestrella(94)
Actualizado el 02 de Diciembre del 2014 por Administrador (Creado el 11 de Febrero del 2002)
265.504 visualizaciones desde el 11 de Febrero del 2002. Una media de 350 por semana
Código para guardar y mostrar una imagen desde PHP en una base de datos MySQL. (Actualizado a PHP5).

Se han desarrollado tres versiones que hacen lo mismo utilizando diferentes conectores de MySQL:
mysql_
mysqli_
mysqli orientado a objetos

Requerimientos

Para poder utilizar este código, necesitáis disponer de una base de datos denominada 'imagen', con una tabla denominada 'imagephp'.
Se precisan dos archivos que se muestra en el código: imagen_agregar.php y imagen_mostrar.php

Versión 1 - mysql_
estrellaestrellaestrellaestrellaestrella(51)

Actualizado el 02 de Diciembre del 2014 (Creado el 11 de Febrero del 2002)gráfica de visualizaciones de la versión: Versión 1 - mysql_
136.636 visualizaciones desde el 11 de Febrero del 2002. Una media de 182 por semana

Version 2 - mysqli_
estrellaestrellaestrellaestrellaestrella(2)

Publicado el 02 de Diciembre del 2014gráfica de visualizaciones de la versión: Version 2 - mysqli_
2.996 visualizaciones desde el 02 de Diciembre del 2014. Una media de 35 por semana

Version 3 - mysqli orientado a objetos
estrellaestrellaestrellaestrellaestrella(41)

Publicado el 02 de Diciembre del 2014gráfica de visualizaciones de la versión: Version 3 - mysqli orientado a objetos
125.875 visualizaciones desde el 02 de Diciembre del 2014. Una media de 1.197 por semana
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

Esta nueva versión utiliza mysqli orientado a objetos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?php
########## imagen_agregar.php ##########
# http://www.lawebdelprogramador.com
 
/*
La base de datos utilizada para el ejemplo se llama imagenes

CREATE TABLE IF NOT EXISTS `imagephp` (
  `id` smallint(6) NOT NULL auto_increment,
  `anchura` smallint(6) NOT NULL,
  `altura` smallint(6) NOT NULL,
  `tipo` char(15) NOT NULL,
  `imagen` mediumblob NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;
*/
?>
<!DOCTYPE html>
<head>
    <meta charset="utf-8">
    <style>
    .error {font-weight: bold; color:red;}
    .mensaje {color:#030;}
    .listadoImagenes img {float:left;border:1px solid #ccc; padding:2px;margin:2px;}
    </style>
</head>
 
<body>
 
<?php
# Conectamos con MySQL
$mysqli=new mysqli("localhost","root","123456","imagen");
if (mysqli_connect_errno()) {
    die("Error al conectar: ".mysqli_connect_error());
}
 
// Los posible valores que puedes obtener de la imagen son:
//echo "<BR>".$_FILES["userfile"]["name"];      //nombre del archivo
//echo "<BR>".$_FILES["userfile"]["type"];      //tipo
//echo "<BR>".$_FILES["userfile"]["tmp_name"];  //nombre del archivo de la imagen temporal
//echo "<BR>".$_FILES["userfile"]["size"];      //tamaño
 
# Comprovamos que se haya subido un fichero
if (is_uploaded_file($_FILES["userfile"]["tmp_name"]))
{
    # verificamos el formato de la imagen
    if ($_FILES["userfile"]["type"]=="image/jpeg" || $_FILES["userfile"]["type"]=="image/pjpeg" || $_FILES["userfile"]["type"]=="image/gif" || $_FILES["userfile"]["type"]=="image/bmp" || $_FILES["userfile"]["type"]=="image/png")
    {
        # Cogemos la anchura y altura de la imagen
        $info=getimagesize($_FILES["userfile"]["tmp_name"]);
        //echo "<BR>".$info[0]; //anchura
        //echo "<BR>".$info[1]; //altura
        //echo "<BR>".$info[2]; //1-GIF, 2-JPG, 3-PNG
        //echo "<BR>".$info[3]; //cadena de texto para el tag <img
 
        # Escapa caracteres especiales
        $imagenEscapes=$mysqli->real_escape_string(file_get_contents($_FILES["userfile"]["tmp_name"]));
 
        # Agregamos la imagen a la base de datos
        $sql="INSERT INTO `imagephp` (anchura,altura,tipo,imagen) VALUES (".$info[0].",".$info[1].",'".$_FILES["userfile"]["type"]."','".$imagenEscapes."')";
        $mysqli->query($sql);
 
        # Cogemos el identificador con que se ha guardado
        $id=$mysqli->insert_id;
 
        # Mostramos la imagen agregada
        echo "<div class='mensaje'>Imagen agregada con el id ".$id."</div>";
    }else{
        echo "<div class='error'>Error: El formato de archivo tiene que ser JPG, GIF, BMP o PNG.</div>";
    }
}
?>
 
<h2>Selecciona una imagen</h2>
<form enctype="multipart/form-data" action="<?php echo $_SERVER["PHP_SELF"]?>" method="POST">
    <input name="userfile" type="file">
    <p><input type="submit" value="Guardar Imagen">
</form>
 
<h2>Listado de las imagenes añadidas a la base de datos</h2>
<div class="listadoImagenes">
    <?php
    $result=$mysqli->query("SELECT * FROM imagephp ORDER BY id DESC");
    if($result)
    {
        while($row=$result->fetch_array(MYSQLI_ASSOC))
        {
            echo "<img src='imagen_mostrar.php?id=".$row["id"]."' width='".$row["anchura"]."' height='".$row["aaltura"]."'>";
        }
    }
    ?>
</div>
</body>
</html>
 
 
 
 
 
 
 
 
 
 
 
<?php
########## imagen_mostrar.php ##########
# debe recibir el id de la imagen a mostrar
# http://www.lawebdelprogramador.com
 
# Conectamos con MySQL
$mysqli=new mysqli("localhost","root","123456","imagen");
if (mysqli_connect_errno()) {
    die("Error al conectar: ".mysqli_connect_error());
}
 
# Buscamos la imagen a mostrar
$result=$mysqli->query("SELECT * FROM `imagephp` WHERE id=".$_GET["id"]);
$row=$result->fetch_array(MYSQLI_ASSOC);
 
# Mostramos la imagen
header("Content-type:".$row["tipo"]);
echo $row["imagen"];
?>



Comentarios sobre la versión: Version 3 - mysqli orientado a objetos (41)

parricide
11 de Diciembre del 2014
estrellaestrellaestrellaestrellaestrella
Caballeros , usé con relativo exito el tutorial, solo se me presentó un problema, a la hora de guardar la imagen, guarda los daos de la imagen pero no la imagen, el error que muestra es en
Fatal error: Call to undefined method ########::mysqli_real_escape_string()
agradezco cualquier aclaracion.
Responder
jahrex
11 de Diciembre del 2014
estrellaestrellaestrellaestrellaestrella
el codigo trabaja muy bien, solo que al publicarlo en mi server me manda un mensage que no se como quitar, el mensage es el sig."Notice: Undefined index: userfile in C:\xampp\htdocs\galery.php on line 44", no se si me puedan ayudar. de antemno gracias, ya se como gusrdar imagenes en una base de datos jeje.
Responder
Mauricio Sebastián
10 de Enero del 2016
estrellaestrellaestrellaestrellaestrella
Estimado
con arroba para ocultar el error por ejemplo $variable muestra el error y para ocultar seria así
@$variable.
Saludos
Responder
emerson ariel
12 de Marzo del 2016
estrellaestrellaestrellaestrellaestrella
se antepone a las variables @, ejemplo @$variable, o se declara las variables con algun valor
Responder
Harry13
12 de Diciembre del 2014
estrellaestrellaestrellaestrellaestrella
jahrex , fijate en la linea del codigo
ya que estas abriendo el archivo galery.php con la direccion del servidor local "C:\xampp\htdocs\galery.php"
Responder
edgardo
12 de Febrero del 2015
estrellaestrellaestrellaestrellaestrella
Estimado. Como puedes hacer para asegurarte que no exista en la BD una imagen con el mismo nombre?
Muchas gracias
Responder
Tomy
19 de Febrero del 2015
estrellaestrellaestrellaestrellaestrella
Edgardo creo que puedes solucionarlo usando unique, funciona perfecto.
Responder
EDUBIN TORRES
12 de Marzo del 2015
estrellaestrellaestrellaestrellaestrella
me sale el siguiente error, copie el codigo tal y como aparese en la fuente:

Fatal error: Call to a member function fetch_array() on a non-object in C:\AppServ\www\subir_imagenes\imagen_mostrar.php on line 14
Me pueden ayudar...
utilizo servidor apache appserver
Responder
juan ariel
09 de Abril del 2015
estrellaestrellaestrellaestrellaestrella
Muchas gracias me sirvio de 10 !!!
Responder
hexequiel
14 de Abril del 2015
estrellaestrellaestrellaestrellaestrella
Hola perfecto el codigo me funciono perfecto al subir la imag, pero tengo un problema al querer mostrar el archivo solo me sale el cuadro de la imagen pero no veo la imagen
Responder
VGualdron
17 de Septiembre del 2015
estrellaestrellaestrellaestrellaestrella
me pasa igual, pudiste arreglar este problema?
Responder
mibarra
20 de Junio del 2015
estrellaestrellaestrellaestrellaestrella
Me sale el siguiente error en la parte de imagen_mostrar.php

Fatal error: Call to a member function fetch_array() on a non-object in /home/u361249534/public_html/scripts/imagen_mostrar.php on line 14

Me ayudas?
Espero tu pronta respuesta.
Responder
mescajece
03 de Julio del 2015
estrellaestrellaestrellaestrellaestrella
Estimado esta excelente el codigo solo tengo la duda de los datos que utilizas para la bd son estos (anchura,altura,tipo,imagen) y cual es el type que trabajas con cada uno para que te funcione correcto, saludos.
Responder
Jose Humberto
07 de Julio del 2015
estrellaestrellaestrellaestrellaestrella
POR FAVOR SI ME PUEDEYUDAR POR QUEME SALE ESTE ERROR
Fatal error: Call to a member function fetch_array() on a non-object in /data/webs/sites/s/e/serviactividades/web/subirimagen.php on line 119
Responder
Omar
18 de Julio del 2015
estrellaestrellaestrellaestrellaestrella
Muy Buena, gracias por compartir, te deseos exitos!!!
Responder
samirino
31 de Julio del 2015
estrellaestrellaestrellaestrellaestrella
Para visualizar las imágenes, debes poner el código PHP, del archivo "imagen_mostra.php", antes del "<!DOCTYPE html>" , o simplemente puede ser un archivo "PHP" sin "HTML".
Responder
samirino
02 de Agosto del 2015
estrellaestrellaestrellaestrellaestrella
En la linea 44, donde está escrito esto :
if (is_uploaded_file($_FILES["userfile"]["tmp_name"]))

para que no aparezca en la ejecución este mensaje: "Notice: Undefined index: userfile..."
se puede escribir así:
if (isset($_FILES["userfile"]["tmp_name"]) and (is_uploaded_file($_FILES["userfile"]["tmp_name"])))
Responder
alexis
28 de Marzo del 2016
estrellaestrellaestrellaestrellaestrella
hola funciono, pero la duda solo por saber es xq antes si mostraba ese msj de error, y poniendo esa línea que dices se arregla? gracias por el aporte
Responder
Walter
21 de Septiembre del 2015
estrellaestrellaestrellaestrellaestrella
Reemplazar echo "<img src='imagen_mostrar.php?id=".$row["id"]."' width='".$row["anchura"]."' height='".$row["aaltura"]."'>";

por

echo "<img src='imagen_mostrar.php?id=".$row["id"]."' width='".$row["anchura"]."' height='".$row["altura"]."'>";
Responder
Francisco
20 de Octubre del 2015
estrellaestrellaestrellaestrellaestrella
Muchas gracias por tu aportación.

No lo he probado pero necesito hacer un ejercicio como el ejemplo que pones.
Responder
juan
24 de Octubre del 2015
estrellaestrellaestrellaestrellaestrella
Hla seria tan amable alguien de ayudarme con este error Notice: Undefined index: imagen in C:\xampp\htdocs\AplicacionWeb\formulario\imagen_agregar.php on line 18
Responder
Imágen de perfil
xve
25 de Octubre del 2015
estrellaestrellaestrellaestrellaestrella
Hola Juan, cual es tu linea 18?
Responder
carlos
24 de Octubre del 2015
estrellaestrellaestrellaestrellaestrella
como hago para que se muestre mi imagen
Responder
Imágen de perfil
xve
25 de Octubre del 2015
estrellaestrellaestrellaestrellaestrella
Hola Carlos, si la imagen se te ha guardado correctamente en la base de datos, se te tiene que mostrar. Las imagenes se muestran en la linea 88
Responder
lalo
26 de Octubre del 2015
estrellaestrellaestrellaestrellaestrella
ya me corre con la base pero la imagene aparece en blanco por que me urge¡¡¡
espero alguna respuesta
Responder
facundo
19 de Noviembre del 2015
estrellaestrellaestrellaestrellaestrella
Cuando lo hago me sale un cartel que dice que no tengo los recursos para entrar a la carpeta donde se ubica la imagen... que tengo que hacer?
Responder
Lorena
27 de Noviembre del 2015
estrellaestrellaestrellaestrellaestrella
como se debe llamar la carpeta donde se guardan las imagenes ... porque solo se ve que las guarda pero no me muestra la imagnen como tal
Responder
Raimundo Antonio
07 de Febrero del 2016
estrellaestrellaestrellaestrellaestrella
Amigos dónde guardo las imágenes y si pueden ser pdf, está muy bueno el tutorial lo voy a probar, saludos.
Responder
LluisE
17 de Febrero del 2016
estrellaestrellaestrellaestrellaestrella
El codigo funciono muy bien, muchas gracias.
Responder
Alguien
04 de Marzo del 2016
estrellaestrellaestrellaestrellaestrella
(LINEA 119)
$row=$result->fetch_array(MYSQLI_ASSOC);
(ERROR)
Fatal error: Call to a member function fetch_array() on a non-object in /home/u964603497/public_html/beta/mod/subeimagenes.php on line 119
Responder
alexis
28 de Marzo del 2016
estrellaestrellaestrellaestrellaestrella
hola, me funciona bien el código, el único problema q dice "Undefined index: userfile in ....." según vi userfile es el input de cuadro de búsqueda de la imagen, aun asi guarda la imagen y hace todo bien, pero como se hace para q arreglar eso y que no aparesca ese msj de error?
se agradese el aporte
Responder
jose luis andrade
29 de Mayo del 2016
estrellaestrellaestrellaestrellaestrella
hola, excelente el código, solo tengo una duda no se si lo sepas... la cuestión es esta: lo implemente para la parte de imprimir un ticket uso el plugin printArea de jquery lo muestro en una div para visualizarla pero a la hora de imprimirla ya no la muestra y no se si es porque el plugin lee el codigo y no lo que esta sobre la pantalla espero y puedas ayudarme, saludos.
Responder
stanly
15 de Junio del 2016
estrellaestrellaestrellaestrellaestrella
el codigo esta muy bien pero cuando subo la imagen no me muestra nada solo sale el marco y un archivito pero no sebe la imagen ayuda gracias
Responder
yohanna
14 de Julio del 2016
estrellaestrellaestrellaestrellaestrella
El código me funciona parcialmente.... me guarda la imagen en la base de datos pero no se muestra.. solo aparece el marco con el iconito de imagen pero no se muestra.. y el archivo imagen_mostrar.php me lanza el siguiente mensaje: Fatal error: Call to a member function fetch_array() on a non-object in C:\AppServ\www\imagenes\imagen_mostrar.php on line 11
mi linea 11 dice: $row=$result->fetch_array(MYSQL_ASSOC);
que pasa aqui? ;3 alguien que me ayude please.. gracias. :)
Responder
crhistian torres
15 de Julio del 2016
estrellaestrellaestrellaestrellaestrella
tenia varios errores una es la base de datos al momento de pedirla en php y la otra es al mostrar la imagen en anchura tenias doble a el codigo quedaria asi
// index.php

<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<style>
.error {font-weight: bold; color:red;}
.mensaje {color:#030;}
.listadoImagenes img {float:left;border:1px solid #ccc; padding:2px;margin:2px;}
</style>
</head>

<body>

<?php
# Conectamos con MySQL
$mysqli=new mysqli("localhost","root","","imagenes");
if (mysqli_connect_errno()) {
die("Error al conectar: ".mysqli_connect_error());
}

// Los posible valores que puedes obtener de la imagen son:
//echo "<BR>".$_FILES["userfile"]["name"]; //nombre del archivo
//echo "<BR>".$_FILES["userfile"]["type"]; //tipo
//echo "<BR>".$_FILES["userfile"]["tmp_name"]; //nombre del archivo de la imagen temporal
//echo "<BR>".$_FILES["userfile"]["size"]; //tamaño

# Comprovamos que se haya subido un fichero
if (is_uploaded_file($_FILES["userfile"]["tmp_name"]))
{
# verificamos el formato de la imagen
if ($_FILES["userfile"]["type"]=="image/jpeg" || $_FILES["userfile"]["type"]=="image/pjpeg" || $_FILES["userfile"]["type"]=="image/gif" || $_FILES["userfile"]["type"]=="image/bmp" || $_FILES["userfile"]["type"]=="image/png")
{
# Cogemos la anchura y altura de la imagen
$info=getimagesize($_FILES["userfile"]["tmp_name"]);
//echo "<BR>".$info[0]; //anchura
//echo "<BR>".$info[1]; //altura
//echo "<BR>".$info[2]; //1-GIF, 2-JPG, 3-PNG
//echo "<BR>".$info[3]; //cadena de texto para el tag <img

# Escapa caracteres especiales
$imagenEscapes=$mysqli->real_escape_string(file_get_contents($_FILES["userfile"]["tmp_name"]));

# Agregamos la imagen a la base de datos
$sql="INSERT INTO `imagephp` (anchura,altura,tipo,imagen) VALUES (".$info[0].",".$info[1].",'".$_FILES["userfile"]["type"]."','".$imagenEscapes."')";
$mysqli->query($sql);

# Cogemos el identificador con que se ha guardado
$id=$mysqli->insert_id;

# Mostramos la imagen agregada
echo "<div class='mensaje'>Imagen agregada con el id ".$id."</div>";
}else{
echo "<div class='error'>Error: El formato de archivo tiene que ser JPG, GIF, BMP o PNG.</div>";
}
}
?>

<h2>Selecciona una imagen</h2>
<form enctype="multipart/form-data" action="<?php echo $_SERVER["PHP_SELF"]?>" method="POST">
<input name="userfile" type="file">
<p><input type="submit" value="Guardar Imagen">
</form>

<h2>Listado de las imagenes añadidas a la base de datos</h2>
<div class="listadoImagenes">
<?php
$result=$mysqli->query("SELECT * FROM imagephp ORDER BY id DESC");
if($result)
{
while($row=$result->fetch_array(MYSQLI_ASSOC))
{
echo "<img src='imagen_mostrar.php?id=".$row["id"]."' width='".$row["anchura"]."' height='".$row["abs(number)ltura"]."'>";
}
}
?>
</div>
</body>
</html>

//imagen_mostrar.php

# Conectamos con MySQL
$mysqli=new mysqli("localhost","root","","imagenes");
if (mysqli_connect_errno()) {
die("Error al conectar: ".mysqli_connect_error());
}

# Buscamos la imagen a mostrar
$result=$mysqli->query("SELECT * FROM `imagephp` WHERE id=".$_GET["id"]);
$row=$result->fetch_array(MYSQLI_ASSOC);

# Mostramos la imagen
header("Content-type:".$row["tipo"]);
echo $row["imagen"];
?>

ya saben que la base de datos se llama imagenes y la tabla es:

CREATE TABLE IF NOT EXISTS `imagephp` (
`id` smallint(6) NOT NULL auto_increment,
`anchura` smallint(6) NOT NULL,
`altura` smallint(6) NOT NULL,
`tipo` char(15) NOT NULL,
`imagen` mediumblob NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
Responder
luis ubaldo
23 de Julio del 2016
estrellaestrellaestrellaestrellaestrella
Hola, una consulta.
Yo ya tengo implemtado todo lo mencionado pero lo que quiero hacer ahora es descargar la imagen de la base y guardar en un archivo por ejemplo en la carpeta "imagen/yo.jpg"
No se como dar la orden del nombre y el lugar donde quiero que se grabe.
Responder
Imágen de perfil
xve
24 de Julio del 2016
estrellaestrellaestrellaestrellaestrella
Aquí tienes el código que lo hace:
http://www.lawebdelprogramador.com/codigo/PHP/2029-Crear-imagenes-desde-base-de-datos-Mysql.html
Responder
Martin
15 de Agosto del 2016
estrellaestrellaestrellaestrellaestrella
Que tal me pueden ayudar con un update, para modificar el nombre o el archivo que acabas de cargar a la base de datos por favor, no logro hacer que muestre los datos actualizados en el formulario correspondiente! Gracias
Responder
ISRAEL MENDEZ
16 de Agosto del 2016
estrellaestrellaestrellaestrellaestrella
QUE TAL AMIGO YO TAMBIEN TENIA ESE ERROR DE Duplicate entry '0' for key 'PRIMARY' MI ERROR FUE QUE AL CREAR LA TABLA EN LA BASE DE DATOS, NO HABIA PUESTO LA OPCION DE AUTO INCREMENTAR AUTOMATICAMENTE POR ESO ME MARCABA ESE ERROR, UNA VEZ QUE ACTIVES ESA OPCION JALA PERFECTAMENTE SALUDOS
Responder
anthony
26 de Agosto del 2016
estrellaestrellaestrellaestrellaestrella
muy bueno tu codigo perfectamente lo que buscaba para mostrar y guardar una imagen en la base de datos... gracias por tu ayuda...
Responder
Alex
31 de Agosto del 2016
estrellaestrellaestrellaestrellaestrella
Para tod@s aquellos que no les muestra las imágenes en la parte de abajo es porque no están separando los dos archivos, si leen en la parte de arriba dice que se crean dos archivos imagen_agregar.php y imagen_mostrar.php si solo copian y pegan todo en un mismo archivo no les va a funcionar bien, ademas el código tiene un error en la variable altura dice aaltura se le tiene que quitar una "a" y para que no les aparezcan los Notice solo agreguen un @ la variable que jala ese index por ejemplo debería quedar así @$_FILES y listo con eso desaparece todos los problemas que tiene ese código y funciona perfecto.
Responder

Comentar la versión: Version 3 - mysqli orientado a objetos

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios

http://lwp-l.com/s70