Foros del Web » Programando para Internet » PHP »

Juntar registros indefinidos en array especificando cuáles son

Estas en el tema de Juntar registros indefinidos en array especificando cuáles son en el foro de PHP en Foros del Web. Hola amigos. A ver si me podéis ayudar, sea con código o ideas lógicas, en este problema que tengo: Resulta que tengo una página automatizada ...
  #1 (permalink)  
Antiguo 05/03/2009, 14:28
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 meses
Puntos: 29
Juntar registros indefinidos en array especificando cuáles son

Hola amigos.
A ver si me podéis ayudar, sea con código o ideas lógicas, en este problema que tengo:

Resulta que tengo una página automatizada con javascript (es un programa de facturación que estoy haciendo), que añade líneas a una capa de esta forma:

Código:
capa1
      proveedor1, especie1, kilos1, precio1, subtotal1
/capa1
capa2
      proveedor2, especie2, kilos2, precio2, subtotal2
/capa2
capa3
      proveedor3, especie3, kilos3, precio3, subtotal3
/capa3
Los registros se almacenan en input de texto. Los envío con javascript por url ("pagina.php?proveedor="+document.form.proveedor3. value).
Al principio no aparece ninguno, se van añadiendo con un botón. Luego tengo tres inputs ocultos de control: Número de elementos totales, número de elementos eliminados, elementos eliminados (separados por comas). Estos tres campos tienen de valores números, es decir: número de elementos totales=5, número de elementos eliminados=2, elementos eliminados=3,5,

Esto da tres resultados completados y dos eliminados (el registro número 3 y el número 5).

El problema surge al intentar identificar estos registros (los que hay y los que no hay) en php.

La idea primaria que tuve fue arreglar los elementos eliminados (array("3","5")), con un explode, contar el número de registros eliminados e identificar con un if($variable[$i]==$registro+$x)

Es decir, con un bucle recorro el número de registros del array de eliminados, y lo comparo con los registros que ya no existen de la página en javascript.
Pero no hay manera.

¿Vosotros cómo lo haríais? ¿Cambiaríais la lógica del programa?

Un saludo y mil gracias.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.

Última edición por CHuLoSoY; 05/03/2009 a las 15:05
  #2 (permalink)  
Antiguo 05/03/2009, 15:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Juntar registros indefinidos en array especificando cuáles son

Hola CHuLoSoY,

Lo mejor es que uses un array para enviar los datos, por ejemplo:
Código html:
Ver original
  1. <input type="text" name="producto[0]" value="" />
  2. <input type="text" name="producto[1]" value="" />
  3. <input type="text" name="producto[2]" value="" />
  4. <input type="text" name="producto[3]" value="" />

Luego desde PHP los lees como array directamente:
Código php:
Ver original
  1. foreach($_POST['producto'] as $producto ) {
  2.        echo $producto;
  3. }

Saludos
  #3 (permalink)  
Antiguo 05/03/2009, 15:18
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 meses
Puntos: 29
Respuesta: Juntar registros indefinidos en array especificando cuáles son

Gracias por responder tan rápido. La verdad es que me corre prisa. Tu idea es genial, pero cómo almaceno registro a registro luego en la bd mysql? Con foreach recorro todos los productos y los pasa como variable?

Dejo una imagen de lo que estoy haciendo. Lo marcado en círculo (cutre) rojo es lo que comentaba, que va oculto, pero lo muestro para que veáis el funcionamiento. Se supone que había 5 registros, dos eliminados, la posición 2 y la 5.


Tengo que mandar 5 campos por registro (proveedor, pescado, kilos, precio y subtotal).

Sigue valiendo tu idea?
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #4 (permalink)  
Antiguo 05/03/2009, 15:21
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 meses
Puntos: 29
Respuesta: Juntar registros indefinidos en array especificando cuáles son

Pensando un poco... podría valer algo así? (cojo los datos por get)

Código PHP:
      foreach($_GET['proveedor'] as $proveedor AND $_GET['especie'] as $especie (etc,etc)) {
           
mysql_query("INSERT INTO tabla (proveedor, especie, kilos, precio, subtotal) 
           values ($proveedor, $especie, $kilos, $precio, $subtotal);"
);
      } 
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #5 (permalink)  
Antiguo 05/03/2009, 15:33
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Juntar registros indefinidos en array especificando cuáles son

Mmm no, como van a ser varios, es recomendable usar un for:
Código html:
Ver original
  1. Producto: <input type="text" name="productos[0]" value="" />
  2. Valor: <input type="text" name="valores[0]" value="" />
  3. Cantidad: <input type="text" name="cantidades[0]" value="" />
  4. ----
  5.  
  6. Producto: <input type="text" name="productos[1]" value="" />
  7. Valor: <input type="text" name="valores[1]" value="" />
  8. Cantidad: <input type="text" name="cantidades[1]" value="" />
  9. ----
  10.  
  11.  
  12. Producto: <input type="text" name="productos[2]" value="" />
  13. Valor: <input type="text" name="valores[2]" value="" />
  14. Cantidad: <input type="text" name="cantidades[2]" value="" />

Luego en PHP:
Código php:
Ver original
  1. $total = count($_POST['productos'];
  2. for($i = 0; $i < $total; $i++ ) {
  3.         $producto = $_POST['productos'][$i];
  4.         $valor = $_POST['valores'][$i];
  5.         $cantidad = $_POST['cantidades'][$i];
  6.  
  7.         //---
  8.         $sQuery = "INSERT INTO tabla ('$producto', '$valor', '$cantidad')";
  9. }

Por otro lado te recomiendo enviar por POST ya que si son varios vas a tener más control

Saludos
  #6 (permalink)  
Antiguo 05/03/2009, 15:37
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 meses
Puntos: 29
Muy bien, hasta ahí todo perfecto (muchas gracias amigo). Pero lo que necesito es ignorar los eliminados que están en el campo en forma 1,4,5, y quiero juntarlos en una matriz para ignorarlos en el for.

Supongo que un if pero no estoy muy seguro de cómo hacerlo... Vamos, que tengo un cacao mental de locos (llevo tres meses programando un tpv sin parar y ya no me aclaro ni yo mismo, cien mil variables, tropecientas funciones.... javascript, css, php..., me vuelvo loco!).

Gracias por ayudarme. un saludo.

EDITO: pensando en tu código me vino el flash a la cabeza:

Código PHP:
      $total count($_POST['productos'];
      for(
$i 0$i $total$i++ ) {
              
$producto $_POST['productos'][$i];
              
$valor $_POST['valores'][$i];
              
$cantidad $_POST['cantidades'][$i];


          if(
$producto) {
              
$sQuery "INSERT INTO tabla ('$producto', '$valor', '$cantidad')";
         }

      } 
¿vale la idea?

Lo he intentado y me sale $error="si"; de la linea 9 de este código:

Código PHP:
      $total $_POST['cuantosreg'];
      for(
$i 0$i $total$i++ ) {
              
$proveedor $_POST['proveedor'][$i];
              
$especie $_POST['especie'][$i];
              
$kilos $_POST['kilos'][$i];
              
$precio $_POST['precio'][$i];
              
$subtotal $_POST['subtotal'][$i];

    if(!
$proveedor && !$especie){ $error="si"; } else {
        
mysql_query("INSERT INTO registros_facturas (id_factura, proveedor, especie, kilos, precio, subtotal) values ('".$idfact."','".$proveedor."','".$especie."','".$kilos."','".$precio."','".$subtotal."');");
    }
      } 
Qué puedo hacer?

El problema surge con los campos. Si hago un echo no me reconoce ninguna de las dos opciones:

echo $_POST['proveedores'][1];
echo $_POST['proveedores[1]'];

No lo reconoce, o no lo envía. No lo sé.

Un saludo.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.

Última edición por GatorV; 05/03/2009 a las 16:42
  #7 (permalink)  
Antiguo 05/03/2009, 16:41
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Juntar registros indefinidos en array especificando cuáles son

Haz un var_dump($_POST) para que veas como estan llegando los valores.

Si quieres "eliminar" o saltar alguno puedes hacer un explode, de tu valor y en el for comparar si $i == al valor y con eso eliminas o saltas.

Saludos
  #8 (permalink)  
Antiguo 05/03/2009, 16:46
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 meses
Puntos: 29
Respuesta: Juntar registros indefinidos en array especificando cuáles son

Pues tengo un problemón. Al hacer un var_dump resulta que me envía todos los datos excepto los registros llamados con array (proveedor[x], especie[x], kilos[x], precio[x] y subtotal[x])

¿Qué es lo que puede estar pasando? ¿Tiene algo que ver que el submit lo haga con javascript?
Cita:
function guardarFactura()

{

document.facturacion.target = "frameInvRellenar";
document.facturacion.action = "guardar-factura.php";
document.facturacion.method = "POST";
document.facturacion.submit();

}
En realidad es lo mismo pero con la diferencia que va al frame que yo le digo. no creo que tenga que ver pero pregunto :)

Un saludo y gracias.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #9 (permalink)  
Antiguo 05/03/2009, 16:50
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Juntar registros indefinidos en array especificando cuáles son

Pues habría que ver como los generas, y si están dentro del tag <form> ya que si no lo estan no te los va a enviar.

Saludos
  #10 (permalink)  
Antiguo 05/03/2009, 16:52
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 meses
Puntos: 29
Respuesta: Juntar registros indefinidos en array especificando cuáles son

Los genero con javascript llenando una capa. Pero hay más registros que se generan de la misma forma y sí se envían. Está todo el documento dentro del form.
Las capas interfieren en el form?
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #11 (permalink)  
Antiguo 05/03/2009, 16:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Juntar registros indefinidos en array especificando cuáles son

No deberían, con que esten dentro de los tags <form> y </form> se deben de enviar a PHP, es probable que el código que los genera no los haga dentro del form o no les ponga el atributo correcto.

Te recomiendo que te des una vuelta por el foro de Javascript o sí quieres puedo mover este para que te asesoren más y puedas reparar tu código.

Saludos
  #12 (permalink)  
Antiguo 05/03/2009, 17:00
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 meses
Puntos: 29
Respuesta: Juntar registros indefinidos en array especificando cuáles son

Muchas gracias GatorV, pero creo que no será necesario mover el hilo. Voy a rellenar las capas con php a ver si cambia el tema, ya que con js no se puede hacer más. Las relleno así con js:

Código PHP:
document.getElementById("contenidoFactura").innerHTML+="<div id=registro"+cuantosreg+"><table width=100% style=font-size:8pt; border=0 cellspacing=0 cellpadding=5>
<TR><TD width=18% align=center>"
+proveedor+"<input type=hidden name=proveedor["+cuantosreg+"] value='"+proveedor+"'></TD>
<TD width=18% align=center>"
+especie+"<input type=hidden name=especie["+cuantosreg+"] value='"+especie+"'></TD>
<TD width=18% align=center>"
+kilos+" Kg<input type=hidden name=kilos["+cuantosreg+"] value='"+kilos+"'></TD>
<TD width=18% align=center>$ "
+precio+" / Kg<input type=hidden name=precio["+cuantosreg+"] value='"+precio+"'></TD>
<TD width=18% align=right><b>$ "
+subtotal+"</b><input type=hidden name=subtotal["+cuantosreg+"] value='"+subtotal+"'></TD>
<td width=10% align=center><a href=javascript:eliminarReg("
+cuantosreg+");>Eliminar</a></td></TR></table></div>"
Luego, el problema será al concatenar valores. Voy a probar generando el registro con php y te cuento ok?

Un saludo y mil gracias.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #13 (permalink)  
Antiguo 05/03/2009, 17:09
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Juntar registros indefinidos en array especificando cuáles son

Pues sí que es raro, prueba en diferentes browsers a ver si es un bug especifico del browser que uses.

Saludos
  #14 (permalink)  
Antiguo 05/03/2009, 17:12
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 meses
Puntos: 29
Bueno, utilizo firefox 3.0.6 bajo kubuntu intrepid.En IE no lo puedo probar directamente, pero tampoco me interesa porque la página sólo se va a ejecutar en firefox.

Sigo probando y te comento. Gracias por seguir el hilo :)

He conseguido algo! Volví a la idea de los input text con nombre proveedor1, en vez de proveedor[1]

ahora sí envía los datos. Cuando hago esto
Cita:
for($i = 1; $i < $total; $i++ ) {
$proveedor = $_POST['proveedor'.$i];
$especie = $_POST['especie'.$i];
$kilos = $_POST['kilos'.$i];
$precio = $_POST['precio'.$i];
$subtotal = $_POST['subtotal'.$i];
if(!$proveedor && !$especie){ $error="si"; } else { $error="no";
mysql_query("INSERT INTO registros_facturas (id_factura, proveedor, especie, kilos, precio, subtotal) values (".$_POST['num_fact'].",'".$proveedor."','".$especie."',".$kilos.",".$p recio.",".$subtotal.");");
}
Pasa a $error="no";
pero no inserta los registros!! ¿Cómo es posible?

Bueno, lo he conseguido!!!! ¿Cómo? El código, el siguiente:

Código PHP:
      $total $_POST['cuantosreg'];
      for(
$i 0$i <= $total$i++ ) {
              
$proveedor $_POST['proveedors'.$i];
              
$especie $_POST['especies'.$i];
              
$kilos $_POST['kiloss'.$i];
              
$precio $_POST['precios'.$i];
              
$subtotal $_POST['subtotals'.$i];


    if(
$proveedor=="" && $especie==""){ } else {

            
$numfactura=$_POST['num_fact'];

            
mysql_query("INSERT INTO registros_facturas (id_factura, proveedor, especie, kilos, precio, subtotal) values ('".$_numfactura."', '".$proveedor."', '".$especie."', '".$kilos."', '".$precio."', '".$subtotal."');");

    }
      } 
y lleno los registros con javascript así:

Código:
unction insertar() {

	var proveedor=document.facturacion.proveedor.value;
	var especie=document.facturacion.especie.value;
	var kilos=document.facturacion.kilos.value;
	var precio=document.facturacion.precio.value;
	var subtotal=document.facturacion.subtotal.value;
	var cuantosreg=document.facturacion.cuantosreg.value;
	var total=document.facturacion.total.value;

	cuantosreg=Number(cuantosreg)+1;
	document.facturacion.cuantosreg.value=cuantosreg;

	document.getElementById("contenidoFactura").innerHTML+="<div id='registro"+cuantosreg+"'><table width=100% style=font-size:8pt; border=0 cellspacing=0 cellpadding=5>
<TR><TD width=18% align=center>"+proveedor+"<input type=hidden name=proveedors"+cuantosreg+" id=proveedors"+cuantosreg+" value='"+proveedor+"'></TD>
<TD width=18% align=center>"+especie+"<input type=hidden name='especies"+cuantosreg+"' id='especies"+cuantosreg+"' value='"+especie+"'></TD>
<TD width=18% align=center>"+kilos+" Kg<input type=hidden name='kiloss"+cuantosreg+"' id='kiloss"+cuantosreg+"' value='"+kilos+"'></TD>
<TD width=18% align=center>$ "+precio+" / Kg<input type=hidden name='precios"+cuantosreg+"' id='precios"+cuantosreg+"' value='"+precio+"'></TD>
<TD width=18% align=right><b>$ "+subtotal+"</b><input type=hidden name='subtotals"+cuantosreg+"' id='subtotals"+cuantosreg+"' value='"+subtotal+"'></TD>
<td width=10% align=center><a href=javascript:eliminarReg("+cuantosreg+");>Eliminar</a></td></TR></table></div>";

	total=Number(total)+Number(subtotal);
	total=total.toFixed(2);

	document.facturacion.proveedor.value="";
	document.facturacion.especie.value="";
	document.facturacion.kilos.value="";
	document.facturacion.precio.value="";
	document.facturacion.subtotal.value="0.00";
	document.facturacion.total.value=total;
}
Un saludo y gracias!
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.

Última edición por GatorV; 06/03/2009 a las 09:08
  #15 (permalink)  
Antiguo 06/03/2009, 09:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Juntar registros indefinidos en array especificando cuáles son

si no vas a hacer nada en el if, porque no volteas la condicion para evitar dejar esas llaves abiertas?

Saludos
  #16 (permalink)  
Antiguo 06/03/2009, 10:31
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 meses
Puntos: 29
Respuesta: Juntar registros indefinidos en array especificando cuáles son

Fue exactamente lo que hice (gracias de todos modos), el código lo publiqué nada más conseguirlo. Luego lo mejoré (me quedan muchos detalles aún)

Un saludo y gracias.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
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 05:27.