Nueva pregunta

Pregunta:

Fecha: 08-09-2015 11:26:31 (En Español)

Ejercicio PHP Sesiones.[Resuelta]

Buenas comunidad, tengo un problema para resolver este enunciado

Escriba un formulario que solicite nombres y los almacene en una sesión hasta que el usuario cierre la sesión.

El formulario contiene un campo para escribir un nombre (una o varias palabras).
El formulario muestra los nombres que se han escrito anteriormente.
La página contiene un enlace para cerrar la sesión.


Tengo hecha las siguientes partes.

<?php
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
   <head>
      <title>Ejercicio</title>
      <meta http-equiv="Content-type" content="text/html;charset=UFT-8">
   </head>
   <body>
      <form action="nombre.php" method="get">
         <table align="center" border="0">
            <tr>
               <th colspan="2">Ejercicio Sesiones</th>
            </tr>
            <tr>
               <td>Ingrese su nombre:</td>
               <td><input type="text" name="nombre" /></td>
            </tr>
            <tr>
               <td colspan="2" align="center"><input type="submit" value="Enviar" /></td>
            </tr>
         </table>
      </form>
<?php
  if(!count($_SESSION)) {
     echo 'no hay nombres';
  }
  else {
     foreach($_SESSION as $valor) {
        echo $valor.'<br />';
     }
  }
?>
   </body>
</html>


Donde recibo el dato y vuelvo para el index.php

<?php
session_start();
?>
<html>
   <head>
      <title>Ejercicio</title>
       <meta http-equiv="Content-type" content="text/html;charset=UFT-8">
   </head>
   <body>
<?php
$nombre = $_GET['nombre'];

   $_SESSION['nombre'] = $nombre;
   header("location: index.php");


?>
   </body>
</html>


El problema es que no puedo mostrar los datos una abajo del otro, por que piso lo que hay en $_SESSION['nombre'].

Una idea que se me ocurrio es cuando mando el dato lo guardo en un array y se lo paso a $_SESSION['nombre']

Ejemplo asi

<?php
session_start();


$vector = array(2,3,4,5,6,7);

$_SESSION['nombre'] = $vector;

foreach($_SESSION['nombre'] as $valor) {
   echo $valor.'<br />';
}

?>


Pero no puedo realizarlo, espero su respuesta y desde ya gracias.
Etiquetas: $_SESSION - PHP - Pregunta - Sesión Votos: 1 - Respuestas: 11 - Vistas: 20 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 08-09-2015 12:14:57 Hola
    Hiendo algo rapido.

    Podrias hacerlo con un array multidimensional

    por ejemplo
    <?php
    
     $agenda['nombre'][] = "Pedro";
     $agenda['nombre'][] = "Juan";
     $agenda['nombre'][] = "Luis";  
     
     echo $agenda['nombre'][0]; // pedro
     echo '&nbsp;';
     echo $agenda['nombre'][1]; //Juan 
     echo '&nbsp;';
     echo $agenda['nombre'][2];  // Luis
     
     echo '<br/><br/>';
     
    for($posicion=0;$posicion<count( $agenda['nombre']);$posicion++) {
    echo 'Nombre: ' . $agenda['nombre'][$posicion] . '<br />';
    }


    Resulta algo como:

    Pedro Juan Luis
    ----------------------------------------------------------------------------------------
    Nombre: Pedro
    Nombre: Juan
    Nombre: Luis
    


    Lo único que quedaría es Utilizar el array con las $_SESSION.
    Algo que aun no lo he probado por falta de tiempo
    Espero que te sirva como punto de partida

    Link para visitar

    count PHP (función). Recorrer arreglos o arrays uni o multidimensionales con for y foreach.

    Arrays asociativas y multidimensionales

    Arrays multidimensionales

    Cualquier cosa nos decis

    saludos
      Votos: 1 - Link respuesta
     
  • Fecha: 08-09-2015 12:26:34 Con $_SESSION seria algo asi:

    <?php
    session_start();
    
    // CON SESSION
    echo '<hr/>';
    echo 'Con $_SESSION';
    echo '<br/>';
    
    
    
    $_SESSION['nombre'][] = "Pedro";
    $_SESSION['nombre'][] = "Juan";
    $_SESSION['nombre'][] = "Luis";
    
    
    echo $_SESSION['nombre'][0];
    echo '&nbsp;';
    echo $_SESSION['nombre'][1];
    echo '&nbsp;';
    echo $_SESSION['nombre'][2];


    de todas maneras esperemos respuestas de otros usuarios que tienen mucho mas conocimientos que yo

      Votos: 0 - Link respuesta
     
  • Fecha: 08-09-2015 12:41:10 Hola Walter, gracias por responder usando un array bidimensional creiria que andaria $_SESSION['nombre'][] = $nombre; no piso los datos y se va guardando en la ultima posición.

    <?php
    session_start();
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
       <head>
          <title>Ejercicio</title>
          <meta http-equiv="Content-type" content="text/html;charset=UFT-8">
       </head>
       <body>
          <form action="index.php" method="get">
             <table align="center" border="0">
                <tr>
                   <th colspan="2">Ejercicio Sesiones</th>
                </tr>
                <tr>
                   <td>Ingrese su nombre:</td>
                   <td><input type="text" name="nombre" /></td>
                </tr>
                <tr>
                   <td colspan="2" align="center"><input type="submit" name="submit" value="Enviar" /></td>
                </tr>
             </table>
          </form>
    <?php
    $nombre = $_GET['nombre'];
    
    $_SESSION['nombre'][] = $nombre;
    
    print_r($_SESSION['nombre']);
    
    ?>
       </body>
    </html>


    Pero tengo una duda antes de usar un array de session, uso otro array ejemplo

    <?php
    session_start();
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
       <head>
          <title>Ejercicio</title>
          <meta http-equiv="Content-type" content="text/html;charset=UFT-8">
       </head>
       <body>
          <form action="index.php" method="get">
             <table align="center" border="0">
                <tr>
                   <th colspan="2">Ejercicio Sesiones</th>
                </tr>
                <tr>
                   <td>Ingrese su nombre:</td>
                   <td><input type="text" name="nombre" /></td>
                </tr>
                <tr>
                   <td colspan="2" align="center"><input type="submit" name="submit" value="Enviar" /></td>
                </tr>
             </table>
          </form>
    <?php
    $nombre = $_GET['nombre'];
    
    $vector[] = $nombre;
    
    print_r($vector);
    ?>
       </body>
    </html>


    Por que ahi los pisa, hay alguna lógica?

    ¡Saludos!
      Votos: 0 - Link respuesta
     
  • Fecha: 08-09-2015 14:15:53 Gonzalo, Walter

    Buenas noches:
    ¿Por qué no probar con un explode? y el resultado lo pones uno debajo de otro

    Un saludo
      Votos: 0 - Link respuesta
     
  • Fecha: 09-09-2015 04:14:36 Daniel, gracias por responder y por la idea lo voy aprobar.

    ¡Saludos!
      Votos: 0 - Link respuesta
     
  • Fecha: 09-09-2015 15:07:42 Hola
    En estos momentos no cuento con una pc, estoy desde el móvil y no puedo brindarte la ayuda que mereces. Es complicado escribir en el móvil y en el lugar en donde estoy internet anda mal.
    Y al no tener pc no puedo hacer ninguna prueba de códigos
    Hare lo posible en cooperar en lo que me sea posible.

    Quería saber como va el ejercicio. Que has hecho.
    Por otro lado te aconsejo que utilices en los formularios el método POST en vez de GET

    PD\\ Para valorar nuestra contribución utiliza los votos ;)

    Saludos
      Votos: 0 - Link respuesta
     
  • Fecha: 09-09-2015 17:00:53 Hola Gonzalo, puedes resolver toda la lógica en una misma página, tienes la solución entre todos los comentarios, intenta resolverlo y luego nos cuentas (así obtendrás más provecho). Un comentario rapido para tu código, debes tener en cuenta es que la función header() de PHP no se puede ejecutar después de haber enviado html....
    Saludos!
      Votos: 1 - Link respuesta
     
  • Fecha: 09-09-2015 18:14:34 En realidad no se te estaría pisando los datos.
    Sucede que:
    El array de SESSION los valores se mantiene en memoria hasta que expire la SESSION.
    Por eso es que al recargar la página se mantiene los datos.
    El array sin SESSION los valores se mantiene disponible en esa única ejecución de página, al recargar la página se inicia todo de cero como si la hubieses ejecutado por primera vez.
    La magia que se mantengan los datos no es el array sino la SESSION.
    Si al array le quitas SESSION los datos se perderán, hace la aprueba.

    Básicamente es eso lo que sucede.

    No fui muy técnico que digamos en la explicación, aún así espero que se haya entendido.

    Cualquier cosa nos decís.

    Saludos
      Votos: 2 - Link respuesta
     
  • Fecha: 10-09-2015 04:33:15 Walter, muy buena explicación, hay veces que hay que ser menos técnico para que se entienda de una forma más clara.

    Ahora bien, voy a tratar de poner luz en el punto de "Donde se guardan los datos de SESSION", descubramos la magia detras.

    Lo primero que hay que decir es que las sesiones en PHP por defecto se persiste en ficheros de texto a disco (filesystem).

    La función session_save_path() devuelve la ruta del directorio usado para guardar la información de sesión.

    Para setear el path donde queremos comenzar a guardar esos datos se puede utilizar la función session_save_path() y/o configurar la directiva del archivo 'php.ini' -> 'session.save_path'

    Digo que "por defecto" la sesión se persiste en un fichero de texto porque también se puede persistir en la base de datos, esto es un poco más avanzado, aquí algunas ideas (mirar comentarios de la comunidad) http://php.net/manual/es/function.session-set-save-handler.php

    Info extra:
    El identificador de sesión se propaga por cookie o URL.
    Cookie: se crea una cookie en el cliente, esta es enviada en cada petición del navegador. Nombre de la cookie 'PHPSESSID'.
    URL: si la cookie no esta habilitada en el cliente, se puede enviar el parametro 'PHPSESSID' con el identificador de sesión y ser capturado por GET en el servidor, siempre y cuando PHP tenga habilitada la identificación por URL (session.use_cookies =1, la identificación por URL suele estar deshabilitada porque pueden producir robo de identidad de una forma muy sencilla).

    Saludos,
    Fernando
      Votos: 2 - Link respuesta
     
  • Fecha: 10-09-2015 08:18:14 Excelentes muchachos, muchas gracias por responder y por toda la explicación se lo agradezco mucho.

    Ya lo pude realizar, despues lo que hize fue agregar un checkbox alos nombres ingresados para poder seleccionarlos y borrarlos.

    Index.php

    <?php
    session_start();
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
       <head>
          <title>Ejercicio</title>
          <meta http-equiv="Content-type" content="text/html;charset=UFT-8">
       </head>
       <body>
          <form action="nombre.php" method="post">
             <table align="center" border="0">
                <tr>
                   <th colspan="2">Ejercicio Sesiones</th>
                </tr>
                <tr>
                   <td>Ingrese su nombre:</td>
                   <td><input type="text" name="nombre" /></td>
                </tr>
                <tr>
                   <td colspan="2" align="center"><input type="submit" name="submit" value="Enviar" /></td>
                </tr>
             </table>
          </form>
    <?php
    if(!count($_SESSION)) {
       echo 'No hay nombres';
    }
    else {
       echo '<form action="borrar.php" method="post">
                <ul>';
          foreach($_SESSION['nombre'] as $clave => $valor) {
             echo '<li><input type="checkbox" name="c['.$clave.']" value="'.$valor.'" />'.$valor.'</li>';
          }
       echo '<input type="submit" value="Enviar" />';
      echo '</ul>
       </form>
       ';
    }
    ?>
       </body>
    </html>


    Donde recibo los datos nombre.php

    <?php
    session_start();
    
    function recoge($var) {
          $tmp = (isset($_REQUEST[$var]))
                ? trim(htmlspecialchars($_REQUEST[$var], ENT_QUOTES, "ISO-8859-1"))
                : "";
          return $tmp;
    }
    
    $nombre = recoge('nombre');
    
    if($nombre != "") {
       $_SESSION['nombre'][] = $nombre;
       header("location:index.php");
    }
    else {
       echo 'Error en el nombre';
    }
    ?>


    Archivo Borrar.php donde me llegan los datos del checkbox y despues lo borro.

    <?php
    session_start();
    
    function recogeMatriz($var) {
       $tmp = array();
       if(isset($_REQUEST[$var]) && is_array($_REQUEST[$var]))
          foreach($_REQUEST[$var] as $indice => $valor) {
             $indiceLimpio = trim(htmlspecialchars($indice, ENT_QUOTES, "ISO-8859-1"));
             $valorLimpio = trim(htmlspecialchars($valor, ENT_QUOTES, "ISO-8859-1"));
             $tmp[$indiceLimpio] = $valorLimpio;
          }
       return $tmp;
    }
    
    $matriz = recogeMatriz('c');
    
    if(is_array($matriz)) {
       foreach($matriz as $indice => $valor) {
          if(isset($_SESSION['nombre'][$indice])) {
             unset($_SESSION['nombre'][$indice]);
          }
       }
      header("location:index.php");
      exit();
    }
    else {
       echo 'Error en la Matriz';
    }
    ?>


    Cierro sesión

    <?php
    session_start();
    session_destroy();
    
    header("location:index.php");
    ?>
    


    ¡Saludos!
      Votos: 2 - Link respuesta
     
  • Fecha: 11-09-2015 10:57:55 muchas gracias por compartir el codigo completo de la solución del problema, seguro que a alguien mas le servirá ;)
    Todos aprendemos algo de todos
    Por otro lado sugiero que si ya ha sido resuelto, pasar la pregunta al estado [RESUELTA] ;)
    igualmente en el estado [RESUELTA] se puede seguir comentando.

    Saludos
      Votos: 1 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com