Mostrar Una Imagen Desde Blob Mysql Usando PHP

27
Mostrar una imagen desde blob mysql usando PHP Por braulio | 19 enero 2005 | 247 Comentarios Basándonos el artículo anterior de como guardar una imagen y su miniatura a un campo BLOB de mysql , ahora veremos como poder recuperar y mostrar esas imágenes. Para que el script se muestre como una imagen necesitamos usar la cabecera Content-type y poner el tipo MIME de la imagen que recuperaremos de la tabla, esto es: php: header ("Content-type: image/gif"); Donde image/gif es el el tipo MIME para una imagen GIF. Desarrollo del Script Las imágenes han sido guardadas en la tabla y tienen un único identificador representado por el campo idfoto, la imagen original se guarda en el campo foto, la miniatura en el campo thumb y el tipo MIME en el campo mime, como podemos ver en la estructura de la tabla: sql: CREATE TABLE `tabla` ( `idfoto` int(3) NOT NULL AUTO_INCREMENT, `nombre` varchar(255) NOT NULL DEFAULT '', `foto` blob NOT NULL, `thumb` blob NOT NULL, `mime` varchar(40) NOT NULL DEFAULT '', PRIMARY KEY (`idfoto`) ) ;

Transcript of Mostrar Una Imagen Desde Blob Mysql Usando PHP

Page 1: Mostrar Una Imagen Desde Blob Mysql Usando PHP

Mostrar una imagen desde blob mysql usando PHPPor braulio | 19 enero 2005 | 247 Comentarios

Basándonos el artículo anterior de como guardar una imagen y su miniatura a un campo BLOB de mysql, ahora veremos como poder recuperar y mostrar esas imágenes.

Para que el script se muestre como una imagen necesitamos usar la cabecera Content-type y poner el tipo MIME de la imagen que recuperaremos de la tabla, esto es:

php:header("Content-type: image/gif"); 

Donde image/gif es el el tipo MIME para una imagen GIF.

Desarrollo del Script

Las imágenes han sido guardadas en la tabla y tienen un único identificador representado por el campo idfoto, la imagen original se guarda en el campo foto, la miniatura en el campo thumb y el tipo MIME en el campo mime, como podemos ver en la estructura de la tabla:

sql:CREATE TABLE `tabla` (  `idfoto` int(3) NOT NULL AUTO_INCREMENT,  `nombre` varchar(255) NOT NULL DEFAULT '',  `foto` blob NOT NULL,  `thumb` blob NOT NULL,  `mime` varchar(40) NOT NULL DEFAULT '',  PRIMARY KEY  (`idfoto`)) ; 

Necesitamos enviar parámetros al script para indicarle el id de la imagen que queremos ver, y también si queremos ver la imagen original o su miniatura, suponiendo que el archivo que contiene al script se llame verblob.php:

html:<img src="verblob.php?idfoto=1&tam=1" alt="Imagen desde Blob" /> 

Page 2: Mostrar Una Imagen Desde Blob Mysql Usando PHP

Donde el parámetro idfoto indica el id de la imagen, y el parametro tam indica si va a mostrar la imagen original o la miniatura (1 para mostrar la imagen original y 2 para mostrar la miniatura). El script trabaja de la siguiente manera:

php:// Parámetros para recuperar la imagen# Recuperamos el parámetro GET con el id único de la foto que queremos mostrar$idfoto = (isset($_GET["idfoto"])) ? $_GET["idfoto"] : exit();# Recuperamos el parámetro GET para elegir entre la miniatura o la foto real$tam = (isset($_GET["tam"])) ? $_GET["tam"] : 1;// Escojemos la foto real o la miniatura según la variable $tamswitch($tam) {        case "1":                $campo = "foto";break;;        case "2":                $campo = "thumb";break;;        default:                $campo = "foto";break;;} 

Ya sabiendo el id de la imagen que vamos a mostrar, hacemos la consulta a la base de datos:

php:// Recuperamos la foto de la tabla$sql = "SELECT $campo, mime                FROM tabla                 WHERE idfoto = $idfoto";# Conexión a la base de datos$link = mysql_connect(DBHOST, DBUSER, DBPASSWORD) or die(mysql_error($link));;mysql_select_db(DBNAME, $link) or die(mysql_error($link));$conn = mysql_query($sql, $link) or die(mysql_error($link));$datos = mysql_fetch_array($conn);// La imagen$imagen = $datos[0];// El mime type de la imagen$mime = $datos[1];// Gracias a esta cabecera, podemos ver la imagen // que acabamos de recuperar del campo blobheader("Content-Type: $mime");

Page 3: Mostrar Una Imagen Desde Blob Mysql Usando PHP

// Muestra la imagenecho $imagen;   

Page 4: Mostrar Una Imagen Desde Blob Mysql Usando PHP

Trabajar con más de una tabla

Curso gratis creado por Coder . Extraido de: http://www.tomatoma.ws/subsecciones.php?forum_id=27&catid=22&todos=1 08 Marzo 2006< anterior | 1 .. 13 14 15 16 17 | siguiente > ""

Introducción Ahora que ya nos hemos relajado un rato y nos hemos divertido un poco mandando emilios a todas nuestras amistades, vamos a seguir adelante. Ahora vamos a ver cómo se trabaja con php y mysql cuando nos encontramos con más de una tabla. Y cómo lo primero es lo primero…

¿Por qué es necesario separar la información en varias tablas? Lo mejor es verlo sobre un ejemplo práctico. Supongamos que queremos que otras personas contribuyan a nuestra base de datos de refranes. Para saber de quién es cada refrán deberíamos anotar también el autor y no estaría mal guardar también el email por si necesitamos ponernos en contacto con ellos.

Podríamos cambiar nuestra tabla, añadiéndole dos campos: autor e email, lo podemos hacer fácilmente con ALTER

Código:

ALTER TABLE refranero ADD COLUMN autor VARCHAR(80); ALTER TABLE refranero ADD COLUMN email VARCHAR(150);

La estructura después de los cambios nos quedaría así:

Page 5: Mostrar Una Imagen Desde Blob Mysql Usando PHP

Ahora podemos asignarle a cada refrán su autor con el email de contacto utilizando UPDATE.

Una vez actualizada, nos quedaría algo parecido a esto:

Estamos encantados, incluso podemos incluso hacernos una lista de autores con sus emails:

SELECT DISTINCT autor, email FROM refranero;

Page 6: Mostrar Una Imagen Desde Blob Mysql Usando PHP

Hasta ahora todo parece precioso, pero nos vamos a encontrar con una serie de problemas.

¿Qué ocurre si uno de los autores, por ejemplo pepe, cambia de email? Empezaría a enviar refranes utilizando su nueva dirección pero los refranes anteriores a esa fecha seguirían teniendo el antiguo email. Podrías llegar a pensar que se trata de dos personas distintas. Si se toma la molestia de informarte de que ha cambiado de email, podrías tratar de cambiarlos todos para que tuvieran el nuevo, pero con que se te despistara uno ya tendrías los datos incorrectos. Este tipo de problema se llama: anomalía de actualización.

Si por alguna razón decidieras borrar los refranes de pepe, perderías también su email, con lo que te quedarías sin datos de contacto, estarías perdiendo los datos de un colaborador, solo porque no te acaban de convencer sus refranes. Anomalía de borrado se llama esto.

También podría suceder que pepe un día ponga pepe, otro día ponga jose, al cabo de un tiempo ponga pepe pérez

Este tipo de problemas se arreglan en un periquete si separamos la información sobre los autores de la información sobre los refranes lo que nos lleva a la primera regla de oro de las bases de datos: Guardar las cosas por separado.

Lo que vamos a hacer es crear una tabla para nuestros autores por un lado, y por otro lado vamos a modificar nuestra tabla de refranes para incluir un campo que nos nos permita relacionar cada oveja con su pareja, perdón cada refrán con su autor.

Page 7: Mostrar Una Imagen Desde Blob Mysql Usando PHP

Ahora podemos ver dos tablas, en una hay varios refranes y en la otra la lista de autores. La columa autorID de la tabla refranero es la que establece la relación entre las dos tablas, indicando que pepe ha enviado los refranes, 5,3 y 6, Anita los refranes 7 y 8 y Juan el refrán número 2. Además como ahora cada autor consta una sola vez y de forma completamente independiente, hemos evitado todos los problemas que veíamos antes.

Lo importante es que como tenemos que guardar dos cosas distintas (autores y refranes) lo hemos hecho en tablas distintas. Cada tipo de dato que queremos guardar deberíamos guardarlo en su propia tabla.

Montarnos estas tablas a partir de lo que ya no tenemos, no es difícil, basta con seguir los siguientes pasos.

Primero nos creamos la tabla autores

Código:

CREATE TABLE autores (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,nombre VARCHAR(150),email VARCHAR(150),);

Page 8: Mostrar Una Imagen Desde Blob Mysql Usando PHP

En nuestra tabla refranero, primero nos libramos de los dos campos extra que creamos para añadir el autor y el email

Código:

ALTER TABLE refranero DROP COLUMN autor;ALTER TABLE refranero DROP COLUMN email;

Y luego le añadimos la columna id de autor que nos permitirá asignar un autor a cada refrán

Código:

ALTER TABLE refranero ADD COLUMN autorID INT;

Cómo trabajar con tablas múltiples Con los datos separados en dos tablas, lo de mostrar los datos puede parecernos algo más complicado. Cuando teníamos una sola tabla lo hacíamos con un código simple:

Código:

<?php

Page 9: Mostrar Una Imagen Desde Blob Mysql Usando PHP

// Seleccionamos todos los refranes de la base de datos$resultado = @mysql_query("SELECT * FROM refranero");

if (!$resultado) {echo ("<p> Me temo que te has colado en la query:" . mysql_error() . "</p>");exit();}

// mostramos todos los refraneswhile ($fila = mysql_fetch_array($resultado)) {echo ("<p>ID: " . $fila['ID'] . "<br />");echo ("Refrán: " . $fila['refran'] . "<br />");echo ("Fecha: " . $fila['fecha'] . "<br /></p>");

}?>

Ahora las cosas cambian un poco, vamos a necesitar hacer “joins” que te permiten tratar los datos almacenados en distintas tablas como si estuvieran en una sola. Son la gasolina que nos da la verdadera potencia de las bases de datos relacionales.

En nuestro caso las columnas que nos interesan son refrán, y fecha en la tabla refranero y autor e email en la tabla autores, la condición que necesitamos es que la columna aid de la tabla refranero, sea igual a la columna autorID de la tabla autores.

¿Cómo lo hacemos?

Código:

SELECT refran, fecha, autor, email FROM refranero, autores WHERE autorID = autores.ID;

Cómo en las dos tablas tenemos una columna ID, hemos especificado el nombre de la tabla a la que nos referimos con el término ID (autores.ID). Si no lo especificas, mysql no sabrá a cual de las columnas ID te refieres y te mostrará el siguiente error:

Page 10: Mostrar Una Imagen Desde Blob Mysql Usando PHP

Cita:

ERROR 1052: column ‘ID’ in where clause is ambiguous

Ahora que ya sabemos como extraer nuestros datos cuando los tenemos repartidos por varias tablas, vamos a reescribir nuestro código

Código:

<?php

// Seleccionamos todos los refranes de la base de datos$resultado = @mysql_query("SELECT refran, fecha, autor, email FROM refranero, autores WHERE autorID = autores.ID");

if (!$resultado) {echo ("<p> Me temo que te has colado en la query:" . mysql_error() . "</p>");exit();}

// mostramos todos los refraneswhile ($fila = mysql_fetch_array($resultado)) {echo ("<p>ID: " . $fila['ID'] . "<br />");echo ("Refrán: " . $fila['refran'] . "<br />");echo ("Fecha: " . $fila['fecha'] . "<br /></p>");echo ("Autor: " . $fila['autor'] . "<br /></p>");echo ("email: " . $fila['email'] . "<br /></p>");

}?>

Esta posibilidad de combinar los datos guardados en tablas distintas es el quid de la cuestión y a medida que vayáis practicando y familiarizándoos veréis lo realmente útil que es.

Veamos otro ejemplo, supongamos que queremos sacar sólo las queries que ha mandado pepe. En este caso nuestra query sría

Page 11: Mostrar Una Imagen Desde Blob Mysql Usando PHP

Código:

SELECT refran FROM refranero, autores WHERE nombre=”pepe” AND autorID = autores.ID

En este caso los resultados que vamos a obtener vienen todos de la tabla refranero pero utilizamos los datos de la tabla autores para saber exactamente cuales queremos mostrar.

Tipos de relaciones Los relaciones entre los datos repartidos en las diversas tablas pueden ser de varios tipos:

Relaciones uno a uno: para este tipo de relación basta con una sola tabla. Un ejemplo lo hemos visto en la tabla de autores. A cada Autor le corresponde un email y a cada email le corresponde un solo autor. Por tanto, no hace falta separar los datos y se pueden reflejar en una sola tabla.

Relaciones muchos a uno: es algo más complicada que la anterior pero ya la hemos visto también. Cada uno de nuestros refranes está asociada con un autor, en cambio cada autor puede estar asociado a varios refranes. Ya hemos visto la problemática de este tipo de soluciones. Separando los datos en dos tablas y usando una columna ID para guardar la relación, arreglamos los problemas.

Relaciones uno a muchos: este tipo de relación todavía no lo hemos visto así que vamos con un ejemplo. Hasta ahora hemos asumido que cada autor tiene una sola dirección de correo. Pero si quisiéramos que cada autor pudiera dar de alta varios emails, nos encontraríamos con una relación de este tipo: un autor puede tener muchos emails, pero cada email pertenece a un solo autor.

Mucha gente intenta abordar este tipo de relaciones intentando guardar varios valores en un solo campo:

Parece simple ¿eh? Pues intenta imaginar el código PHP que necesitarías para obtener un determinado email para un autor. Además tendrías que permitir valores muy largos para el campo email, lo que te llevaría a un

Page 12: Mostrar Una Imagen Desde Blob Mysql Usando PHP

gasto innecesario de disco duro ya que la mayoría de los autores sólo tendrían un email.

La solución para una relación uno a muchos es muy parecido a la que vimos para la relación muchos a uno. Simplemente hay que darle la vuelta. Hay que separar la tabla autores en dos tablas: autores e emails, y asociar el email con el autor utilizando una columna autorID en la tabla de emails

Con un simple select podríamos saber los emails que corresponden a un determinado autor:

Código:

SELECT email FROM autores, emails WHERE nombre=”pepe” AND autorID = autores.ID

Relaciones complejas (de muchos a muchos) Supongamos que nuestro refranero tiene mucho éxito y empieza a crecer tanto que empieza a ser difícil de manejar. Así que decides crear categorías para ordenar las cosas un poco.

Page 13: Mostrar Una Imagen Desde Blob Mysql Usando PHP

Cómo eres un alumno aplicado y recuerdas lo que acabamos de ver, identificas las categorías como una cosa distinta y les creas su propia tabla:

Código:

CREATE TABLE categorías (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,cat_nom VARCHAR(100),);

Ahora te toca asignar tus refranes a las distintas categorías y de repente te das cuenta de que cada refrán puede pertenecer a varias categorías, y además una categoría va a incluir varios refranes, estamos ante una relación de muchos a muchos.

La forma correcta de guardar este tipo de relaciones es utilizando una tabla intermedia. Es una tabla que no guarda datos, pero que se utiliza para definir relaciones entre los datos de otras tablas. Nos quedaría así:

Lo que hace nuestra tabla cat_refran es guardar en una columna el ID del refran y en la otra el ID que identifica a la categoría a la que pertenece. Una tabla de este tipo se crea igual que cualquier otra, la única diferencia está en la clave.

Hasta ahora siempre hemos utilizado el campo ID como campo clave primario. Asignar un campo clave

Page 14: Mostrar Una Imagen Desde Blob Mysql Usando PHP

primario a una columna lo que significa es que en ese campo no se pueden introducir datos duplicados, todos tienen que ser distintos,

En el caso de nuestra tabla intermedia, no vamos a utilizar una sola columna como clave. Cada ID de un refrán puede aparecer varias veces, ya que un refrán puede pertenecer a varias categorías. También los id de categoría pueden aparecer varias veces ya que una categoría puede tener asignados varios refranes. Lo que no queremos es que uno de estos pares pueda aparecer más de una vez. Así que vamos a crear una clave primaria que abarque las dos columnas.

Código:

CREATE TABLE tw_categ_refran  (RID INT NOT NULL ,CID INT NOT NULL ,PRIMARY KEY ( RID , CID ));

Ahora ya hemos creado una tabla intermedia con las dos columnas como clave primaria lo que además, mejorará las búsquedas.

Ahora que ya tenemos nuestra tabla intermedia y nuestra tabla de categorías rellenas, vamos a practicar algunas queries:

Vamos a recuperar todos los refranes asignados a la categoría animales:

Código:

SELECT refran FROM refranero, categorias, categ_refran WHERE cat = “animales” AND CID = categorias.ID AND RID = refranero.ID;

Page 15: Mostrar Una Imagen Desde Blob Mysql Usando PHP

Vamos a listar todos las categorías que contengan refranes que empiecen por “A”.

Código:

SELECT cat FROM refranero, categorias, categ_refran WHERE refran LIKE “A%” AND CID = categorias.ID AND RID = refranero.ID;

Vamos a hacer una query que utiliza también la tabla de autores, así que esta vez nos vamos enfrentar con 4 tablas: vamos a obtener una lista de los autores que han enviado algún refrán a la categoría autores

Código:

SELECT autor FROM refranero,autores, categorias, categ_refran WHERE cat= ”animales”AND CID = categorias.ID AND RID = refranero.IDAND autorID = autores.ID;

En este tema hemos hecho sólo una pequeña introducción sobre como trabajar con bases de datos. Para una visión más profunda, consultad el manual de amanda de introducción a las bases de datos.

Page 16: Mostrar Una Imagen Desde Blob Mysql Usando PHP

Obtener id después de insertar un registro en Mysql[PHP]

En ocasiones tenemos que recuperar el id de un registro que acabamos de insertar en la base de datos(MySQL), pensaríamos que deberíamos hacer una consulta adicional para obtenerlo, pero en php sencillamente utilizamos la función "mysql_insert_id()"

Ejemplo:

Texto plano copy to clipboard Imprimir ?

1. <?php 2. $link = mysql_connect('localhost', 'usuario', 'contrasena');

3. if (!$link) {

4. die('Imposible conectar: ' . mysql_error());

5. }

6. mysql_select_db('tabla');

7.

8. mysql_query("INSERT INTO tabla (nombre) values ('hugo')");

9. echo "El id del ultimo registro es: ".mysql_insert_id();

10. ?>

Page 17: Mostrar Una Imagen Desde Blob Mysql Usando PHP

PHP y JavaScript Unos de las principales confusiones de quienes se inician en la programación en PHP es no distinguir el ámbito de ejecución de los distintos elementos de una página dinámica. Hay que tener claro que PHP se ejecuta en el servidor generando un código HTML que le envía al cliente. El código JavaScript siempre se ejecuta en la máquina cliente. Aclarado este importante punto pasamos a ver cómo podemos relacionar y coordinar la ejecución de ambos lenguajes integrados en una página dinámica.

Pasar una variable JavaScript a PHP

Para pasar una variable de JavaScript a PHP de alguna forma tendremos que enviarla al servidor que es donde se ejecuta realmente PHP. Una forma que evita tener que realizar acciones por parte del usuario es utilizar un formulario:

<?

echo "<html><head>

<script language=Javascript>

var vjava='valor de vjava';

</script>

</head>

Page 18: Mostrar Una Imagen Desde Blob Mysql Usando PHP

<body>";

if (empty($varphp))

{

echo "<form action=$PHP_SELF method=POST name=formulario>";

echo "<input type=hidden name=varphp>";

echo "</form>";

echo "<script language=Javascript>document.formulario.varphp.value=vjava;";

echo "document.formulario.submit() ";

echo "</script>";

}

else

echo "--- varphp=$varphp ----";

echo "</body></html>";

?>

Averiguar la resolución del cliente

Basándonos en el ejemplo anterior podemos pasar a PHP cualquier propiedad del cliente que sea accesible desde JavaScript. Ahora, como ejemplo vemos como determinar la resolución de pantalla que usa el cliente:

<?

echo "<html><head>

<script language=Javascript>

var ancho=screen.width;

var alto=screen.height;

</script>

Page 19: Mostrar Una Imagen Desde Blob Mysql Usando PHP

</head>

<body>";

if (empty($altophp))

{

echo "<form action=$PHP_SELF method=POST name=formulario>";

echo "<input type=hidden name=anchophp>";

echo "<input type=hidden name=altophp>";

echo "</form>";

echo "<script language=Javascript>

 document.formulario.anchophp.value=ancho;

 document.formulario.altophp.value=alto;";

echo "document.formulario.submit() ";

echo "</script>";

}

else

echo "--- ancho=$anchophp ----<br>--- alto=$altophp ----";

echo "</body></html>";

?>

Averiguar el tamaño de la ventana

Con una ligera modificación podemos determinar el tamaño de la ventana que está utilizando el cliente. Esto puede ser útil para ajustar ciertos parámetros como ancho de tablas u otros a la ventana que se esté utilizando.

<?

echo "<html><head>

Page 20: Mostrar Una Imagen Desde Blob Mysql Usando PHP

<script language=Javascript>

if (parseInt(navigator.appVersion)>3)

{

  if (navigator.appName=='Netscape')

 {

    alto = window.innerWidth;

    ancho = window.innerHeight;

  }

  if (navigator.appName.indexOf('Microsoft')!=-1)

 {

    alto = document.body.offsetWidth;

    ancho = document.body.offsetHeight;

  }

}

</script>

</head>

<body>";

if (empty($altophp))

{

echo "<form action=$PHP_SELF method=POST name=formulario>";

echo "<input type=hidden name=anchophp>";

echo "<input type=hidden name=altophp>";

echo "</form>";

Page 21: Mostrar Una Imagen Desde Blob Mysql Usando PHP

echo "<script language=Javascript>

 document.formulario.anchophp.value=ancho;

 document.formulario.altophp.value=alto;";

echo "document.formulario.submit() ";

echo "</script>";

}

else

echo "--- ancho=$anchophp ----<br>--- alto=$altophp ----";

echo "</body></html>";

?>

Abrir una ventana nueva con valores en PHP

Ahora veremos una serie de ejemplos en los cuales se genera código JavaScript a partir del contenido de variables en PHP. En primer lugar un ejemplo simple que abre una ventana nueva con la posibilidad de controlar todos sus parámetros:

<?

echo "<html><head><body>";

$pag[0]="sesion-01.php";

$pag[1]="nombre";

$pag[2]="toolbar=no";

$pag[3]="location=no";

$pag[4]="directories=no";

$pag[5]="status=no";

$pag[6]="menubar=no";

$pag[7]="scrollbars=no";

Page 22: Mostrar Una Imagen Desde Blob Mysql Usando PHP

$pag[8]=" resizable=no";

$pag[9]="width=150";

$pag[10]="height=150";

echo "<script language=Javascript>";

echo "ventana=open('$pag[0]','$pag[1]',' $pag[0],$pag[1],$pag[2],$pag[3],$pag[4],$pag[5],$pag[6],$pag[7],$pag[8]','$pag[9]',' $pag[10]')";

echo "</script>";

echo "</body></html>";

?>

Pasar una variable de PHP a JavaScript Es sencillo, simplemente es hacer la asignación respetando la sintaxis de JavaScript. El siguiente ejemplo lo ilustra de una forma sencilla:

<?php echo '<head> <title>'.$_SERVER[PHP_SELF].'</title> </head> <html> <body>';$variable_php="variable en php";echo '<script languaje="JavaScript"> var varjs="'.$variable_php.'"; alert(varjs); </script>';echo "<a href=$_SERVER[PHP_SELF]>Recargar la Página</a>"; echo '</body> </html>';?>

Page 23: Mostrar Una Imagen Desde Blob Mysql Usando PHP