Foros del Web » Programando para Internet » PHP »

Subir varias imagenes en un mismo formulario..

Estas en el tema de Subir varias imagenes en un mismo formulario.. en el foro de PHP en Foros del Web. Hola: Tengo este caso. Se trata de una constructora que pretende mostrar en la pagina, fotos del progreso de la obra, dia por dia. La ...
  #1 (permalink)  
Antiguo 29/08/2004, 19:52
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 22 años
Puntos: 0
Subir varias imagenes en un mismo formulario..

Hola:

Tengo este caso.

Se trata de una constructora que pretende mostrar en la pagina, fotos del progreso de la obra, dia por dia.
La idea es tener los links de las fechas (25.08.2004, 26.08.2004, 27.08.204, etc) y que, al pisar en una fecha, se muestren las fotos de ese dia.

Lo que no se es como subir las fotos pues, para cada dia se van a subir 4 fotos.

La base de datos se llama "principal" y la tabla "dates".

Inicialmente coloque estos campos: id, date, archivo_binario, archivo_nombre, archivo_peso, archivo_tipo

(utilizo el codigo de este mismo foro para subir imagenes a la base de datos tipo blob y tambien el codigo que genera las miniaturas, ambos sacados del FAQ)

Lei por alli que debo crear tantos campos de imagen en la tabla como imagenes desee subir, pero al querer mostrarlas, no me muestra nada (supongo que porque todas tienen el mismo id)

Aqui los codigos que uso:

El formulario...

Código PHP:
<? 
if (isset($_GET['proceso'])){ 
echo 
$_GET['proceso']."<br>"

?>

<FORM enctype="multipart/form-data" method="post" action="insert_images.php">
<table width="375">
<tr>
<td width="71"><div align="left" class="normal">Date:</div></td>
<td width="292"><div align="left">
<input name="date" type="text" id="date" size="33" align="left">
</div></td>
</tr>
<tr>
<td><div align="left" class="normal">Image:</div></td>
<td><div align="left">
<input name="archivo" type="file" id="archivo" size="33" align="left">
</div></td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2"><div align="center">
<input type="submit" name="submit" value="Insert">
</div></td>
</tr>
</table>
</form>

El Insertar...

Código PHP:
<?php 
//Primero, arranca el bloque PHP y checkea si el archivo tiene nombre.  Si no fue asi, te remite de nuevo al formulario de inserción: 
// No se comprueba aqui si se ha subido correctamente. 
if (empty($_FILES['archivo']['name'])){ 
header("location: form_images.php?proceso=falta_indicar_fichero"); //o como se llame el formulario .. 
exit; 


//establece una conexión con la base de datos. 
$conexion mysql_connect("localhost","entre2_admin","123456") or die("No se pudo realizar la conexion con el servidor."); 
mysql_select_db("entre2_principal",$conexion) or die("No se puede seleccionar BD"); // tu_bd es el nombre de la Base de datos .. por siaca. 

// archivo temporal (ruta y nombre). 
$binario_nombre_temporal=$_FILES['archivo']['tmp_name']; 

// leer del archvio temporal .. el binario subido. 
// "rb" para Windows .. Linux parece q con "r" sobra ... 
$binario_contenido addslashes(fread(fopen($binario_nombre_temporal"rb"), filesize($binario_nombre_temporal))); 

// Obtener del array FILES (superglobal) los datos del binario .. nombre, tabamo y tipo. 
$binario_nombre=$_FILES['archivo']['name']; 
$binario_peso=$_FILES['archivo']['size']; 
$binario_tipo=$_FILES['archivo']['type']; 

//insertamos los datos en la BD. 
$consulta_insertar "INSERT INTO dates (id, date, archivo_binario, archivo_nombre, archivo_peso, archivo_tipo) VALUES ('', '$date', '$binario_contenido', '$binario_nombre', '$binario_peso', '$binario_tipo')"
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos."); 
header("location: build_progress.php");  // si ha ido todo bien 
exit; 
?>

El Miniaturas (thumbnails)...

Código PHP:
<?php  

if(isset($_GET['id'])) { 

    
$conexion=mysql_connect("localhost","entre2_admin","123456") or die ("no se ha podido conectar a la BD"); 
    
mysql_select_db("entre2_principal") or die ("no se ha podido seleccionar la BD"); 
    
$sql "SELECT archivo_binario,archivo_tipo,archivo_nombre FROM dates WHERE id='".$_GET['id']."'"
    
$consulta mysql_query($sql,$conexion); 
    
$imagen mysql_result($consulta,0,"archivo_binario");
    
$type mysql_result($consulta,0,"archivo_tipo"); 

    
// Envio cabeceras al navegador 
    
Header ("Content-type: $type"); 

    
// Generar el thumbnail: 

    // Se crea la imagen desde el campo binario de la BD 
    
$img imagecreatefromstring($imagen); 

    
// Tamaño del Thumbnail 
    
$picsize 200
     
    
// Se obtienen los datos del ancho y alto de la imagen. 
    
$new_w imagesx($img); 
    
$new_h imagesy($img); 

    
// Se calcula la relación alto/ancho 
    
$aspect_ratio $new_h $new_w
     
    
// Se ajusta al nuevo tamaño 
    
$new_w $picsize
    
$new_h abs($new_w $aspect_ratio); 

    
// Se crea la mascara de la imagen nueva 
    
$dst_img ImageCreateTrueColor($new_w,$new_h); 

    
// Se copia y reajusta el nuevo tamaño en la nueva imagen. 
     
imagecopyresampled($dst_img,$img,0,0,0,0,$new_w,$new_h,imagesx($img),imagesy($img)); 

    
// Se entrega al buffer de salida (navegador en este caso) la imagen en formato JPEG 
    // El tercer parámetro (100) indica la calidad de la imagen: en porcentaje relación calidad/peso imagen. 
    
imagejpeg($dst_img,'',100); 


?>

Y el Mostrar...

Código PHP:
<? 
$conexion 
mysql_connect("localhost","entre2_admin","123456") or die("No se pudo realizar la conexion con el servidor."); 
mysql_select_db("entre2_principal",$conexion) or die("No se puede seleccionar BD");

//inicializo el criterio y recibo cualquier cadena que se desee buscar 
$criterio ""
$txt_criterio "";
if (isset(
$Buscacriterio)){
 
$txt_criterio=$Buscacriterio;
 
$criterio " where date like '%" $txt_criterio "%'"
}
   
$sql="SELECT * FROM entre2_principal.dates".$criterio
$result2=mysql_query($sql);
 
echo 
"<table align=center border=0 cellpadding=0 width=400>"

$columnes 2// N&uacute;mero de columnas (variable)  
if (mysql_num_rows($result2)==0){echo "<tr><td colspan=$columnes>There are not images.</td></tr> ";} 

for (
$i=1$row mysql_fetch_array ($result2); $i++) { 
$resto = ($i $columnes); # N&uacute;mero de celda del <tr> en que nos encontramos 
if ($resto == 1) {echo "<tr>";} # Si es la primera celda, abrimos <tr> 
    
echo "<td class=mini><div align=center><img src=\"mini_images.php?id=$row[id]\" border='0'></a><br>";
    echo 
"".$row[descripcion]."</div><br>"
if (
$resto == 0) {echo "</tr>";} # Si es la &uacute;ltima celda, cerramos </tr> 

if (
$resto <> 0) { # Si el resultado no es m&uacute;ltiple de $columnes acabamos de rellenar los huecos 
$ajust $columnes $resto# N&uacute;mero de huecos necesarios 
for ($j 0$j $ajust$j++) {echo "<td>&nbsp;</td>";} 
echo 
"</tr>"# Cerramos la &uacute;ltima l&iacute;nea </tr> 

echo 
"</table>"
mysql_free_result($result2)
?>

Pongo los codigos (han sido modificados un poco de los originales de este foro) para apreciar en su totalidad los procesos que uso.

Asi me funcion perfecto, pero, la persona que tenga la tarea de insertar los registros todos los dias, se encontrara con que debe copiar la fecha en el formulario e insertar una imagen de su disco duro, hacer click en submit y luego repetir esa operacion tantas veces como imagenes desee subir.

Pensando en este trabajo no seria tan duro, pero si me toca ampliar y los registros a insertar ya no son solo el campo "date" sino unos 10 mas (direccion, telefono, nombre, edad, etc), entonces tocaria copiar todos tantas veces como imagenes a subir?

Creo esta bastante claro el problema.. Alguien puede colaborarme?

Gracias
  #2 (permalink)  
Antiguo 30/08/2004, 11:48
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Cita:
Pensando en este trabajo no seria tan duro, pero si me toca ampliar y los registros a insertar ya no son solo el campo "date" sino unos 10 mas (direccion, telefono, nombre, edad, etc), entonces tocaria copiar todos tantas veces como imagenes a subir?
Bueno, es que hay un tema por médio que se denomina "normalización" ... Es decir .. tu creas en una tabla X tus registros .. esas "obras" como tal (la dirección .. fechas de inicio, fin .. y otras propiedades). A esa tabla X le relacionas las imagenes que tendrás en otra tabla Y por algún campo de la tabla X (cláve foránea) .. (normalmente ese ID de la tabla X).

Así creas de 0 a N imagenes por "obra" y lo demás es hacer consultas SQL para ver tu "obra" y de ahí crear tus formularios de "ingresar más imagenes" o ver las que hay hasta la fecha.

Un saludo,

PD: ya sé que no tienes mucho tiempo .. pero para que lo anotes en tu agenda: www.mysql-hispano.com .. Ahí tienes manuales sobre "diseño de base de datos", "normalización" y otros que debes estudiar antes de seguir haciendo base de datos.
  #3 (permalink)  
Antiguo 30/08/2004, 20:07
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 22 años
Puntos: 0
Gracias Cluster...

Vere que puedo lograr con algo de documentacion.

Saludos
  #4 (permalink)  
Antiguo 03/09/2004, 21:34
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 22 años
Puntos: 0
Despues de una amplia documentacion, estoy intentando algo que me funciona a medias.

Tengo un formulario 1 que es en donde el usuario llenara los datos a subir a la base de datos. Este formulario llama a un archivo .php que procesa e ingresa los datos en la base de datos; a su vez, redirecciona a un formulario 2 que deberia aparecer ya lleno con los datos rcientemente introducidos (tipo para modificar datos).

Asi, el usuario ya recibe todos los datos llenos y solo debe preocuparse de introducir una segunda foto y asi sucesivamente.

Cada foto se guarda en la tabla con un id diferente y los mismos datos de texto, lo que hace bastante facil mostrar los resultados.

El problema esta en que el formulario 2 nunca lo puedo recibir lleno. No me funciona. Entonces quedo en la misma... el usuario tendria que llenar todos los datos del formulario nuevamente, tantas veces como desee ingresar imagenes...Totalmente absurdo.

Los codigo...

formulario 1
Código PHP:
<? 
if (isset($_GET['proceso'])){ 
echo 
$_GET['proceso']."<br>"

?>
<FORM enctype="multipart/form-data" method="post" action="insert_images.php">
                    <table width="375">
                      <tr>
                        <td width="71"><div align="left" class="normal">Date:</div></td>
                        <td width="292"><div align="left">
                          <input name="date" type="text" id="date" size="20" align="left">
                        </div></td>
                      </tr>
                      <tr>
                        <td width="71"><div align="left" class="normal">Image:</div></td>
                        <td width="292"><div align="left">
                          <input name="archivo" type="file" id="archivo" size="33" align="left">
                        </div></td>
                      </tr>
                      <tr>
                        <td>&nbsp;</td>
                        <td>&nbsp;</td>
                      </tr>
                      <tr>
                        <td colspan="2"><div align="center">
                            <input type="submit" name="submit" value="Insert">
                        </div></td>
                      </tr>
                    </table>
                  </form>
Insertar 1 (insert_images.php)
Código PHP:
<?php
 
//Primero, arranca el bloque PHP y checkea si el archivo tiene nombre.  Si no fue asi, te remite de nuevo al formulario de inserción: 
// No se comprueba aqui si se ha subido correctamente. 
if (empty($_FILES['archivo']['name'])){ 
header("location: form_images.php?proceso=falta_indicar_fichero"); //o como se llame el formulario .. 
exit; 


//establece una conexión con la base de datos. 
$conexion mysql_connect("db110.perfora.net","dbo108179979","WhFKdm7M") or die("No se pudo realizar la conexion con el servidor."); 
mysql_select_db("db108179979",$conexion) or die("No se puede seleccionar BD"); // tu_bd es el nombre de la Base de datos .. por siaca. 

// archivo temporal (ruta y nombre). 
$binario_nombre_temporal=$_FILES['archivo']['tmp_name']; 

// leer del archvio temporal .. el binario subido. 
// "rb" para Windows .. Linux parece q con "r" sobra ... 
$binario_contenido addslashes(fread(fopen($binario_nombre_temporal"rb"), filesize($binario_nombre_temporal))); 

// Obtener del array FILES (superglobal) los datos del binario .. nombre, tabamo y tipo. 
$binario_nombre=$_FILES['archivo']['name']; 
$binario_peso=$_FILES['archivo']['size']; 
$binario_tipo=$_FILES['archivo']['type']; 

//insertamos los datos en la BD. 
$consulta_insertar "INSERT INTO records (id, date, archivo_binario, archivo_nombre, archivo_peso, archivo_tipo) VALUES ('', '$date', '$binario_contenido', '$binario_nombre', '$binario_peso', '$binario_tipo')"
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos."); 
header("location: form_images2.php");  // si ha ido todo bien 
exit;
 
?>
formulario 2
Código PHP:
<? 
if (isset($_GET['proceso'])){ 
echo 
$_GET['proceso']."<br>"
}
?>

<?
$conexion 
mysql_connect("db110.perfora.net","dbo108179979","WhFKdm7M") or die("Can't connect to server."); 
mysql_select_db("db108179979",$conexion) or die("Can't select the database");
 
$sql="SELECT * FROM records WHERE date='".$_POST['date']."'"
$result mysql_query($sql) or die (mysql_error()); 
$resultado=mysql_fetch_array($result);  
?>

<FORM enctype="multipart/form-data" method="post" action="insert_images2.php">
                    <table width="375">
                      <tr>
                        <td width="71"><div align="left" class="normal">Date:</div></td>
                        <td width="292"><div align="left">
                          <input name="date" type="text" id="date" size="20" align="left" value="<? echo ".$_POST['date']."?>">
                        </div></td>
                      </tr>
                      <tr>
                        <td width="71"><div align="left" class="normal">Image:</div></td>
                        <td width="292"><div align="left">
                          <input name="archivo" type="file" id="archivo" size="33" align="left">
                        </div></td>
                      </tr>
                      <tr>
                        <td>&nbsp;</td>
                        <td>&nbsp;</td>
                      </tr>
                      <tr>
                        <td colspan="2"><div align="center">
                            <input type="submit" name="submit" value="Insert">
                        </div></td>
                      </tr>
                    </table>
                  </form>
El insertar 2 (insert_images2.php)
Código PHP:
<?php
 
//Primero, arranca el bloque PHP y checkea si el archivo tiene nombre.  Si no fue asi, te remite de nuevo al formulario de inserción: 
// No se comprueba aqui si se ha subido correctamente. 
if (empty($_FILES['archivo']['name'])){ 
header("location: form_images2.php?proceso=falta_indicar_fichero"); //o como se llame el formulario .. 
exit; 


//establece una conexión con la base de datos. 
$conexion mysql_connect("db110.perfora.net","dbo108179979","WhFKdm7M") or die("No se pudo realizar la conexion con el servidor."); 
mysql_select_db("db108179979",$conexion) or die("No se puede seleccionar BD"); // tu_bd es el nombre de la Base de datos .. por siaca. 

// archivo temporal (ruta y nombre). 
$binario_nombre_temporal=$_FILES['archivo']['tmp_name']; 

// leer del archvio temporal .. el binario subido. 
// "rb" para Windows .. Linux parece q con "r" sobra ... 
$binario_contenido addslashes(fread(fopen($binario_nombre_temporal"rb"), filesize($binario_nombre_temporal))); 

// Obtener del array FILES (superglobal) los datos del binario .. nombre, tabamo y tipo. 
$binario_nombre=$_FILES['archivo']['name']; 
$binario_peso=$_FILES['archivo']['size']; 
$binario_tipo=$_FILES['archivo']['type']; 

//insertamos los datos en la BD. 
$consulta_insertar "INSERT INTO records (id, date, archivo_binario, archivo_nombre, archivo_peso, archivo_tipo) VALUES ('', '$date', '$binario_contenido', '$binario_nombre', '$binario_peso', '$binario_tipo')"
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos."); 
header("location: form_images2.php");  // si ha ido todo bien 
exit;
 
?>
He hecho 800 mil pruebas diferentes.. me he leido todos los manuales posibles, tutoriales, foros y nada...!!!

Se que el error debe estar en MySQL pero de verdad que no doy con el.
  #5 (permalink)  
Antiguo 03/09/2004, 22:45
Avatar de HiTek  
Fecha de Ingreso: noviembre-2003
Ubicación: LF, Santiago.Chile
Mensajes: 217
Antigüedad: 21 años
Puntos: 0
Información

hola iarrieta, mira estudia este pequeño script, que hace?
bueno construye el formulario multipart para la imagenes
con su boton submit y todo como corresponde
luego al hacer click en el boton "insert" sobre el mismo script
reviso cuales son loas archivos que haz subido correctamente
y te indica cuales son, los que han faltado te los indica como
que han quedado vacios, espero que te sirva y asi podrias
bajar tu carga de trabajo...salu2 desde Chile

Código PHP:
<?
    
if( !isset( $_GET["submit"] ) )
    {
        
/*
        $link        =    conectar();
        $sql        =    "select * from dates where date='.date(d.".".M.".".Y).'";
        $res_pic    =    mysql_query( $sql );
        $n_pic_in_date    =    mysql_num_rows( $res_pic );
        */
        
$n_pic_in_date    =    0;

        if( 
$n_pic_in_date == ){
            echo 
"Maximo de fotos para hoy completado";
        }else{
            if( 
$n_pic_in_date == ){
                
$limit 4;
            }else{
                
$limit $n_pic_in_date;
            }
                echo 
"<FORM enctype='multipart/form-data' method='post' action='?limit=".$limit."&submit=1'>\n";
            for(
$init=1;$init<=$limit;$init++){
                echo 
"Date  : <input name='date[]' type='text' id='__date__".$init."'> --> \n";
                echo 
"Image : <input name='archivo[]' type='file' id='__archivo".$init."'><br>\n";
            }
                echo 
"<input type='submit' name='submit' value='Insert'>\n";
                echo 
"</FORM>";
        }
    }else{
        for(
$init=0;$init<=$limit-1;$init++){
            if( empty( 
$_FILES['archivo']['name'][$init] )){
                echo 
"Imagen Nº".$init." esta vacio.<br>\n";
            }else{
                if( empty( 
$_POST["date"][$init] )){
                    echo 
"Fecha de la Imagen Nº".$init." esta vacia.<br>\n";
                }else{
                    echo 
"IMAGEN Nº".$init." : ".$_FILES['archivo']['name'][$init]." @ ".$_POST['date'][$init]."<br>\n";
                }
            }
        }
    }
echo 
"Powered By HiTek :D";
?>


algo que me olvide de comentarte, las instrucciones que han sido comentadas
proponen la idea de revisar en la tabla cuantas fotografias haz subido
durante el dia y te da la opcion de subir sólo las restantes para asi asegurar
que serán 4 diarias...salu2

Última edición por HiTek; 03/09/2004 a las 22:47
  #6 (permalink)  
Antiguo 04/09/2004, 09:12
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Yo creo que un modelo de datos simple tipo:

tabla Registro:

id_registro
blablabla
blabla
bla


tabla Imagenes:

id_imagen
id_registro
nombre_foto
blablabla

Es lo que necesitan .. La relación sería 1 (registro) -> N imagenes .. El resto es hacer consultas SQL por el registro asociado en "imagenes" (.... WHERE registros.id_registro=imagenes.id_registro .... o usando JOIN ...) para ver cuantas fotografías hay .. y si es necesario hacer alguna limitación si lo amerita.

O incluso una relación N <-> N .. pero este no parece ser el caso .. donde tendriamos consultas SQL más complejas pero no modificaríamos las existentes usando una tabla "matriz" intermédia que sólo guarda las relaciones entre ese "ID" del registro y el "ID" de la imagen ..

En resumen .. Más y mejor estructura de la Base de datos.

más info en:
www.mysql-hispano.com

Un saludo,
  #7 (permalink)  
Antiguo 04/09/2004, 11:09
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 22 años
Puntos: 0
OK, gracias a ambos por su ayuda. Voy a poner en practica los dos casos a ver como me funciona mejor.
  #8 (permalink)  
Antiguo 08/09/2004, 15:46
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 22 años
Puntos: 0
OK, ya he probado con dos tablas y funciona muy bien.

Tabla 1: id, codigo, nombre, email
Tabla 2: id, codigo, archivo_binario, archivo_nombre, archivo_peso, archivo_tipo

Ambas tablas las he creado solo como practica (no son las originales)

De esta manera, sube con un doble insert perfectamente y me muestra la foto con el texto debajo...PERFECTO!!!!!

Mi pregunta ahora es (ya que estoy usando el codigo gentilmente tomado de este mismo foro, tanto para subir imagenes a la bd como el de generar thumbs), como le hago para amoldarlos a mas de una imagen como vienen originalmente.

Es decir, en la base de datos debo crear en la tabla 2 tantos campos como imagenes desee (ejemp: archivo_binario2, arch..2, arch...3, arch..4) y en el formulario la misma cantidad de campos file. ***Por alli he visto algo como input name="archivo[]" (debo documentarme mas al respecto)

Luego, tanto el codigo upload como el de thumbs solo meciona el campo archivo_binario y genera algunas acciones (no esta hecho para archivo_binario2, arch...3). Sera que simplemente debo incluir tantos arch.. como sean en los codigos de upload y thumbs?
  #9 (permalink)  
Antiguo 08/09/2004, 16:35
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Y no relacionas tabla 1 con tabla 2?

Debes crear un campo más extra en tu tabla de imagenes tipo "ID_tabla1" que será el que usarás para relacionar en tus consultas SQL ambas tablas y así obtener las imagenes asociadas a determinado ID de tu tabla 1 (registro), en relación 1->N como más arriba te comenté.

Un saludo,
  #10 (permalink)  
Antiguo 08/09/2004, 16:58
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 22 años
Puntos: 0
Si amigo, el campo comun es "codigo"

tabla1:id,codigo,nombre,email
tabla2:id,codigo,binario,etc...

Te pongo un poco aqui..

Formulario

<FORM enctype="multipart/form-data" method="post" action="insertar.php">
<table width="375">
<tr>
<td width="71"><div align="left" class="normal">Codigo:</div></td>
<td width="292"><div align="left">
<input name="codigo" type="text" id="codigo" size="20" align="left">
</div></td>
</tr>
<tr>
<td width="71"><div align="left" class="normal">Nombre:</div></td>
<td width="292"><div align="left">
<input name="nombre" type="text" id="nombre" size="20" align="left">
</div></td>
</tr>
<tr>
<td width="71"><div align="left" class="normal">Email:</div></td>
<td width="292"><div align="left">
<input name="email" type="text" id="email" size="20" align="left">
</div></td>
</tr>
<tr>
<td width="71"><div align="left" class="normal">Imagen:</div></td>
<td width="292"><div align="left">
<input name="archivo[]" type="file" id="archivo[]" size="33" align="left">
</div></td>
</tr>
<tr>
<td width="71"><div align="left" class="normal">Imagen:</div></td>
<td width="292"><div align="left">
<input name="archivo[]" type="file" id="archivo[]" size="33" align="left">
</div></td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="2"><div align="center">
<input type="submit" name="submit" value="Insertar">
</div></td>
</tr>
</table>
</form>
__________________________________________
El insertar.php
Código PHP:
<?php
 
//Primero, arranca el bloque PHP y checkea si el archivo tiene nombre.  Si no fue asi, te remite de nuevo al formulario de inserción: 
// No se comprueba aqui si se ha subido correctamente. 
if (empty($_FILES['archivo']['name'][$i])){ 
header("location: formulario.php?proceso=falta_indicar_fichero"); //o como se llame el formulario .. 
exit; 


//establece una conexión con la base de datos. 
$conexion mysql_connect("localhost","entre2_admin","123456") or die("No se pudo realizar la conexion con el servidor."); 
mysql_select_db("entre2_principal",$conexion) or die("No se puede seleccionar BD"); // tu_bd es el nombre de la Base de datos .. por siaca. 

// archivo temporal (ruta y nombre). 
$binario_nombre_temporal=$_FILES['archivo']['tmp_name'][$i]; 

// leer del archvio temporal .. el binario subido. 
// "rb" para Windows .. Linux parece q con "r" sobra ... 
$binario_contenido addslashes(fread(fopen($binario_nombre_temporal"rb"), filesize($binario_nombre_temporal))); 

// Obtener del array FILES (superglobal) los datos del binario .. nombre, tabamo y tipo. 
$binario_nombre=$_FILES['archivo']['name'][$i]; 
$binario_peso=$_FILES['archivo']['size'][$i]; 
$binario_tipo=$_FILES['archivo']['type'][$i]; 

//insertamos los datos en la BD. 
$consulta_insertar "INSERT INTO fotos (id, codigo, archivo_binario, archivo_nombre, archivo_peso, archivo_tipo) VALUES ('', '$codigo', '$binario_contenido', '$binario_nombre', '$binario_peso', '$binario_tipo')"
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos.");
$consulta_insertar "INSERT INTO datos (id, codigo, nombre, email) VALUES ('', '$codigo', '$nombre', '$email')"
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos.");
header("location: ver.php");  // si ha ido todo bien 
exit;
 
?>
El miniaturas.php
Código PHP:
<?php  

if(isset($_GET['id'])) { 

    
$conexion mysql_connect("localhost","entre2_admin","123456") or die("No se pudo realizar la conexion con el servidor."); 
    
mysql_select_db("entre2_principal",$conexion) or die("No se puede seleccionar BD"); 
    
$sql "SELECT archivo_binario,archivo_tipo,archivo_nombre FROM fotos WHERE id='".$_GET['id']."'"
    
$consulta mysql_query($sql,$conexion); 
    
$imagen mysql_result($consulta,0,"archivo_binario");
    
$type mysql_result($consulta,0,"archivo_tipo");

///el resto ya lo conoces...
?>
Y el ver.php
Código PHP:
<? 
$conexion 
mysql_connect("localhost","entre2_admin","123456") or die("No se pudo realizar la conexion con el servidor."); 
mysql_select_db("entre2_principal",$conexion) or die("No se puede seleccionar BD"); 
 
$sql="SELECT * FROM datos,fotos WHERE datos.codigo=fotos.codigo"
$res=mysql_query($sql); 

while(
$row=mysql_fetch_array($res)) 

echo 
"<div align='left'>";
echo 
"<img src=\"mini_images.php?id=$row[id]\"><br><br>";
echo 
"Codigo: ".$row[codigo]."<br>";
echo 
"Nombre: ".$row[nombre]."<br>";
echo 
"Email: ".$row[email]."<br>";

}
?>

Con una funciona perfecto, pero al agregar otro campo file, convertirlos en tipo [] y modificar el insertar con [$i] me genera esta respuesta:

falta_indicar_fichero
  #11 (permalink)  
Antiguo 08/09/2004, 18:19
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 22 años
Puntos: 0
Ahora me sube una imagen...

Coloque esto en la parte superior del codigo de upload:
Código PHP:
<?
$N 
2//Número de archivos a Subir 

for($i=0$i<$N$i++) {
?>
Y al final del coigo coloque una }

Y ahora al menos no me da error, pero solo me sube una solo foto.

A pesar de usar esto [] en los campos file, debo crear diferentes campos para imagenes en la base de datos?
  #12 (permalink)  
Antiguo 09/09/2004, 06:36
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Cita:
A pesar de usar esto [] en los campos file, debo crear diferentes campos para imagenes en la base de datos?
No, .. lo que debes hacer es primero crear tu registro de la tabla1 (la "padre") y despues aplicar el bucle para ir creando los N registros en la tabla2 con las respectivas imagenes (referencias y datos de cada imagen) .. por qué sino vas a crear un registro en la tabla1 por cada imagen repetido .. y ese no es el objetivo .. debes conseguir: 1 (registro tabla1) -> N (registros tabla2 relacionados por algún campo).

En cuanto a la "relación" en sí de ambas tablas .. personalmente no usaría tu campo "código" que es própio de tu "aplicación" sino el ID del registro de la tabla1 que me arroje al crearlo .. lo cual puedes obtenerlo con la función: mysql_insert_id() si no me equivoco para usarlo en la referencia de la tabla2 y registros que vas a crear, ambos campos "id" indexados y verás como no tienes problemas ya que tu "id" de la tabla1 es un campo autoincremental y sobre todo "único".

El bucle deberías usar:

for($i=0; $i <= count($_FILES['archivo']); $i++)

En tus consultas SQL que intervengan más tablas (mas de una) debes indicar siempre de que tabla te refieres .. incluso para decir "todos los campos" (con el *) ejemplo:

[php]$sql="SELECT datos.*,fotos.* FROM datos,fotos WHERE datos.codigo=fotos.codigo";[/quote]

Un saludo,
  #13 (permalink)  
Antiguo 09/09/2004, 07:02
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 22 años
Puntos: 0
Gracias Cluster, aunque me sono un poco complicado eso del principio

"No, .. lo que debes hacer es primero crear tu registro de la tabla1 (la "padre") y despues aplicar el bucle para ir creando los N registros en la tabla2 .."

Pero voy a intentarlo, vale?
  #14 (permalink)  
Antiguo 09/09/2004, 07:20
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 22 años
Puntos: 0
Auxilio!!!!!!!!!!!!!!!!!!

Me sigue mostrando 1 imagen (solo sube 1 imagen)

Hice estos cambios...

En el upload, agregue el for y cambie el orden de los insert
Código PHP:
<?php
 
//Primero, arranca el bloque PHP y checkea si el archivo tiene nombre.  Si no fue asi, te remite de nuevo al formulario de inserción: 
// No se comprueba aqui si se ha subido correctamente. 

for($i=0$i <= count($_FILES['archivo']); $i++) { 

if (empty(
$_FILES['archivo']['name'][$i])){ 
header("location: formulario.php?proceso=falta_indicar_fichero"); //o como se llame el formulario .. 
exit; 


//establece una conexión con la base de datos. 
$conexion mysql_connect("localhost","entre2_admin","123456") or die("No se pudo realizar la conexion con el servidor."); 
mysql_select_db("entre2_principal",$conexion) or die("No se puede seleccionar BD"); // tu_bd es el nombre de la Base de datos .. por siaca. 

// archivo temporal (ruta y nombre). 
$binario_nombre_temporal=$_FILES['archivo']['tmp_name'][$i]; 

// leer del archvio temporal .. el binario subido. 
// "rb" para Windows .. Linux parece q con "r" sobra ... 
$binario_contenido addslashes(fread(fopen($binario_nombre_temporal"rb"), filesize($binario_nombre_temporal))); 

// Obtener del array FILES (superglobal) los datos del binario .. nombre, tabamo y tipo. 
$binario_nombre=$_FILES['archivo']['name'][$i]; 
$binario_peso=$_FILES['archivo']['size'][$i]; 
$binario_tipo=$_FILES['archivo']['type'][$i]; 

//insertamos los datos en la BD.
$consulta_insertar "INSERT INTO datos (id, codigo, nombre, email) VALUES ('', '$codigo', '$nombre', '$email')"
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos."); 
$consulta_insertar "INSERT INTO fotos (id, codigo, archivo_binario, archivo_nombre, archivo_peso, archivo_tipo) VALUES ('', '$codigo', '$binario_contenido', '$binario_nombre', '$binario_peso', '$binario_tipo')"
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos.");
header("location: ver.php");  // si ha ido todo bien 
exit;

?>
Y en el ver
Código PHP:
<?
$sql
="SELECT datos.*,fotos.* FROM datos,fotos WHERE datos.codigo=fotos.codigo"
$res=mysql_query($sql);
?>
En lo que respecta a la insercion estoy bien confundido
Cita:
No, .. lo que debes hacer es primero crear tu registro de la tabla1 (la "padre") y despues aplicar el bucle para ir creando los N registros en la tabla2 con las respectivas imagenes (referencias y datos de cada imagen) .. por qué sino vas a crear un registro en la tabla1 por cada imagen repetido .. y ese no es el objetivo .. debes conseguir: 1 (registro tabla1) -> N (registros tabla2 relacionados por algún campo).
Cuando te refieres al campo id es el mismo que se crea automatico al ingresar un registro?, es decir

tabla1: id,codigo,nombre,email
tabla2:id,arvhivo_binario,archivo_nombre...
  #15 (permalink)  
Antiguo 09/09/2004, 07:37
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Código PHP:
$consulta_insertar "INSERT INTO datos (id, codigo, nombre, email) VALUES ('', '$codigo', '$nombre', '$email')"
mysql_query($consulta_insertar,$conexion) .... 
Eso NOO debe estar en tu bucle (dentro) .. RECUERDA que vas a crear UN registro en dato y vas a crear N registros en "fotos". Para "saber" que "fotos" son de que "dato" ya usas un campo que los va a relacionar .. ya sea tu código o el ID que te propongo yo:

tabla_dato: id_dato,codigo,nombre,email
tabla_fotos: id_foto,id_dato,arvhivo_binario,archivo_nombre...

Código PHP:

// Fuera del bucle: crear tu registro del "dato"

$sql="INSERT INTO dato .....";
$consulta=mysql_query($sql);
// Obtener el ID resultante 
$id_dato=mysql_insert_id($consulta);

// Tu bucle para crear los registros de "foto" 
for ( ......){

// el código de insercción a la BD de la FOTO
// Usaras el $id_dato que has obtenido de la crearción del UNICO registro para el "dato" y que usaras para relacionar ambas tablas.

// cierre bucle!

// SI ha ido todo BIEN! .. redireccionas .. NO a cada pasada del bucle!!!
header() .... 
Para ver las fotos de UN registro determinado (dato) .. teienes que hacer alguna consulta SQL condicional tipo.

Código PHP:
$codigo="el registro de dato que busques . por ejemplo por 'código' u otra referencia";
$sql="SELECT datos.*,fotos.* FROM datos,fotos WHERE datos.id_dato=fotos.id_dato AND datos.codigo='".$codigo."'"
$res=mysql_query($sql); 
Un saludo,
  #16 (permalink)  
Antiguo 09/09/2004, 07:43
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 22 años
Puntos: 0
Barbaro...!!!!!!!!! Muchas gracias Cluster...
  #17 (permalink)  
Antiguo 09/09/2004, 08:13
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 22 años
Puntos: 0
Me vuelve a mostrar el mensaje:

falta_indicar_fichero

Hice esto:
Código PHP:
<?
/// Ya conoces la parte superior del codigo.

//insertamos los datos en la BD.
$consulta_insertar "INSERT INTO datos (id_datos, codigo, nombre, email) VALUES ('$id_datos', '$codigo', '$nombre', '$email')";
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos."); 
$consulta=mysql_query($consulta_insertar);
 
// Obtener el ID resultante 
$id_datos=mysql_insert_id($consulta);

for(
$i=0$i <= count($_FILES['archivo']); $i++) {
 
$consulta_insertar "INSERT INTO fotos (id_fotos, id_datos, archivo_binario, archivo_nombre, archivo_peso, archivo_tipo) VALUES ('$id_fotos', '$id_datos', '$binario_contenido', '$binario_nombre', '$binario_peso', '$binario_tipo')"
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos.");
header("location: ver.php");  // si ha ido todo bien 
exit;

?>
  #18 (permalink)  
Antiguo 10/09/2004, 06:58
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Te dije que no puedes hacer un "header()" para redireccionar en el BUCLE (dentro del for) .. debes usarlo FUERA del bucle ..

Las variables de $binario_nombre y demás .. DEBES definirlas en el bucle .. que de eso se trata: recorrer el array de archivos que enviastes para ir creando UNO a UNO los registros para la tabla fotos.

PON el código completo que uses en la actualidad (mejor haz los cambios que te indico y de ahí pones el código).

Un saludo,
  #19 (permalink)  
Antiguo 10/09/2004, 07:54
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 22 años
Puntos: 0
Hola, pues al menos tengo buenas noticias.

Por estar en Venezuela (no podemos sacar dolares) no he podido tomar un buen curso que me evite hacer tantas y tantas preguntas aqui en el foro (la idea seria mejor poder colaborar aportando conocimientos, pero no los tengo).

Pues ubique a alguien en el exterior que me hara el favor de pagar una matricula por mi para tomar un curso online (debo empezar este fin de semana).

Por ello Cluster (debido a mis tan bajos conocimientos) es que o tengo ni idea de a que te refieres con
Cita:
Te dije que no puedes hacer un "header()" para redireccionar en el BUCLE (dentro del for) .. debes usarlo FUERA del bucle ..
Las variables de $binario_nombre y demás .. DEBES definirlas en el bucle .. que de eso se trata: recorrer el array de archivos que enviastes para ir creando UNO a UNO los registros para la tabla fotos.
Lamentablemente me ha tocado "copiar y pegar" el codigo que he encontrado aqui en este foro y si, por ejemplo (ya lo he intentado), en el codigo de upload quito donde dice header, no me funciona...

Te pego TODO el codigo a ver que podemos hacer.. espero puedas ayudarme.

insertar.php
Código PHP:
<?php
 
//Primero, arranca el bloque PHP y checkea si el archivo tiene nombre.  Si no fue asi, te remite de nuevo al formulario de inserción: 
// No se comprueba aqui si se ha subido correctamente.  

if (empty($_FILES['archivo']['name'][$i])){ 
header("location: formulario.php?proceso=falta_indicar_fichero"); //o como se llame el formulario .. 
exit; 


//establece una conexión con la base de datos. 
$conexion mysql_connect("localhost","entre2_admin","123456") or die("No se pudo realizar la conexion con el servidor."); 
mysql_select_db("entre2_principal",$conexion) or die("No se puede seleccionar BD"); // tu_bd es el nombre de la Base de datos .. por siaca. 

// archivo temporal (ruta y nombre). 
$binario_nombre_temporal=$_FILES['archivo']['tmp_name'][$i]; 

// leer del archvio temporal .. el binario subido. 
// "rb" para Windows .. Linux parece q con "r" sobra ... 
$binario_contenido addslashes(fread(fopen($binario_nombre_temporal"rb"), filesize($binario_nombre_temporal))); 

// Obtener del array FILES (superglobal) los datos del binario .. nombre, tabamo y tipo. 
$binario_nombre=$_FILES['archivo']['name'][$i]; 
$binario_peso=$_FILES['archivo']['size'][$i]; 
$binario_tipo=$_FILES['archivo']['type'][$i]; 

//insertamos los datos en la BD.
$consulta_insertar "INSERT INTO datos (id_datos, codigo, nombre, email) VALUES ('$id_datos', '$codigo', '$nombre', '$email')";
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos."); 
$consulta=mysql_query($consulta_insertar);
 
// Obtener el ID resultante 
$id_datos=mysql_insert_id($consulta);

for(
$i=0 $i <= count($_FILES['archivo']) $i++) {
 
$consulta_insertar "INSERT INTO fotos (id_fotos, id_datos, archivo_binario, archivo_nombre, archivo_peso, archivo_tipo) VALUES ('$id_fotos', '$id_datos', '$binario_contenido', '$binario_nombre', '$binario_peso', '$binario_tipo')"
mysql_query($consulta_insertar,$conexion) or die("No se pudo insertar los datos en la base de datos.");
header("location: ver.php");  // si ha ido todo bien 
exit;

?>
Gracias...
  #20 (permalink)  
Antiguo 10/09/2004, 07:55
 
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 278
Antigüedad: 22 años
Puntos: 0
Por cierto, ya perdi este cliente. Si logramos sacarlo es para conocimiento personal.
  #21 (permalink)  
Antiguo 10/09/2004, 08:49
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Cita:
Por estar en Venezuela (no podemos sacar dolares) no he podido tomar un buen curso que me evite hacer tantas y tantas preguntas aqui en el foro (la idea seria mejor poder colaborar aportando conocimientos, pero no los tengo).
Si te sirve de aliento .. yo no he estudiado PHP en ninguna Universidad/academia .. Soy 100 % autodidacta.

No sé que más decirte .. Podría "hacerte el código" pero si bien te "funcionaria" no aprenderías y creo que has llegado a un punto (fijate que ya "perdistes" un cliente) que debes aprender. En las FAQ's de este foro tienes tutoriales sobre PHP, pero esto no sirve de nada si antes no conoces algo de programación a nivel general y conceptos como eso de "bucle","array", "condiciones" y demás ..

A modo de introducción:
Esto es un array $_FILES['archivo']['tmp_name'][$i];

Ese $i que usas ahí es para recorrer ese array que tiene N elementos (tantos como campos "file" usastes en tu formulario) .. Por eso usas un bucle (de tipo for) y he de ahí que ese código que hace referencia a ese Array debes Usarlo bajo el bucle for entre {} del mismo for (...){ aquí } ....


El header() con ese exit DEBES sacarlo fuera del bucle .. El exit termina la ejecución del script entero .. así que si lo usas ahí dentro de tu bucle .. el bucle NO hará más que una iteracción (sólo contará "1") ..

Un saludo,
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:07.