Ayuda con PHP (principiante)

Estoy aprendiendo a usar $_POST y $_GET y tal, el caso es que quiero hacer una página con un formulario que vuelva a sí misma mostrando operaciones numéricas, como una calculadora para practicar. Pasar los valores de los campos input es sencillo porque luego los cojo con $_POST y ale.

El caso es que quiero también sacar un número aleatorio (con rand) cuando llegue a la página, y que cuando lance el submit del formulario, ese número se mantenga. La idea es que lo meto en una variable, por ejemplo
$aleatorio = rand (1,10);


Ahora llega el cómo mantenerlo. Sé que existen las condiciones isset, empty, etc, pero lo que no sé es cómo pasar el valor de la variable cuando haga el submit. Creo que puedo hacerlo convirtiéndola en una variable de sesión ($_SESSION), pero eso supondría que tengo que cerrar el navegador y abrirlo cada vez que quiera que el número cambie, y lo suyo es que cambie cada vez que vuelva a la página, pero no cuando haga el submit.

¿Hay alguna forma "normal" (no engorrosa) de hacer eso? ¿O lo normal es que lo haga como variable de sesión y si necesito cambiarlo lo fuerce por ejemplo con otro botón? ¿O sería normal pasarlo a través de un input de tipo hidden o algo así?

Menudo cacao :-?
Lo que comenta el compañero es la mejor solución, meter un input hidden en el formulario con el valor aleatorio.
Y en la página que recibe el post leerlo como un campo más del formulario.

Saludos!
Zustaub escribió:En el formulario puedes usar:

<input type="hidden" name="numero_aleatorio" value="<?php echo rand(1, 10); ?>">


y en la pagina de destino:

<?php $numero_aleatorio_recibido = $_POST['numero_aleatorio']; ?>




@Zustaub @B4HaMuT : Entonces no iba yo mal encaminado, pero tal y como está ahí puesto entiendo que el valor aleatorio llega a la página de destino pero una vez se ha cargado la página de destino, el valor del campo oculto es un nuevo aleatorio y una vez hagamos otro submit, estaremos trabajando con el nuevo aleatorio, ¿correcto? El tema es que la primera vez se cargue y luego se mantenga. Lo estoy intentando programar así pero no lo consigo:
<?php
        if (empty($_POST)){
            $numero_aleatorio = rand(1,10);
            print $numero_aleatorio;
        }else{
            $numero_aleatorio= $_POST["numero_aleatorio"];
            print $numero_aleatorio;
        }
        ?>
       
        <form action="" method="post">
            <input type="hidden" name="numero_aleatorio"
                   value=<?php $numero_aleatorio;?>>
<input type="submit" name="submit" value="Submit"/>
</form>
Si quieres que se mantenga, o usas sesiones o lo almacenas en algún lado (bbdd o fichero). No te queda otra.
Variables de sesión serán, muchas gracias a todos :)
ramulator escribió:pero tal y como está ahí puesto entiendo que el valor aleatorio llega a la página de destino pero una vez se ha cargado la página de destino, el valor del campo oculto es un nuevo aleatorio y una vez hagamos otro submit

Un if tío, un if xD

Si no hay nada lo generas la primera vez, sino que se quede asignado el mismo.
Al margen de la pregunta, $_POST no está obsoleto en favor de $_REQUEST?
cipoteloth escribió:Al margen de la pregunta, $_POST no está obsoleto en favor de $_REQUEST?

Me da que es al reves XD
@ramulator cada peticion web, carga el interprete php, tu codigo, la entrada (el request del cliente) y en base a ello devuelve una respuesta. (bueno, no del todo, pero si)

como puedes almacenar algo entre peticion y peticion? en principio no puedes. por eso se usan ñapas de una u otra forma.

puedes guardarlo asociado a la sesion, ya sea en disco, en una db o en un memoria usando servicios auxiliares (redis, memcached etc), devolverselo al cliente en tu respuesta para que te lo pase de vuelta en la siguiente peticion, guardarlo en una tabla de una base de datos, en una key en redis... pero basicamente las variables que crees durante el procesado de una peticion se destruyen justo despues de que devuelvas la respuesta (otra vez, puede que no, php-fpm por ejemplo puede seguir la ejecucion tras el response).

hazte a la idea porque es algo basico en php xD
ramulator escribió:
@Zustaub @B4HaMuT : Entonces no iba yo mal encaminado, pero tal y como está ahí puesto entiendo que el valor aleatorio llega a la página de destino pero una vez se ha cargado la página de destino, el valor del campo oculto es un nuevo aleatorio y una vez hagamos otro submit, estaremos trabajando con el nuevo aleatorio, ¿correcto? El tema es que la primera vez se cargue y luego se mantenga. Lo estoy intentando programar así pero no lo consigo:
<?php
        if (empty($_POST)){
            $numero_aleatorio = rand(1,10);
            print $numero_aleatorio;
        }else{
            $numero_aleatorio= $_POST["numero_aleatorio"];
            print $numero_aleatorio;
        }
        ?>
       
        <form action="" method="post">
            <input type="hidden" name="numero_aleatorio"
                   value=<?php $numero_aleatorio;?>>
<input type="submit" name="submit" value="Submit"/>
</form>


Lo primero es el scope de $numero_aleatorio. Si vas a usarla fuera del if-else, declárala fuera, antes del if (empty...
Después para que ese $numero_aleatorio se te ponga como value del input, tienes que usas <?php echo $numero_aleatorio; ?> o <?= $numero_aleatorio ?>

Al hacer el post a esa misma ruta (en realidad a la ruta que quieras, pero hablo de este caso) puede coger sin problemas el valor de $_POST["numero_aleatorio"]; y mostrarlo. No hace falta liarse con sesiones, bases de datos o las locuras que te proponen por ahí.
el uso de un input hidden y de $_POST a pelo para "almacenar" un valor supone al menos dos problemas bastante gordos que lo convierten en una muy mala practica:

- el cliente puede leer y modificar ese valor a su antojo.
- el no sanitizar la entrada del cliente supone una muy mala practica en cuanto a seguridad, propenso a sql injection y demases.
Hmmm no sé, igualmente voy a volver a hacerlo con $_POST, más que nada por practicar. Vuelvo a probar y os digo :)
13 respuestas