Foros del Web » Programando para Internet » PHP »

Mi foreach solo lee el último registro...

Estas en el tema de Mi foreach solo lee el último registro... en el foro de PHP en Foros del Web. Hola a todos. Yo debo de ser realmente muy burro porque no entiendo nada... Estoy intentando subir varios archivos mediante PHP y no hay manera. ...
  #1 (permalink)  
Antiguo 07/01/2013, 21:10
 
Fecha de Ingreso: abril-2009
Ubicación: Barcelona
Mensajes: 113
Antigüedad: 14 años, 11 meses
Puntos: 9
Pregunta Mi foreach solo lee el último registro...

Hola a todos.

Yo debo de ser realmente muy burro porque no entiendo nada...

Estoy intentando subir varios archivos mediante PHP y no hay manera. Simplificaré el caso al máximo.

Encontré un código donde "simula" la carga. Está realizado en HTML5. Simplemente lo he copiado y pegado. Tan solo modifiqué parte del formulario para poder ser enviado ya que en el ejemplo tan solo servía para probar como quedaría.

Código HTML:
Ver original
  1. <!doctype html>
  2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  3. <title>Untitled Document</title>
  4.   .thumb {
  5.     height: 75px;
  6.     border: 1px solid #000;
  7.     margin: 10px 5px 0 0;
  8.   }
  9. </head>
  10.  
  11.  
  12. <form action="lanzar.php" enctype="multipart/form-data" method="post" >
  13. <input type="file" id="files" name='files[]' multiple='multiple' />
  14. <input type="submit" />
  15. <input type="reset"/>
  16. <output id="list"></output>
  17. </form>
  18.  
  19.   function handleFileSelect(evt) {
  20.     var files = evt.target.files; // FileList object
  21.  
  22.     // Loop through the FileList and render image files as thumbnails.
  23.     for (var i = 0, f; f = files[i]; i++) {
  24.  
  25.       // Only process image files.
  26.       if (!f.type.match('image.*')) {
  27.         continue;
  28.       }
  29.  
  30.       var reader = new FileReader();
  31.  
  32.       // Closure to capture the file information.
  33.       reader.onload = (function(theFile) {
  34.         return function(e) {
  35.           // Render thumbnail.
  36.           var span = document.createElement('span');
  37.           span.innerHTML = ['<img class="thumb" src="', e.target.result,
  38.                            '" title="', escape(theFile.name), '"/>'].join('');
  39.           document.getElementById('list').insertBefore(span, null);
  40.         };
  41.       })(f);
  42.  
  43.       // Read in the image file as a data URL.
  44.       reader.readAsDataURL(f);
  45.     }
  46.   }
  47.  
  48.   document.getElementById('files').addEventListener('change', handleFileSelect, false);
  49. </body>
  50. </html>

Posteriormente tengo el archivo PHP. El ejemplo está muy simplificado, pero la cuestión es que cuando le indico que me diga cuantos registros hay en el array de $_FILES da igual cuantos haya cargado antes, siempre indica 1, lo cual no creo que sea muy normal. A parte de eso solo sube la última imagen que se haya cargado previamente. Da igual si cargas tres, siempre subirá tan solo la última.

Código PHP:
Ver original
  1. <?php
  2. if(isset($_FILES['files']['tmp_name'])){
  3.     echo $num_files = count($_FILES['files']['tmp_name']);
  4.    
  5.     foreach($_FILES['files']['name'] as $key =>$value){
  6.        
  7.         is_uploaded_file($_FILES['files']['tmp_name'][$key]);
  8.        
  9.         $origen = $_FILES['files']['tmp_name'][$key];
  10.         $destino = "imagen/".$_FILES['files']['name'][$key];
  11.         move_uploaded_file($origen, $destino); 
  12.  
  13.     }
  14. }
  15. ?>

¿Qué estoy haciendo mal?
Porque cuando el array por ejemplo es de un select multiple y lo traigo con POST no tengo ningún problema en recorrerlo con el foreach..
__________________
- Y lo que todavía me queda por aprender...
  #2 (permalink)  
Antiguo 08/01/2013, 07:32
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 2 meses
Puntos: 288
Respuesta: Mi foreach solo lee el último registro...

efectivamente tu ejemplo solo envia el ultimo archivo que seleccionaste,
las imagenes que se van creando son a moo visual pero no quiere decir que las envie como si fuera un campo file.

me gusto lo voy a ver como es que funciona
  #3 (permalink)  
Antiguo 08/01/2013, 08:54
 
Fecha de Ingreso: abril-2009
Ubicación: Barcelona
Mensajes: 113
Antigüedad: 14 años, 11 meses
Puntos: 9
Respuesta: Mi foreach solo lee el último registro...

Cita:
Iniciado por Patriarka Ver Mensaje
efectivamente tu ejemplo solo envia el ultimo archivo que seleccionaste,
las imagenes que se van creando son a moo visual pero no quiere decir que las envie como si fuera un campo file.

me gusto lo voy a ver como es que funciona
Efectivamente, se que la previsualización de las imágenes no quieren decir que hayan subido, es simplemente eso, una previsualización... lo que yo quiero solventar, y no se como, es que solo se reciba el último mensaje...
__________________
- Y lo que todavía me queda por aprender...
  #4 (permalink)  
Antiguo 08/01/2013, 09:13
 
Fecha de Ingreso: abril-2009
Ubicación: Barcelona
Mensajes: 113
Antigüedad: 14 años, 11 meses
Puntos: 9
Respuesta: Mi foreach solo lee el último registro...

Avanzo... igual con un nuevo dato alguien se le ocurre que puede ser...

Resulta que si hago click en "examinar" selecciono primero un archivo, y luego vuelvo a hacer click en "examinar" para seleccionar otro, el array solo se entera del último... pero si cuando selecciono los archivos selecciono varios de golpe entonces sí que el array se entera de que hay dos o tres o los que sean y sí realiza correctamente la carga...

¿Qué puede ser?
__________________
- Y lo que todavía me queda por aprender...
  #5 (permalink)  
Antiguo 08/01/2013, 10:46
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Mi foreach solo lee el último registro...

El problema es que para que PHP "vea" los archivos estos tienen que ser mandados por el browser, y esto se hace por cada input[type=file].

Entendiendo esto, el problema es que tu script solo maneja un solo campo file, por lo que si seleccionas un archivo es el único valor que tiene, si seleccionas varios el valor son todos los que seleccionaste (atributo multiple).

Necesitas modificar tu script para que cada que seleccionen un file, se cree otro campo input para guardar el valor de tu file, ya que si no, no hay manera de que PHP lo pueda leer usando un formulario normal.

Saludos.
  #6 (permalink)  
Antiguo 08/01/2013, 11:21
 
Fecha de Ingreso: abril-2009
Ubicación: Barcelona
Mensajes: 113
Antigüedad: 14 años, 11 meses
Puntos: 9
Respuesta: Mi foreach solo lee el último registro...

Cita:
Iniciado por GatorV Ver Mensaje
El problema es que para que PHP "vea" los archivos estos tienen que ser mandados por el browser, y esto se hace por cada input[type=file].

Entendiendo esto, el problema es que tu script solo maneja un solo campo file, por lo que si seleccionas un archivo es el único valor que tiene, si seleccionas varios el valor son todos los que seleccionaste (atributo multiple).

Necesitas modificar tu script para que cada que seleccionen un file, se cree otro campo input para guardar el valor de tu file, ya que si no, no hay manera de que PHP lo pueda leer usando un formulario normal.

Saludos.
¿Y eso como se hace? Porque ando perdido la verdad
__________________
- Y lo que todavía me queda por aprender...
  #7 (permalink)  
Antiguo 08/01/2013, 11:46
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Mi foreach solo lee el último registro...

Pues lo haces con javascript, puedes usar las funciones de DOM como createElement, en el foro de Javascript te pueden indicar más, o una búsqueda en Google te puede servir, por ejemplo: http://stackoverflow.com/questions/1...-input-element.

Saludos.

Etiquetas: foreach, formulario, html, lee, registro
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 12:11.