Foros del Web » Programando para Internet » PHP »

Varios datos y foreach

Estas en el tema de Varios datos y foreach en el foro de PHP en Foros del Web. Buenas, Estoy teniendo problemas con un sistemilla que estoy montando. Explico: Tengo un formulario donde aparece una zona llamada Servidores , en esta zona, aparecen ...
  #1 (permalink)  
Antiguo 18/06/2009, 11:24
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 18 años, 1 mes
Puntos: 74
Varios datos y foreach

Buenas,

Estoy teniendo problemas con un sistemilla que estoy montando.
Explico:

Tengo un formulario donde aparece una zona llamada Servidores, en esta zona, aparecen 2 Checkboxes con su correspondientes nombres.
Mediante javascript, hago que cuando se seleccione un checkbox aparezca una caja de texto, o sea, un input text donde el usuario pondra el enlace del servidor.

Luego lo subo a la base de datos utilizando foreach porque el usuario puede escojer 1 o los 2 servidores.
La base mas o menos se queda así:

id = 1
id_servidor = 1
enlace = www.demo.com

id = 2
id_servidor = 2
enlace = www.demo2.com



Todo me funciona correctamente, no me da ningun problema, lo que sucede es que ahora he pensado, ¿y sí un servidor dispone de más enlaces?.
Entonces, se me ha ocurrido poner varios input text. Asi que lo unico que he hecho ha sido agregar un input text más, pero no me ha funcionado, puesto que todo lo demas se sube correctamente, pero el campo enlace SOLO se sube el ultimo enlace que se haya escrito.

Así lo tengo;

Javascript y css para el efecto de ocultación de los input text:
Código 1:
Ver original
  1. <style>
  2. .hideable { position: relative; visibility: visible; }
  3. </style>
  4. <script type="text/javascript">
  5. <!--
  6. function showMe (it, box) {
  7. var vis = (box.checked) ? "block" : "none";
  8. document.getElementById(it).style.display = vis;
  9. }
  10. //-->

Parte del formulario donde se establecen los servidores:
Código 2:
Ver original
  1. <tr>
  2. <td>Servidor:</td>
  3.  <td>
  4.  
  5.                 <?php
  6.                     $sqlServidores=mysql_query("SELECT * FROM oc_servidores ORDER BY id",$conexion);
  7.                     $i=0;
  8.                     while($MostrarFilaServidores=mysql_fetch_array($sqlServidores)){
  9.                     $i++;
  10.                     $ide = $MostrarFilaServidores['id'];
  11.             $nombre = $MostrarFilaServidores['nom_serv'];
  12.  
  13.                 ?>
  14. <input type="checkbox" name="id_serv[<?php echo $MostrarFilaServidores['id_serv']; ?>]" onclick="showMe('div1<?php echo $i ?>', this)" value="<?php echo $MostrarFilaServidores['id_serv']?>"><?php echo $nombre; ?><br />
  15.  
  16. <div id="div1<?php echo $i ?>" style="display:none">
  17. <SPAN ID="contenido" CLASS="hideable">
  18. Enlace:<INPUT TYPE="text" NAME="enlace[<?php echo $MostrarFilaServidores['id_serv']; ?>]" SIZE="15" MAXLENGTH="100"><br>
  19. Enlace:<INPUT TYPE="text" NAME="enlace[<?php echo $MostrarFilaServidores['id_serv']; ?>]" SIZE="15" MAXLENGTH="100"><br>
  20. </FORM>
  21. </SPAN>
  22. </div>
  23.                 <?php
  24.                         }
  25.                 ?>
  26.    
  27.  </td>
  28. </tr>

Y aqui el insert:

Código 3:
Ver original
  1. $id_servidor=$_POST['id_serv'];
  2. $enlaces=$_POST['enlace'];                                      
  3. foreach ($id_servidor as $indice => $valor) {
  4. echo "{$id_servidor[$indice]} : {$enlaces[$indice]}<br />";
  5.  
  6.  
  7. $connection=mysql_connect("localhost","root","pass")
  8. or die("Error conectando a la base de datos");
  9. $db=mysql_select_db("deffer",$connection)
  10. or die ("Error seleccionando la base de datos");
  11. $query="INSERT INTO oc_servers_pel1 (id_servidor,enlace) values ('$id_servidor[$indice]','$enlaces[$indice]')";
  12. $result=mysql_query($query) or die (mysql_error());
  13. }
Como dijé, si tan solo dejo uno:
Enlace:<INPUT TYPE="text" NAME="enlace[<?php echo $MostrarFilaServidores['id_serv']; ?>]" SIZE="15" MAXLENGTH="100"><br>
Me funciona, pero como deje dos, todo me funciona, pero solo se sube el ultimo enlace que se haya escrito.
¿Porque no lo recoje bien?

Muchas gracias, una vez más
  #2 (permalink)  
Antiguo 18/06/2009, 11:36
Avatar de Synkronice  
Fecha de Ingreso: octubre-2007
Ubicación: Madrid
Mensajes: 831
Antigüedad: 17 años, 1 mes
Puntos: 48
Respuesta: Varios datos y foreach

El atributo NAME de los INPUTs debe ser único. Al usar el mismo NAME para los inputs URL del servidor 1, el último 'machaca' al primero.
  #3 (permalink)  
Antiguo 18/06/2009, 12:03
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 18 años, 1 mes
Puntos: 74
Respuesta: Varios datos y foreach

¿Pero entonces como podría hacerlo?

Por que lo que pretendo es que cuando se suba a la base de datos, quede así:

id = 1
id_servidor = 2
enlace = www.demo.com

id= 2
id_servidor = 2
enlace = www.demo2.com

De esta manera tendriamos un mismo servidor con 2 enlaces. Se que tb se puede hacer mediante comas;

id = 1
id_servidor = 2
enlace = www.demo.com, www.demo2.com

Pero asi no me convence, prefiero com la primera que he puesto y por eso lo estoy armando de esa manera.

Pero claro, repito, ¿como hacer eso de los inputs?

Mucahs gracias,
  #4 (permalink)  
Antiguo 18/06/2009, 12:08
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 21 años, 4 meses
Puntos: 21
Respuesta: Varios datos y foreach

pues es claro que los inputs tienen que tener un name que los diferencie uno del otro

<INPUT TYPE="text" NAME="enlace[<?php echo $MostrarFilaServidores['id_serv']; ?>]"

creo que si pones un contador que te indique las diferencia

<INPUT TYPE="text" NAME="enlace[<?php echo $MostrarFilaServidores['id_serv'].'-'.$contador++; ?>]"
__________________
gerardo
  #5 (permalink)  
Antiguo 18/06/2009, 12:12
Avatar de Synkronice  
Fecha de Ingreso: octubre-2007
Ubicación: Madrid
Mensajes: 831
Antigüedad: 17 años, 1 mes
Puntos: 48
Respuesta: Varios datos y foreach

Así NO...

Código HTML:
<input type="text" name="url">
<input type="text" name="url"> 
Así SÍ....

Código HTML:
<input type="text" name="url[1]">
<input type="text" name="url[2]"> 
Nótese el atributo name es diferente en cada INPUT, ya que si pones el mismo name en ambos INPUT el último reemplaza al primero.

Saludos!
  #6 (permalink)  
Antiguo 18/06/2009, 12:16
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 21 años, 4 meses
Puntos: 21
Respuesta: Varios datos y foreach

yo normalmente los uso asi

como indica el amigo Synkronice o tambien asi

Código:
<input type="text" id="id_title" class="vTextField required" name="item_title[]" size="30" value="Titulo" maxlength="200" />

<input type="file" id="id_image" class="vTextField required" name="item_image[]" size="30" value="" maxlength="200" />

<textarea name="item_text[]" rows="10" cols="60" class="mceSimple">Texto</textarea>
saludos
__________________
gerardo
  #7 (permalink)  
Antiguo 18/06/2009, 15:19
Avatar de alguienmas  
Fecha de Ingreso: mayo-2009
Mensajes: 62
Antigüedad: 15 años, 6 meses
Puntos: 8
Respuesta: Varios datos y foreach

opcion personal, yo lo pondria como un array de 2-dimensiones asi:

Código HTML:
Enlace:<INPUT TYPE="text" NAME="enlace[<?php echo $MostrarFilaServidores['id_serv']; ?>][]" SIZE="15" MAXLENGTH="100"><br> 
y lo recorres asi:

Código PHP:
$id_servidor=$_POST['id_serv'];
$enlaces=$_POST['enlace'];
foreach (
$id_servidor as $indice => $valor
      foreach(
$enlaces[$indice] as $link)
                  echo 
"{$id_servidor[$indice]} : {$link}<br />"
bueno solo es otra opcion
  #8 (permalink)  
Antiguo 19/06/2009, 07:16
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 18 años, 1 mes
Puntos: 74
Respuesta: Varios datos y foreach

Synkronice, lo de:
Cita:
<input type="text" name="url[1]">
, ya lo estoy haciendo con esto, ¿no?:
Cita:
Enlace:<INPUT TYPE="text" NAME="enlace[<?php echo $MostrarFilaServidores['id_serv']; ?>]" SIZE="15" MAXLENGTH="100"><br>
Con eso lo que hago es identificar a que servidor pertenece cada enlace.

Al margen de esto, de la manera que lo ha puesto alguienmas, parece que me empieza funcionar pero no del todo.

Antes de nada, asi lo tengo ahora:


Código Mostramos servidores:
Ver original
  1. <tr>
  2. <td>Servidor:</td>
  3. <td>
  4. <?php
  5.  
  6. $sqlServidores=mysql_query("SELECT * FROM oc_servidores ORDER BY id",$conexion);
  7.  
  8. $i=0;
  9.  
  10. while($MostrarFilaServidores=mysql_fetch_array($sqlServidores)){
  11.  
  12. $i++;
  13.  
  14. $ide = $MostrarFilaServidores['id'];
  15.  
  16.  $nombre = $MostrarFilaServidores['nom_serv'];
  17.  ?>
  18.  
  19. <input type="checkbox" name="id_serv[<?php echo $MostrarFilaServidores['id_serv']; ?>]" onclick="showMe('div1<?php echo $i ?>', this)" value="<?php echo $MostrarFilaServidores['id_serv']?>"><?php echo $nombre; ?><br />
  20.  
  21. <div id="div1<?php echo $i ?>" style="display:none">
  22. <SPAN ID="contenido" CLASS="hideable">
  23.  
  24. Enlace:<INPUT TYPE="text" NAME="enlace[<?php echo $MostrarFilaServidores['id_serv']; ?>][]" SIZE="15" MAXLENGTH="100"><br>
  25.  
  26. Enlace:<INPUT TYPE="text" NAME="enlace[<?php echo $MostrarFilaServidores['id_serv']; ?>][]" SIZE="15" MAXLENGTH="100"><br>
  27.  
  28. </FORM>
  29. </SPAN>
  30. </div>
  31.  
  32. <?php
  33.  }
  34.  
  35.  ?>
  36. </td>
  37. </tr>

Código Aqui el insert:
Ver original
  1. $id_servidor=$_POST['id_serv'];
  2. $enlaces=$_POST['enlace'];
  3. foreach ($id_servidor as $indice => $valor) {
  4.       foreach($enlaces[$indice] as $link) {
  5.                   echo "{$id_servidor[$indice]} : {$link}<br />";  
  6.      
  7.  
  8.       $connection=mysql_connect("localhost","root","pass")
  9.  
  10.       or die("Error conectando a la base de datos");
  11.  
  12.       $db=mysql_select_db("deffer",$connection)
  13.  
  14.       or die ("Error seleccionando la base de datos");
  15.  
  16.       $query="INSERT INTO oc_servers_pel1 (id_servidor,enlace) values ('$id_servidor[$indice]','$link')";
  17.  
  18.       $result=mysql_query($query) or die (mysql_error());
  19.       }
  20.       }

¿Que sucede ahora?, pues se podría decir que me funciona, pero no del todo, puesto que si por ejemplo, selecciono el primer servidor, y relleno los dos inputs que hay, y luego a continuación selecciono el segundo servidor y SOLO relleno un input (el otro lo dejo vacio)
Ejemplo:


Al subirse a la base de datos, queda asi:

id = 1
id_servidor = 1
enlace = www.demo.com

id = 2
id_servidor = 1
enlace = www.demo2.com

id = 3
id_servidor = 2
enlace = www.ejemplo.com

id = 4
id_servidor = 2
enlace =

O sea que, se sube correctamente, pero si hay un input que queda vacio, pues tambien se sube . ¿Como lo puedo solucionar?

Bueno, al menos se va progesando

Muchas gracias, a todos una vez más
  #9 (permalink)  
Antiguo 19/06/2009, 08:23
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 21 años, 4 meses
Puntos: 21
Respuesta: Varios datos y foreach

pues creo que solo tienes que validar si el valor que viene vacio de la posicion del array que enviaste por post no lo inserte
__________________
gerardo
  #10 (permalink)  
Antiguo 20/06/2009, 09:12
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 18 años, 1 mes
Puntos: 74
Respuesta: Varios datos y foreach

Realizado!! =)

Lo he dejado tal cual lo tengo en el último mensaje pero le he añadido tan solo esto:

Código validar:
Ver original
  1. if($link==NULL) {
  2.     echo "Vacio";
  3. }else{
  4.  //Insert....
  5.  //etc...

Muchas GRACIAS A TODOS
  #11 (permalink)  
Antiguo 20/06/2009, 09:15
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 18 años, 1 mes
Puntos: 74
Varios resultados con Foreach

Buenas,

Tengo una base donde muestro unos servidores y el enlace o enlaces correspondientes a los mismo.

Por ejemplo:

id = 1
id_servidor = 1 (Servidor A)
enlace = www.demo.com

id = 2
id_servidor = 1 (Servidor A)
enlace = www.demo2.com

id = 3
id_servidor = 2 (Servidor B)
enlace = www.ejemplo.com

Como se puede observar, los servidores pueden tener varios enlaces como el caso del servidor A, o solo uno como el servidor B.

Entonces, lo que necesito es mostrarlos por pantalla.
Hago lo siguiente:
Código Ejemplo:
Ver original
  1. $sql2 = mysql_query("SELECT * FROM oc_servidores_2 where idp='$t' ORDER BY id",$conexion);
  2. $data = array();
  3. while ($row2 = mysql_fetch_assoc($sql2))  $data[$row2['img_servidor']] = $row2['enlace_servidor'];
  4.  
  5. {
  6. $idSERVIDOR = $row2['id_servidor'];
  7. $nombreSERVIDOR= $row2['nombre_servidor'];
  8. $imgSERVIDOR = $row2['img_servidor'];
  9. $enlace_SPEL = $row2['enlace_servidor'];
  10. }
  11.  
  12. <?php                                      
  13. foreach($data as $var => $val)
  14. {
  15. echo "
  16. <div id='contenedor_servidores'>
  17. <div id='mostrar_servidores'>
  18. <span style='position:absolute; left: 75px; top:0px;'>$var</span> <INPUT TYPE='text' NAME='NIPUTAIDEA' SIZE='35' MAXLENGTH='100' VALUE='".$val."'>
  19. </div></div>";
  20. }
  21. ?>

Como veís utilizo un foreach... ¿que sucede?, que solo se muestra el último enlace insertado.

O sea, que si en la base hay esto:
id = 1
id_servidor = 1 (Servidor A)
enlace = www.demo.com

id = 2
id_servidor = 1 (Servidor A)
enlace = www.demo2.com

id = 3
id_servidor = 2 (Servidor B)
enlace = www.ejemplo.com

Del servidor A, solo se muestra el enlace www.demo2.com y del servidor B, como solo hay uno, pues se muestra tan solo ese.

¿Como puedo hacerlo para que se muestren bien? Es cosa de sacarlos de otra manera con foreach ?

Muchas gracias
  #12 (permalink)  
Antiguo 20/06/2009, 10:33
Avatar de Avatar810  
Fecha de Ingreso: agosto-2007
Ubicación: Por rumbos Regios
Mensajes: 485
Antigüedad: 17 años, 3 meses
Puntos: 23
Respuesta: Varios resultados con Foreach

primero revisa si tu arreglo $data contiene todos los valores que tu esperas
antes del foreach escribe

<?php
print_r($data ); echo "<br><br>";
foreach($data as $var => $val)
...
?>

eso mandara imprimir a pantalla todo el contenido de tu vector $data

esto lo digo pq me llama la atencion la asignacion de posiciones al llenar tu arreglo "$data[$row2['img_servidor']]" desconozco si img_servidor es igual o diferente para servidor A pero si es el mismo, seguramente estas sobreescribiendo en la misma casilla (por lo que solo deja el ultimo)
__________________
Una demo siempre funcionará correctamente hasta que toque algo tu (hasta ahora) cliente.
Avatar810
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 22:33.