Almacenar número aleatorio en PHP
Resueltojee pee Mensajes publicados 31881 Fecha de registro Estado Moderador Última intervención -
Hola a todos
Me gustaría generar al cargar la página un número aleatorio y mantener ese mismo número para todo el resto del código
Por eso hice:
$nombre = rand(1,10);
El problema es que cada vez que se utiliza la variable $nombre en el resto del programa genera un número diferente, mientras que yo quiero que sea el mismo a lo largo de todo
¿Alguien tendría una idea para que este número se mantenga igual durante todo el código?
Gracias de antemano.
1 respuesta
-
Hola
Utilizar una variable no regenerará su valor...
Si tu número aleatorio se regenera cada vez, es porque lo has codificado mal o tienes un error tipográfico en tu código...
No tiene nada que ver con la única línea de código que nos muestras.
Habrá que mostrarnos el código completo de la página afectada por este problema.
Por supuesto, dado la descripción que haces, suponemos que el uso de esta variable se realiza dentro de la misma página que se utilizó para generarla....... En caso contrario, si quieres usarla en otros scripts, tendrás que almacenarla en una variable de sesión y para evitar que se regenere cada vez que la página se recarga tras enviar un formulario, por ejemplo, será necesario comprobar previamente si esta variable ya existe o no antes de regenerar una...
.
Atentamente,
Jordane-
Hola
Para ser más preciso, en cuanto hago clic en un botón (que enviará un POST a la página PHP para activar el código), el PHP debe mostrar una línea al azar de mi base de datos, así que después de declarar $nombre ejecuto la consulta preparada:
SELECT * FROM table1 WHERE id=$nombre
Pero me muestra una línea diferente en cada clic, aunque en teoría ya que $nombre permanece fijo, la fila debería permanecer igual en cada clic
Soy novato, así que seguramente es un error tonto pero no lo encuentro
Gracias por tu ayuda.
-
-
-
-
Hola,
"
php deberá mostrar una línea al azar de mi base de datos así que después de declarar $nombre ejecuto la consulta preparada:
<span>SELECT</span> <span>*</span> <span>FROM</span> table1 <span>WHERE</span> id<span>=</span> $nombre"Antes, un grave problema de diseño y de comprensión de una base de datos, tengo la impresión...
Si vuestro modelo de datos posee un identificador, este sirve para identificar un dato en la base (y no en otro sitio en general). Con vuestro modelo debéis cambiar todo el programa si tenéis que añadir un dato en la tabla y, peor aún, vuestra base de datos quedará inutilizable si elimináis un solo dato de la tabla.
Yo elimino id = 1 así que si el número aleatorio cae en 1 el programa ya no funciona pero además la base de datos se vuelve inexplotable porque el dato id no corresponde a nada... Un dato es un valor que tiene sentido para un sistema de información, 1,2,3,1312 etc... no corresponde a nada. Id no indica ningún dato. Se puede usar arbitrariamente un identificador numérico auto-incrementado como clave primaria si se quiere (aunque inferior a un identificador natural en muchos casos como método) pero usar ese valor no tiene sentido ya que su único papel es que cada fila de datos sea única, solo habrá una fila de la tabla con el valor id=852244555. Y ojo, una base de datos está hecha para almacenar y MODIFICAR los datos almacenados, aquí con vuestro sistema lo que hacéis es modificar y tendréis que hacer tratamientos de valores aleatorios complejos y sin sentido.
Si queréis hacer este tipo de cosas, o lo hacéis a partir de un conjunto de datos utilizando una tabla (Array) de datos para el almacenamiento (la forma natural de, de hecho, el resultado de una consulta) donde cada juego o fila de datos está arbitrariamente clasificado (de 0 a 'x' un entero que indica el número de valores que corresponden a la consulta) o bien usáis un valor que tenga sentido.
Por ejemplo un identificador llamado nom_fruta = 'manzana' o 'pera' o 'plátano'... y ahí hacéis la cosa al azar sobre estos valores. El nombre de la fruta corresponde a algo real mientras que un identificador numérico auto-incremental no garantiza en absoluto una secuencia lógica o matemática así que tengáis datos con id auto-incrementado 0,1,2, entero numérico hasta el infinito.
En resumen, una base de datos debe tener sentido, de lo contrario se vuelve inexplotable, no solo los programas se vuelven más complejos de hacer y de gestionar hasta que se vuelva imposible, sino que la base de datos se vuelve inexplotable e inútil y con ello se pierden todos los datos almacenados.
La jugada del identificador numérico auto-incrementado es un truco (incluso una pereza del diseñador o una facilidad cuando dos valores de una tabla deben ser identificadores con o sin join) pero claramente su valor no corresponde a nada más que a un número que garantiza un valor único por fila. Usar un valor arbitrario y cambiante (se añade una fila y el valor del id se incrementa en 1; se añaden 1000 filas y cada una se incrementa en 1) significa que si modificáis cualquier valor en vuestra base, ya no funciona nada porque tendréis 1,2,3,... podéis muy bien tener 1, 457,1687,1333 (importa poco que no indique nada salvo que se inserta un valor posible antes de otro).
En conclusión, o hacéis vuestro tiraje aleatorio sobre un valor que tenga sentido (el identificador natural) o un conjunto de datos arbitrario en el momento en que lo recuperáis, por ejemplo con SELECT * FROM table1.
PD: mala idea llamar a vuestras 'table1' que no dice absolutamente nada. Un nombre de tabla debe indicar el papel del grupo de datos. Así que una persona externa o tú dentro de unos meses no sabrá para qué corresponde table1 ya que no dice nada. Además imagina que todo el mundo haga esto, cada uno tendría table1, table2, etc. y por tanto para una notación table1 correspondería table34 para alguien más. Lo llamo hacer lío intencionado. Mientras que un nombre que signifique algo y represente la entidad almacenada no solo todos entenderán, sino que tú también sabrás claramente a qué se refiere solo con mirar el programa y sin tener que hacer un análisis completo.
Por lo tanto tableClient OK table1 no OK en absoluto.
tableFruits SÍ, table1457 NO.
-