Está en la página 1de 24

Mostrar una imagen desde blob mysql usando PHP

Por braulio | 19 enero 2005 | 247 Comentarios Basndonos el artculo anterior de como guardar una imagen y su miniatura a un campo BLOB de mysql, ahora veremos como poder recuperar y mostrar esas imgenes. 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 imgenes 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 parmetros al script para indicarle el id de la imagen que queremos ver, y tambin 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" />

Donde el parmetro 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: // Parmetros para recuperar la imagen # Recuperamos el parmetro GET con el id nico de la foto que queremos mostrar $idfoto = (isset($_GET["idfoto"])) ? $_GET["idfoto"] : exit(); # Recuperamos el parmetro GET para elegir entre la miniatura o la foto real $tam = (isset($_GET["tam"])) ? $_GET["tam"] : 1; // Escojemos la foto real o la miniatura segn la variable $tam switch($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"; # Conexin 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 blob header("Content-Type: $mime");

// Muestra la imagen echo $imagen;

Trabajar con ms 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 >

""
Introduccin 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 cmo se trabaja con php y mysql cuando nos encontramos con ms de una tabla. Y cmo lo primero es lo primero Por qu es necesario separar la informacin en varias tablas? Lo mejor es verlo sobre un ejemplo prctico. Supongamos que queremos que otras personas contribuyan a nuestra base de datos de refranes. Para saber de quin es cada refrn deberamos anotar tambin el autor y no estara mal guardar tambin el email por si necesitamos ponernos en contacto con ellos. Podramos cambiar nuestra tabla, aadindole dos campos: autor e email, lo podemos hacer fcilmente con ALTER

Cdigo:

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

La estructura despus de los cambios nos quedara as:

Ahora podemos asignarle a cada refrn su autor con el email de contacto utilizando UPDATE. Una vez actualizada, nos quedara algo parecido a esto:

Estamos encantados, incluso podemos incluso hacernos una lista de autores con sus emails: SELECT DISTINCT autor, email FROM refranero;

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? Empezara a enviar refranes utilizando su nueva direccin pero los refranes anteriores a esa fecha seguiran teniendo el antiguo email. Podras llegar a pensar que se trata de dos personas distintas. Si se toma la molestia de informarte de que ha cambiado de email, podras tratar de cambiarlos todos para que tuvieran el nuevo, pero con que se te despistara uno ya tendras los datos incorrectos. Este tipo de problema se llama: anomala de actualizacin. Si por alguna razn decidieras borrar los refranes de pepe, perderas tambin su email, con lo que te quedaras sin datos de contacto, estaras perdiendo los datos de un colaborador, solo porque no te acaban de convencer sus refranes. Anomala de borrado se llama esto. Tambin podra suceder que pepe un da ponga pepe, otro da ponga jose, al cabo de un tiempo ponga pepe prez

Este tipo de problemas se arreglan en un periquete si separamos la informacin sobre los autores de la informacin 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, perdn cada refrn con su autor.

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 relacin entre las dos tablas, indicando que pepe ha enviado los refranes, 5,3 y 6, Anita los refranes 7 y 8 y Juan el refrn nmero 2. Adems como ahora cada autor consta una sola vez y de forma completamente independiente, hemos evitado todos los problemas que veamos 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 deberamos guardarlo en su propia tabla. Montarnos estas tablas a partir de lo que ya no tenemos, no es difcil, basta con seguir los siguientes pasos. Primero nos creamos la tabla autores

Cdigo:

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

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

Cdigo:

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

Y luego le aadimos la columna id de autor que nos permitir asignar un autor a cada refrn

Cdigo:

ALTER TABLE refranero ADD COLUMN autorID INT;

Cmo trabajar con tablas mltiples Con los datos separados en dos tablas, lo de mostrar los datos puede parecernos algo ms complicado. Cuando tenamos una sola tabla lo hacamos con un cdigo simple:

Cdigo:

<?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 refranes while ($fila = mysql_fetch_array($resultado)) { echo ("<p>ID: " . $fila['ID'] . "<br />"); echo ("Refrn: " . $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 refrn, y fecha en la tabla refranero y autor e email en la tabla autores, la condicin que necesitamos es que la columna aid de la tabla refranero, sea igual a la columna autorID de la tabla autores. Cmo lo hacemos?

Cdigo:

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

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

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 cdigo

Cdigo:

<?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 refranes while ($fila = mysql_fetch_array($resultado)) { echo ("<p>ID: " . $fila['ID'] . "<br />"); echo ("Refrn: " . $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 cuestin y a medida que vayis practicando y familiarizndoos veris lo realmente til que es. Veamos otro ejemplo, supongamos que queremos sacar slo las queries que ha mandado pepe. En este caso nuestra query sra

Cdigo:

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 relacin 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 ms complicada que la anterior pero ya la hemos visto tambin. Cada uno de nuestros refranes est asociada con un autor, en cambio cada autor puede estar asociado a varios refranes. Ya hemos visto la problemtica de este tipo de soluciones. Separando los datos en dos tablas y usando una columna ID para guardar la relacin, arreglamos los problemas. Relaciones uno a muchos: este tipo de relacin todava no lo hemos visto as que vamos con un ejemplo. Hasta ahora hemos asumido que cada autor tiene una sola direccin de correo. Pero si quisiramos que cada autor pudiera dar de alta varios emails, nos encontraramos con una relacin 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 cdigo PHP que necesitaras para obtener un determinado email para un autor. Adems tendras que permitir valores muy largos para el campo email, lo que te llevara a un gasto innecesario de disco duro ya que la mayora de los autores slo tendran un email. La solucin para una relacin uno a muchos es muy parecido a la que vimos para la relacin 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 podramos saber los emails que corresponden a un determinado autor:

Cdigo:

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 difcil de manejar. As que decides crear categoras para ordenar las cosas un poco. Cmo eres un alumno aplicado y recuerdas lo que acabamos de ver, identificas las categoras como una cosa distinta y les creas su propia tabla:

Cdigo:

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

Ahora te toca asignar tus refranes a las distintas categoras y de repente te das cuenta de que cada refrn puede pertenecer a varias categoras, y adems una categora va a incluir varios refranes, estamos ante una relacin 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 quedara 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 categora 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 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 refrn puede aparecer varias veces, ya que un refrn puede pertenecer a varias categoras. Tambin los id de categora pueden aparecer varias veces ya que una categora puede tener asignados varios refranes. Lo que no queremos es que uno de estos pares pueda aparecer ms de una vez. As que vamos a crear una clave primaria que abarque las dos columnas.

Cdigo:

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 adems, mejorar las bsquedas. Ahora que ya tenemos nuestra tabla intermedia y nuestra tabla de categoras rellenas, vamos a practicar algunas queries: Vamos a recuperar todos los refranes asignados a la categora animales:

Cdigo:

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

Vamos a listar todos las categoras que contengan refranes que empiecen por A.

Cdigo:

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 tambin 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 algn refrn a la categora autores

Cdigo:

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

En este tema hemos hecho slo una pequea introduccin sobre como trabajar con bases de datos. Para una visin ms profunda, consultad el manual de amanda de introduccin a las bases de datos.

Obtener id despus 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), pensaramos que deberamos hacer una consulta adicional para obtenerlo, pero en php sencillamente utilizamos la funcin "mysql_insert_id()"

Ejemplo: Texto planocopy to clipboardImprimir? 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.?>

PHP y JavaScript
Unos de las principales confusiones de quienes se inician en la programacin en PHP es no distinguir el mbito de ejecucin de los distintos elementos de una pgina dinmica. Hay que tener claro que PHP se ejecuta en el servidor generando un cdigo HTML que le enva

al cliente. El cdigo JavaScript siempre se ejecuta en la mquina cliente. Aclarado este importante punto pasamos a ver cmo podemos relacionar y coordinar la ejecucin de ambos lenguajes integrados en una pgina dinmica.

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> <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 resolucin del cliente


Basndonos en el ejemplo anterior podemos pasar a PHP cualquier propiedad del cliente que sea accesible desde JavaScript. Ahora, como ejemplo vemos como determinar la resolucin de pantalla que usa el cliente: <? echo "<html><head> <script language=Javascript> var ancho=screen.width; var alto=screen.height; </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>"; 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 tamao de la ventana


Con una ligera modificacin podemos determinar el tamao de la ventana que est utilizando el cliente. Esto puede ser til para ajustar ciertos parmetros como ancho de tablas u otros a la ventana que se est utilizando. <? echo "<html><head> <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>"; 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 cdigo 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 parmetros: <? 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"; $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 asignacin 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 Pgina</a>"; echo '</body> </html>'; ?>

También podría gustarte