Foros del Web » Programando para Internet » PHP »

foreach

Estas en el tema de foreach en el foro de PHP en Foros del Web. Hola a todos, tengo un problema estoy haciendo un sistema para encuestas, donde el usuario introduce el nombre de la encuesta y el numero de ...
  #1 (permalink)  
Antiguo 21/07/2009, 13:02
 
Fecha de Ingreso: julio-2009
Mensajes: 13
Antigüedad: 14 años, 9 meses
Puntos: 0
foreach

Hola a todos, tengo un problema estoy haciendo un sistema para encuestas, donde el usuario introduce el nombre de la encuesta y el numero de preguntas a realizar dentro de esta, despues me manda a otro formulario donde se guarda la encuesta en una bd mysql, y en ese mismo formulario creo dos input text uno para colocar la pregunta y otro para colocar el numero de respuestas de la pregunta

Código PHP:
<?php /* Created on: 20/07/2009 */      
require('conexion_bd.php');    
    
$tit $_POST["tit"];
    
$tot_preg $_POST["tot_preg"];     

    
//Obtenemos la fecha del sistema
    
$fecha date("d-m-Y");
    
    
$sql "INSERT INTO encuestas (titulo, total_preg, fecha) VALUES ('$tit', '$tot_preg', '$fecha') ";
    
$sql mysql_query($sql) or die ("No fue posible agregar la encuesta");    
                         
    
$sqla "SELECT total_preg FROM encuestas WHERE id_titulo=(SELECT max(id_titulo) FROM encuestas)";
    
$sqlb mysql_query($sqla) or die ("No fue posible seleccionar la encuesta");
    
$row=mysql_result($sqlb0);
    
$tot=$row;
    
            
           
?>
<html>
    <head> <title>  </title> </head>
    <body bgcolor="#A6BDD4">
        <br>
        <form action="encuesta3.php" method="post">
                 <table width=35% border="0" align=center cellpadding=0 background="engranes.jpg">
                    <tr> <td colspan="2"> <font color="#0662AD"> <b><div style="text-align: center">Registro de Preguntas</div></b> </font> </td> </tr>
                    <tr> <td colspan="2"> <br> <br></td> </tr> 
                    <?php
                          
for($i=1;$i<=$tot;$i++){ 
                        
?>  
                    
                    <tr> 
                        <td align="center" height="4" width="50%"> <font color="#0662AD"> <b>Pregunta<?php echo $i?></b> </font> </td> 
                        <td align="left" height="4" width="50%"><input type="text" name="p[]" size="20%"></td>
                    </tr>
                    <tr> 
                        <td align="center" height="4" width="50%"> <font color="#0662AD"> <b>Total de Respuestas <?php echo $i;?>:</b> </font> </td> 
                        <td align="left" height="4" width="50%"><input type="text" name="tot_resp[]" size="3%"></td>
                    </tr>
                    <tr> <td colspan="2"> <br> </td> </tr>
                    <?php ?>
                    <tr> <td colspan="2"> <br> </td> </tr>
                 <tr>
                    <td align="center" height="4" colspan="2"> <input type="submit" name="Guardar" value="Enviar"> </td>
                    
                </tr>
            
            </table> 
            

        </form>
            
    </body>
</html>
despues de esto en el siguiente formulario intento guardar los datos del los dos input text en la tabla preguntas
pero al hacer esto me duplica los registros y es por ke en el foreach hace las iteraciones necesarias, para que entiendan mejor:

Código PHP:
<?php /* Created on: 20/07/2009 */
require('conexion_bd.php');    

$sqld "SELECT total_preg FROM encuestas WHERE id_titulo=(SELECT max(id_titulo) FROM encuestas)";
$sqle mysql_query($sqld) or die ("No fue posible seleccionar la encuesta");
$rowf=mysql_result($sqle0);
$totg=$rowf;

$sqla "SELECT max(id_titulo) FROM encuestas";
$sqlb mysql_query($sqla);
$row=mysql_result($sqlb0);
$id=$row;

 
foreach(
$_POST['p'] as $preg)
{
    foreach (
$_POST['tot_resp'] as $tot)
    { 
        
$sql "INSERT INTO preguntas(id_titulo, pregunta, total_resp) VALUES ('$id' , '$preg', '$tot')";
        
$sql mysql_query($sql);
    }
}

?>
Como podria hacerle para resolver esto, agradezco su ayuda de antemano
  #2 (permalink)  
Antiguo 21/07/2009, 13:11
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: foreach

Tema transladado desde el foro de MySQL.

Véase: http://www.forosdelweb.com/f21/funci...-datos-413499/
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 21/07/2009, 13:43
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: foreach

De casualidad tu quieres que por cada $_POST["p"] se ingrese los mismos valores de $_POST["tot_resp"]. Ejemplo

$_POST["p"] es igual a array(1,2,3)
$_POST["tot_resp"] es igual a array(4,5,6)

Por lo tanto haciendo el foreach como tu lo haces esta escribiendo esto

$preg, $tot
1,4
1,5
1,6
2,4
2,5
2,6
3,4
3,5
3,6

¿Eso es lo que tu quieres o no que haga?
  #4 (permalink)  
Antiguo 21/07/2009, 14:31
 
Fecha de Ingreso: julio-2009
Mensajes: 13
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: foreach

no, has de cuenta tengo una tabla que tiene los campos id_preg, id_titulo, pregunta y total_resp entoces yo kiere que me agregue un solo registro por dos foreach, es decir:


FORMA CORRECTA
1 1 Cual es tu nombre 2
2 1 Donde Vives 3

y de esa forma lo ke me hace es esto:

FORMA INCORRECTA
1 1 Cual es tu nombre 2
2 1 Cual es tu nombre 3
3 1 Donde Vives 2
4 1 Donde Vives 3

me los duplica ya lo se pero no se como hacerlo de otra forma

NO HAY ALGUNA FORMA PARA QUE LO HAGA ASI:

Código PHP:
foreach(($_POST['p'] as $preg) AND ($_POST['tot_resp'] as $tot)) 
Tambien estaba pensando hacer el primer foreach el del array $p el insert asi

Código PHP:
foreach($_POST['p'] as $preg)
{
   
$sql "INSERT INTO preguntas(id_titulo, pregunta, total_resp) VALUES ('$id' ,   '$preg', 0)";
       
$sql mysql_query($sql);
    

y despues de esto hacer una busqueda de los ultimos registros insertados en la tabla preguntas con el ultimo id_titulo y hacer un select max(id_titulo) from preguntas

y de aki otra consulta para obtener todos aquellos registros que contengan este id_titulo y a estos hacerle un update a la tabla preguntas al campo total_resp, con e foreach pero no me sale

Última edición por Said012784; 21/07/2009 a las 14:44
  #5 (permalink)  
Antiguo 21/07/2009, 14:42
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: foreach

Bueno si hay la misma cantidad de valores en $_POST["p"] y $_POST["tot_resp"] lo mejor entonces sería verificar con un conteo y luego insertar con un for. Ejemplo

Código PHP:
//El if es para que verifique si hay la misma cantidad de respuesta y preguntas.  Esto es opcional
if(count($_POST["p"]) == count($_POST["tot_resp"])){
   for(
$i 0$i count($_POST["p"]); $i++){
    echo 
$_POST["p"][$i] . ", " $_POST["tot_resp"][$i]."<br />";
  }

  #6 (permalink)  
Antiguo 21/07/2009, 14:49
 
Fecha de Ingreso: julio-2009
Mensajes: 13
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: foreach

el detalle que una encuesta puede ser de 4,6,8,...,n preguntas y por ejemplo tambien hasta n respuestas, o sea puede suceder que tengan el mismo numero de preguntas y respuestas en algunos casos y en otros no, edite tambien el mensaje de arriba de tu respuesta para que veas tambien como intente y como le hice, pero aun no me sale
  #7 (permalink)  
Antiguo 21/07/2009, 14:59
 
Fecha de Ingreso: julio-2009
Mensajes: 13
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: foreach

Para que me entiendas pongo mis scripts
el primero encuesta.php, aqui pregunto al usuario como se llamara la encuesta y de cuantas preguntas sera la encuesta:

Código PHP:
<?php /* Created on: 20/07/2009 */ ?>
<html>
    <head> <title>  </title> </head>
    <body bgcolor="#A6BDD4">
        <br>
        <form action="encuesta2.php" method="post">
                 <table width=35% border="0" align=center cellpadding=0 background="engranes.jpg">
                    <tr> <td colspan="2"> <font color="#0662AD"> <b><div style="text-align: center">Registro de Encuestas</div></b> </font> </td> </tr>
                    <tr> <td colspan="2"> <br> <br></td> </tr>  
                    <tr> 
                        <td align="center" height="4" width="50%"> <font color="#0662AD"> <b>Titulo de la Encuesta:</b> </font> </td> 
                        <td align="left" height="4" width="50%"><input type="text" name="tit" size="20%"></td>
                    </tr>
                    <tr> <td colspan="2"> <br></td> </tr> 
                    <tr> 
                        <td align="center" height="4" width="50%"> <font color="#0662AD"> <b>Total de Preguntas:</b> </font> </td> 
                        <td align="left" height="4" width="50%"><input type="text" name="tot_preg" size="3%"></td>
                    </tr>
                    <tr> <td colspan="2"> <br> </td> </tr>
                 <tr>
                    <td align="center" height="4" colspan="2"> <input type="submit" name="Guardar" value="Enviar" onClick="validar(this.form)"> </td>
                </tr>
            </table>
        </form>
        
        <!-- Validaciones de captura  -->
        <script LANGUAGE="JavaScript">
           
           
           function validar(form)
               {
                if (form.tit.value == "")
                 { 
                     alert("Por favor introduzca el nombre de la encuesta a registrar");
                    form.tit.focus(); 
                    return;
                }
                if (form.tot_preg.value == "")
                 { 
                     alert("Por favor introduzca el total de preguntas a registrar");
                    form.tot_preg.focus(); 
                    return;
                }
                if(confirm('¿Desea enviar la información proporcionada al siguiente formulario?'))  
                   form.submit();     
                 else return;
                
                
            }
        </script>        
    </body>
</html>
luego esta información la mando al script encuesta2.php, aqui recibo la informacion del script anterior y guardo el nombre de la encuesta y el total de preguntas y le pregunto al usuario cuales son sus preguntas y cuantas respuestas quiere por pregunta

Código PHP:
<?php /* Created on: 20/07/2009 */      
require('conexion_bd.php');    
    
$tit $_POST["tit"];
    
$tot_preg $_POST["tot_preg"];     

    
//Obtenemos la fecha del sistema
    
$fecha date("d-m-Y");
    
    
$sql "INSERT INTO encuestas (titulo, total_preg, fecha) VALUES ('$tit', '$tot_preg', '$fecha') ";
    
$sql mysql_query($sql) or die ("No fue posible agregar la encuesta");    
                         
    
$sqla "SELECT total_preg FROM encuestas WHERE id_titulo=(SELECT max(id_titulo) FROM encuestas)";
    
$sqlb mysql_query($sqla) or die ("No fue posible seleccionar la encuesta");
    
$row=mysql_result($sqlb0);
    
$tot=$row;
    
            
           
?>
<html>
    <head> <title>  </title> </head>
    <body bgcolor="#A6BDD4">
        <br>
        <form action="encuesta3.php" method="post">
                 <table width=35% border="0" align=center cellpadding=0 background="engranes.jpg">
                    <tr> <td colspan="2"> <font color="#0662AD"> <b><div style="text-align: center">Registro de Preguntas</div></b> </font> </td> </tr>
                    <tr> <td colspan="2"> <br> <br></td> </tr> 
                    <?php
                          
for($i=1;$i<=$tot;$i++){ 
                        
?>  
                    
                    <tr> 
                        <td align="center" height="4" width="50%"> <font color="#0662AD"> <b>Pregunta<?php echo $i?></b> </font> </td> 
                        <td align="left" height="4" width="50%"><input type="text" name="p[]" size="20%"></td>
                    </tr>
                    <tr> 
                        <td align="center" height="4" width="50%"> <font color="#0662AD"> <b>Total de Respuestas <?php echo $i;?>:</b> </font> </td> 
                        <td align="left" height="4" width="50%"><input type="text" name="tot_resp[]" size="3%"></td>
                    </tr>
                    <tr> <td colspan="2"> <br> </td> </tr>
                    <?php ?>
                    <tr> <td colspan="2"> <br> </td> </tr>
                 <tr>
                    <td align="center" height="4" colspan="2"> <input type="submit" name="Guardar" value="Enviar"> </td>
                    
                </tr>
            
            </table> 
            

        </form>
            
    </body>
</html>
y esto lo mando al script encuesta3.php, aqui es donde estan los foreach, y en este capturar la informacion en la tabla preguntas y pedirle al usuario las respuestas de cada pregunta solicitada anteriormente

Código PHP:
<?php /* Created on: 20/07/2009 */
require('conexion_bd.php');    

$sqld "SELECT total_preg FROM encuestas WHERE id_titulo=(SELECT max(id_titulo) FROM encuestas)";
$sqle mysql_query($sqld) or die ("No fue posible seleccionar la encuesta");
$rowf=mysql_result($sqle0);
$totg=$rowf;

$sqla "SELECT max(id_titulo) FROM encuestas";
$sqlb mysql_query($sqla);
$row=mysql_result($sqlb0);
$id=$row;

 
foreach(
$_POST['p'] as $preg)
{
    foreach (
$_POST['tot_resp'] as $tot)
    { 
        
$sql "INSERT INTO preguntas(id_titulo, pregunta, total_resp) VALUES ('$id' , '$preg', '$tot')";
        
$sql mysql_query($sql);
    }
}

?>
<html>
    <head> <title>  </title> </head>
    <body bgcolor="#A6BDD4">
        <br>
        <form action="encuesta4.php" method="post">
                 <table width=35% border="0" align=center cellpadding=0 background="engranes.jpg">
                    <tr> <td colspan="2"> <font color="#0662AD"> <b><div style="text-align: center">Registro de Respuestas</div></b> </font> </td> </tr>
                    <tr> <td colspan="2"> <br> <br></td> </tr>
                    <?php for($i=1;$i<=$tot;$i++){ ?>  
                    <tr> 
                        <td align="center" height="4" width="50%"> <font color="#0662AD"> <b>Respuesta <?php echo $i?></b> </font> </td> 
                        <td align="left" height="4" width="50%"><input type="text" name="r<?php echo $i;?>" size="20%"></td>
                    </tr>
                    <tr> <td colspan="2"> <br> </td> </tr>
                    <?php ?>
                    <tr> <td colspan="2"> <br> </td> </tr>
                 <tr>
                    <td align="center" height="4" colspan="2"> <input type="submit" name="Guardar" value="Enviar"> </td>
                </tr>
            </table> 
            <input name="tit" type="hidden" value="<?php echo $tit;?>">
            <input type="hidden" name="tot_preg" value="<?php echo $tot_preg;?>">
            <input type="hidden" name="p" value="<?php echo $tot_preg;?>">

        </form>
            
    </body>
</html>

donde esta el codigo html todavia esta mal ese no lo he revisado ahorita solamente estoy con lo de php lo que esta al principio

Última edición por Said012784; 21/07/2009 a las 15:08
  #8 (permalink)  
Antiguo 21/07/2009, 15:14
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: foreach

Entendi. Pero tienes un pequeño problema como el codigo sabe que respuesta le corresponde a que pregunta. ¿Podrias escribir lo que te sale con esto?

echo "<pre>";
print_r($_POST["p"]);
print_r($_POST['tot_resp']);
echo "</pre>";

Es para saber como la tienes declarado
  #9 (permalink)  
Antiguo 21/07/2009, 15:31
 
Fecha de Ingreso: julio-2009
Mensajes: 13
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: foreach

me imprime esto

Array
(
[0] => como me llamo
[1] => como te llamas
)
Array
(
[0] => 2
[1] => 3
)


es decir que para el primer registro quiero ke kede en el campo pregunta [0] => como me llamo y en total_resp [0] => 2
y para el segundo registro [1] => como te llamas y [1] => 3

Y en el html del script 3 me deberia de mandar 2 input text de la primera pregunta y 3 de la segunda

como puedo hacerle para jalr esas posiciones del array es decir la 0 con la 0, la 1 con la1, la 2 con las 2, la n con la n

Última edición por Said012784; 21/07/2009 a las 15:41
  #10 (permalink)  
Antiguo 21/07/2009, 15:45
 
Fecha de Ingreso: julio-2009
Mensajes: 13
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: foreach

otro ejemplo

Array
(
[0] => como me llamo
[1] => como te llamas
[2] => como nos llamamos
)
Array
(
[0] => 3
[1] => 2
[2] => 4
)
  #11 (permalink)  
Antiguo 21/07/2009, 15:48
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: foreach

Viendo los dos codigos que copiaste, lo que te habia indicado anteriormente funciona. Me tendrias que dar un ejemplo que haya mas de una respuesta por pregunta. Pero aun así, si existiera una pregunta que tienes 2 o mas respuestas, no veo como podríamos indicar que respuestas corresponden a que pregunta. Vas a tener que modificar el codigo que envia la información que añada una columna extra en el array indicando que respuesta corresponde a que pregunta. Pero mientras tanto veo que el codigo que te escribi hace lo que tu pides
  #12 (permalink)  
Antiguo 21/07/2009, 15:53
 
Fecha de Ingreso: julio-2009
Mensajes: 13
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: foreach

tu dices haciendo esto
Código PHP:
<?php
                          
for($i=1;$i<=$tot;$i++){ 
                        
?>  
                    
                    <tr> 
                        <td align="center" height="4" width="50%"> <font color="#0662AD"> <b>Pregunta<?php echo $i?></b> </font> </td> 
                        <td align="left" height="4" width="50%"><input type="text" name="p<?php echo $i?>[]" size="20%"></td>
                    </tr>
                    <tr> 
                        <td align="center" height="4" width="50%"> <font color="#0662AD"> <b>Total de Respuestas <?php echo $i;?>:</b> </font> </td> 
                        <td align="left" height="4" width="50%"><input type="text" name="tot_resp<?php echo $i?>[]" size="3%"></td>
                    </tr>
<tr> <td colspan="2"> <br> </td> </tr>
                    <?php ?>
o

esto

Código PHP:
<?php
                          
for($i=1;$i<=$tot;$i++){ 
                        
?>  
                    
                    <tr> 
                        <td align="center" height="4" width="50%"> <font color="#0662AD"> <b>Pregunta<?php echo $i?></b> </font> </td> 
                        <td align="left" height="4" width="50%"><input type="text" name="p[0,0]" size="20%"></td>
                    </tr>
                    <tr> 
                        <td align="center" height="4" width="50%"> <font color="#0662AD"> <b>Total de Respuestas <?php echo $i;?>:</b> </font> </td> 
                        <td align="left" height="4" width="50%"><input type="text" name="tot_resp[0,0]" size="3%"></td>
                    </tr>
                    <tr> <td colspan="2"> <br> </td> </tr>
                    <?php ?>
  #13 (permalink)  
Antiguo 21/07/2009, 15:58
 
Fecha de Ingreso: julio-2009
Mensajes: 13
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: foreach

como jalas lo ke tienes en la pocicion 0 del primer aarray con la pocision 0 del segundo array para el primer registro
  #14 (permalink)  
Antiguo 21/07/2009, 15:58
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: foreach

Ninguno de los dos. Cuando declares el nombre de un campo tienes que declararlo
name="p[]" y name="tot_resp[]"

Pero como sigo notando por cada pregunta solo tiene un respuesta. Hasta ahora sigue funcionando el codigo. ¿De casualidad tienes algun ejemplo que te hayan escrito diferentes respuestas a una misma pregunta?
  #15 (permalink)  
Antiguo 21/07/2009, 16:46
 
Fecha de Ingreso: julio-2009
Mensajes: 13
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: foreach

no, o sea tu dices por ejmplo que para la pregunta uno tiene 3 res´puestas y mas adelante la misma pregunta mas respuestas
no, no tengo ese problema.
solamente mi duda es como jalo el valor del primer array en la pocion 0 con el valor de la posicion 0 del segundo array para hacer el primer registro y luego el segundo registro y asi sucesivamente
  #16 (permalink)  
Antiguo 21/07/2009, 16:47
 
Fecha de Ingreso: julio-2009
Mensajes: 13
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: foreach

de hecho la variable tot_resp solo es para saber cuantas respuestas posibles tiene esa pregunta
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 17:01.