Problemas PHP! ¿Base de datos con imágenes?

Buenas, estoy haciendo una Web para una inmobiliaria, con una base de datos con texto y imágenes la cosa, es que tengo ya funcionando la subida de datos mediante un formulario con imágenes en blob. Pero el problema viene al hacer la búsqueda mediante unos formularios en esa base de datos. para cuando el usuario entre en la Web, seleccione lo que esta buscando y le salga el resultado junto con la imagen. Ya que por una parte el resultado de texto sale, pero la imagen no se como ponerla.. movidas... bueno ahí voy
El codigo que he usado para esto, es el siguiente

Por una parte el html para subir los datos junto a la imagen a la base de datos

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Imagen a Blob</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form name="frmimage" id="frmimage" method="post"
   enctype="multipart/form-data" action="junto.php">
   <p>Datos</p>
   <p>Seleccione marca:
      <select name ="marca">
        <option value="seat">Seat</option>
        <option value="audi">Audi</option>
            </select>
          </p>
   <p>Indica color:
      <select name ="color">
        <option value="rojo">rojo</option>
        <option value="verde">verde</option>
      </select>
    </p>
   <p>
   Nombre:
     <input type="text" id="nombre" name="nombre" />
     <br />
   Imagen:
   <input type="file" id="foto" name="foto" />
   <br />
   <input type="submit" name="enviar" id="enviar" value="Guardar" />
        </p>
</form>
</body>


Y por otro lado el php para subir los datos junto a la imagen a la base de datos

<?php
$marca = $_POST['marca'];
$color = $_POST['color'];
// Verificamos que el formulario no ha sido enviado aun
$postback = (isset($_POST["enviar"])) ? true : false;
if($postback){
  // Nivel de errores
  error_reporting(E_ALL);
  // Constantes
  # Altura de el thumbnail en píxeles
  define("ALTURA", 100);
  # Nombre del archivo temporal del thumbnail
  define("NAMETHUMB", "/tmp/thumbtemp"); //Esto en servidores Linux, en Windows podría ser:
// define("NAMETHUMB", "c:/windows/temp/thumbtemp"); y te olvidas de los problemas de permisos
  # Servidor de base de datos
  define("DBHOST", "localhost");
  # nombre de la base de datos
  define("DBNAME", "nombre");
  # Usuario de base de datos
  define("DBUSER", "user");
  # Password de base de datos
  define("DBPASSWORD", "password");
  // Mime types permitidos
  $mimetypes = array("image/jpeg", "image/pjpeg", "image/gif", "image/png");
  // Variables de la foto
  $name = $_FILES["foto"]["name"];
  $type = $_FILES["foto"]["type"];
  $tmp_name = $_FILES["foto"]["tmp_name"];
  $size = $_FILES["foto"]["size"];
  // Verificamos si el archivo es una imagen válida
  if(!in_array($type, $mimetypes))
    die("El archivo que subiste no es una imagen válida");
  // Creando el thumbnail
  switch($type) {
    case $mimetypes[0]:
    case $mimetypes[1]:
      $img = imagecreatefromjpeg($tmp_name);
      break;
    case $mimetypes[2]:
      $img = imagecreatefromgif($tmp_name);
      break;
    case $mimetypes[3]:
      $img = imagecreatefrompng($tmp_name);
      break;
  }
  $datos = getimagesize($tmp_name);
  $ratio = ($datos[1]/ALTURA);
  $ancho = round($datos[0]/$ratio);
  $thumb = imagecreatetruecolor($ancho, ALTURA);
  imagecopyresized($thumb, $img, 0, 0, 0, 0, $ancho, ALTURA, $datos[0], $datos[1]);
  switch($type) {
    case $mimetypes[0]:
    case $mimetypes[1]:
      imagejpeg($thumb, NAMETHUMB);
     break;
    case $mimetypes[2]:
      imagegif($thumb, NAMETHUMB);
      break;
    case $mimetypes[3]:
      imagepng($thumb, NAMETHUMB);
      break;
  }
  // Extrae los contenidos de las fotos
  # contenido de la foto original
  $fp = fopen($tmp_name, "rb");
  $tfoto = fread($fp, filesize($tmp_name));
  $tfoto = addslashes($tfoto);
  fclose($fp);
  # contenido del thumbnail
  $fp = fopen(NAMETHUMB, "rb");
  $tthumb = fread($fp, filesize(NAMETHUMB));
  $tthumb = addslashes($tthumb);
  fclose($fp);
  // Borra archivos temporales si es que existen
  @unlink($tmp_name);
  @unlink(NAMETHUMB);
  // Guardamos todo en la base de datos
  #nombre de la foto
  $nombre = $_POST["nombre"];
  $link = mysql_connect(DBHOST, DBUSER, DBPASSWORD) or die(mysql_error($link));;
  mysql_select_db(DBNAME, $link) or die(mysql_error($link));
  $sql = "INSERT INTO coches(marca, color, nombre, foto, thumb, mime )
    VALUES
    ('$marca', '$color', '$nombre', '$tfoto', '$tthumb', '$type' )";
  mysql_query($sql, $link) or die(mysql_error($link));
  echo "Datos Guardados";
  exit();
}
?>


Bueno, esto añade a mi base de datos 6 campos entre ellos, una imagen en blob, dentro de la base de datos.
Hasta aquí todo bien (no hacer caso de los datos de las tablas ya que estoy de pruebas).

Y ahora viene el problema

Antes tenia el siguiente código, para buscar los campos de texto.

El html

<head>
<title>Base de datos consulta</title>
<head>
<body bgcolor = "#303030">
<body text ="#E5E5E5">
<font face ="tahoma">
<font size = "2">
<body link = "#E5E5E5" vlink="E0E0E0">
<p aling ="center">
<form name="form" action= "buscacoches.php"
method="post">
<strong>
<h2>
FORMULARIO PARA BUSQUEDA
</h2>
</strong>
<hr size = "8" color ="ffffff" width ="100%" aling ="left">
<h5>Seleccione la marca de su vehiculo:
<select name="marca">
<option value="seat">Seat</option>
<option value="audi">Audi</option>
</select>
</h5>
<h5>Seleccione color:
<select name="color">
<option value="rojo">Rojo</option>
<option value="amarillo">Amarillo </option>
<option value="verde">verde</option>
<option value="azul">Azul </option>
<option value="negro">Negro </option>
<option value="blanco">Blanco </option>
<option value="gris">Gris </option>
</select>
</h5>
<input name="Enviar" type="submit" value="Enviar">
</h5>
</form>


y el php

<head>
<title>Base de datos consulta</title>
<head>
<body bgcolor = "#303030">
<body text ="#E5E5E5">
<font face ="tahoma">
<font size = "2">
<body link = "#E5E5E5" vlink="E0E0E0">
<p aling ="center">
<h2>
RESULTADO DE LA BUSQUEDA
</h2>
<?
$marca = $_POST['marca'];
$color = $_POST['color'];
$host="localhost";
$user="usuario";
$password="password";
$db="datos";
$link = mysql_connect($host,$user,$password);
mysql_select_db($db,$link);
$consulta = mysql_query("SELECT * FROM coches WHERE marca LIKE '$marca' or color LIKE '$color' ",$link);
while ($row=mysql_fetch_array($consulta))
{
$id=$row["id"];
$marca=$row["marca"];
$color=$row["color"];
echo ("<table   width='100%'   border='0'   cellspacing='0'
cellpadding='0'>\n");
echo ("<td>\n");
echo ("<td width='12%'><a href=coches.php?id=$id>
Modificar</a></td>\n");
echo("<td  width='12%'><a href=borracoche.php?id=$id>
Borrar</a></td>\n");
echo ("<td width=26%'><a href=coches.php?id=$id>$marca</a></td>\n");
echo ("<td width=26%'>$color</a></td>\n");
echo ("<td width=26%'>$id</a></td>\n");
echo("</tr>\n");
echo("</table>\n");
echo "<hr size = 2 color =ffffff width = 100% aling = left>"; }
?>
<a href="http://web">Volver

Pero al código primero que le he añadido el trozo de código para guardar las imágenes en blob, no tengo ni idea de donde poner el trozo de código para que usando la búsqueda me muestre la imagen..

Aquí aparte pongo el código para mostrar las imágenes en blob, (imágenes dentro de la base de datos)

El php

/ Nivel de errores
   error_reporting(E_ALL);

   // Constantes
   # Servidor de base de datos
   define("DBHOST", "localhost");
   # nombre de la base de datos
   define("DBNAME", "basedatos"
   # Usuario de base de datos
   define("DBUSER", "usuario);
   # Password de base de datos
   define("DBPASSWORD", "password");
   
   // 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 $tam
   switch($tam) {
      case "1":
         $campo = "foto";break;;
      case "2":
         $campo = "thumb";break;;
      default:
         $campo = "foto";break;;
   }
   
   // 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 blob
   header("Content-Type: $mime");
   // Muestra la imagen
   echo $imagen;   
?>


y aquí el html que te muestra la imagen

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



Con este ultimo ejemplo es mostrar la imagen de la base de datos, yo lo que busco es hacer la base de datos donde cuando hagas la búsqueda te salgan los datos junto con la imagen.

A mi me funciona, por un lado busca los datos, y por otro la imagen pero la gente no busca la imagen, busca los datos y luego al lado de ese dato sale la imagen...

Joder movida...

Y con mi poca experiencia en php vamos bien servidos

Perdón por el tochaco [mad] ... si hay alguna manera más fácil de hacer esto.. es que no la he encontrado, subir los datos a la base de con imágenes mediante un formulario y luego que la gente pueda buscar con otro formulario los datos de esa base de datos y que los datos lleven su imagen.

Un Saludo! [angelito]
Y cual es el problema? Por qué no creas una etiqueta img como la que pones en último lugar dentro de cada iteración del bucle? O, si cada elemento puede tener más de una foto, crea un método que te devuelva tantas etiquetas img como fotos tengas asociadas al id del elemento.

Si no quieres tener que consultar a la BD foto por foto, lo más lógico es que hagas una precarga y almacenes los datos en campos ocultos o en variables de sesión, y leas estas desde tu "verblob.php".
El problema que tengo es, que se como introducir los datos en la tabla, con las imágenes, pero no se como hacer para que luego se muestren.. Y no conozco ningún método para hacerlo.

Un código, mete los datos con las imágenes, en blob.
El otro sirve para hacer la búsqueda mediante formularios
Y el otro te muestra la imagen de esa tabla.

Lo que no se hacer es mezclar esos dos códigos, para que la búsqueda me muestre las imágenes en conjunto con los datos, no se que hay que poner.. es que es la mezcla de dos ejemplos...

Gracias por responder!
Imagino que tendrás la ruta de la imagen en tu servidor almacenada en la base de datos, sólo sácala mediante una consulta en SQL y ya la tienes, y después como te han dicho arriba con una etiqueta IMG la muestras
(mensaje borrado)
Lo mejor que puedes hacer es NO guardar las imagenes en la base de datos, guarda la ruta del fichero, y la imagen la guardas en una carpeta dentro del servidor, pero nunca en la bbdd, sino la base de datos se haria insoportable cuando tenga cierto tamaño.

saludos


PD: has posteado el mismo problema en foros del web? por que ahi ya contestaron lo mismo...
sn00b escribió:Imagino que tendrás la ruta de la imagen en tu servidor almacenada en la base de datos, sólo sácala mediante una consulta en SQL y ya la tienes, y después como te han dicho arriba con una etiqueta IMG la muestras

Es que las guarda en la propia base de datos, en un campo BLOB.

DooBie escribió:Lo mejor que puedes hacer es NO guardar las imagenes en la base de datos, guarda la ruta del fichero, y la imagen la guardas en una carpeta dentro del servidor, pero nunca en la bbdd, sino la base de datos se haria insoportable cuando tenga cierto tamaño.

saludos


PD: has posteado el mismo problema en foros del web? por que ahi ya contestaron lo mismo...

Yo opino igual, sube las imágenes al servidor y no las guardes en la base de datos. Simplemente tienes que guardar en la base de datos la url en la que queda almacenada la imágen en un campo junto al resto de datos.

Guardar código dentro de la propia BBDD en algunos casos es muy útil, pero en otros como este puede ser algo malo a la larga, sobre todo cuando la base de datos ocupe un par de gigas a costa de tener todas las imágenes dentro y sacar la copia sea un infierno.
6 respuestas