Foros del Web » Programando para Internet » PHP »

Rand() no funciona en el servidor

Estas en el tema de Rand() no funciona en el servidor en el foro de PHP en Foros del Web. Hola, chicos, estoy tratando de hacer una página con ejercicios de español en la cual, cada vez que se actualiza la página, aparece un ejercicio ...
  #1 (permalink)  
Antiguo 16/10/2015, 05:32
 
Fecha de Ingreso: mayo-2015
Ubicación: Brasil
Mensajes: 13
Antigüedad: 8 años, 11 meses
Puntos: 0
Pregunta Rand() no funciona en el servidor

Hola, chicos,
estoy tratando de hacer una página con ejercicios de español en la cual, cada vez que se actualiza la página, aparece un ejercicio aleatorio de la base de datos. Después de romperme la cabeza un mal rato (soy noob), llegué a un código que funciona en el localhost pero no hay manera de que funcione en el servidor... Siempre aparece el mismo ejercicio. Uso dos navegadores, lo raro es que en uno aparece siempre el mismo ejercicio y en el otro siempre otro ejercicio... Creo que el problema va por la sesion pero, la verdad, no tengo idea...
No sé por dónde buscar el problema. Pueden darme una mano?
Version PHP local 5.6.12 / Version PHP servidor 5.3.10
Código PHP:
Ver original
  1. <?php
  2.                        require_once('escriptsphp/conecDB.php');
  3.                        require_once('escriptsphp/conexion.php');
  4.                        $dbc=DBConect();
  5.                        $query="SELECT basico FROM ejercicios ORDER BY rand() Limit 1";
  6.                        $resultado=mysqli_query($dbc, $query) or die ("Error de consulta".mysqli_error($dbc));
  7.                        $row=mysqli_fetch_array($resultado);
  8.                        $ejercicio=$row;
  9.                        DBclose($dbc);
  10. ?>
Y se imprime con:
Código PHP:
Ver original
  1. <?php echo $ejercicio['basico']; // 'basico' es el nombre de la columna con ejercicios
  2. ?>
Tampoco entiendo porque tengo que tengo que declarar 'basico' con la variable... pero me funciona...
Ese es el último código que me funcionó en el localhost. Probé algunas variaciones declarando rand() de varias maneras pero siempre me funciona en local y no el en servidor...
Les agradecería muchísimo una mano...

Última edición por danielcenoz; 16/10/2015 a las 05:39
  #2 (permalink)  
Antiguo 16/10/2015, 06:12
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 4 meses
Puntos: 154
Respuesta: Rand() no funciona en el servidor

Hola danielcenoz,

Hasta donde yo sé, mysqli_fetch_array devuelve un array, aunque solo sea de un elemento como es en tu caso por el LIMIT 1, pero de cualquier manera, yo, por lógica, creo que habrá que recorrer el array para poder mostrar lo que contiene.

Puede que vaya desencaminado pero yo miraría por ahí, algo así:

Código PHP:
Ver original
  1. <?php
  2.                            require_once('escriptsphp/conecDB.php');
  3.                            require_once('escriptsphp/conexion.php');
  4.                            $dbc=DBConect();
  5.                            $query="SELECT basico FROM ejercicios ORDER BY rand() Limit 1";
  6.                            $resultado=mysqli_query($dbc, $query) or die ("Error de consulta".mysqli_error($dbc));
  7.                            $row=mysqli_fetch_array($resultado);
  8.                   foreach($row as $ejercicio) { //Recorro el array
  9.                              echo $ejercicio['basico'];
  10.                   }
  11.                            DBclose($dbc);
  12.     ?>

Si quieres probar y nos cuentas...
  #3 (permalink)  
Antiguo 16/10/2015, 06:42
 
Fecha de Ingreso: mayo-2015
Ubicación: Brasil
Mensajes: 13
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Rand() no funciona en el servidor

Hola, Rubén, gracias por tu rápida respuesta.
Lo he pegado tal cual y me sale en el inicio de la página un:
Código PHP:
Ver original
  1. Warning: Illegal string offset 'basico' in C:\xampp\htdocs\...\ejercicios.php on line 19
  2.  <
  3. Warning: Illegal string offset 'basico' in C:\xampp\htdocs\...\ejercicios.php on line 19
  4.  <
la línea 19 es donde está la variable $ejercicios en el código que has propuesto... ($ejercicio['basico'])
el error varia de acuerdo con el navegador... pero, por lo demás, corre igual que antes.

Aunque creo que tu forma es la mejor (yo voy a los tropezones), el problema es que el código que funciona en localhost no fuciona en el servidor (ahora he probado con un tercer navegador y en cada uno sale siempre el mismo ejercicio aunque en cada uno es diferente).
  #4 (permalink)  
Antiguo 16/10/2015, 08:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Rand() no funciona en el servidor

Por lo pronto, el RAND() que mencionas no es de PHP, sino de MySQL. El comportamiento de ciertas funciones pueden variar en ciertos casos muy particulares.
El hecho de que funcione bien en local pero no en el servidor me llevaría a suponer que tienes Windows en local, y que en el servidor está corriendo sobre Linux; esa es una de las posibilidades dado que es usual que los hosting no usen servidores basados en Windows.
La diferencia en ese punto radica en que ciertas funciones están definidas internamente en MySQL con su nombre en minúsculas, y para Linux, RAND() y rand(), son diferentes (me ha pasado con otras funciones).
Yo encararía dos pruebas:
1) Verificar si realmente está devolviendo algo:
Código PHP:
Ver original
  1. require_once('escriptsphp/conecDB.php');
  2. require_once('escriptsphp/conexion.php');
  3. $dbc=DBConect();
  4. $query="SELECT basico FROM ejercicios ORDER BY rand() Limit 1";
  5.  
  6. $resultado=mysqli_query($dbc, $query) or die ("Error de consulta".mysqli_error($dbc));
  7. if($resultado)
  8. {
  9.   if($resultado->num_row>0)
  10.     {
  11.     $row=mysqli_fetch_array($resultado);
  12.     $ejercicio=$row;
  13.     } else {echo "No se obtuvieron datos.";}
  14. }
  15. else{
  16. echo "Error: ".mysqli_error($dbc);
  17. }
  18.                        DBclose($dbc);

Por otro lado, ver si el fallo es por las mayusculas:
Código PHP:
Ver original
  1. require_once('escriptsphp/conecDB.php');
  2. require_once('escriptsphp/conexion.php');
  3. $dbc=DBConect();
  4. $query="SELECT basico FROM ejercicios ORDER BY RAND() Limit 1";
  5.  
  6. $resultado=mysqli_query($dbc, $query) or die ("Error de consulta".mysqli_error($dbc));
  7. if($resultado)
  8. {
  9.   if($resultado->num_row>0)
  10.     {
  11.     $row=mysqli_fetch_array($resultado);
  12.     $ejercicio=$row;
  13.     } else {echo "No se obtuvieron datos.";}
  14. }
  15. else{
  16. echo "Error: ".mysqli_error($dbc);
  17. }
  18.                        DBclose($dbc);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 16/10/2015, 08:46
 
Fecha de Ingreso: mayo-2015
Ubicación: Brasil
Mensajes: 13
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Rand() no funciona en el servidor

Hola, gnzsoloyo,
gracias por tu respuesta. Me pareció interesante la distinción entre minúsculas y mayúsculas. Aunque PHP y Mysql sean fantásticas, el lío de estándares es un brutal dolor de cabeza..
Probé con mayúsculas y no vi ninguna diferencia (funciona en localhost pero no el en el servidor).
Pero el código de comprobación que hiciste me devolvió este Notice:
Código PHP:
Ver original
  1. Notice: Undefined property: mysqli_result::$num_row in C:\xampp\htdocs\...\ejercicios.php on line 19
  2.  No se obtuvieron datos.
La línea 19 es donde está "if($resultado->num_row>0)". Y dice que la variable $ejercicios no está definida.

Lo que me parece rarísimo, porque con el código anterior me carga los ejercicios cuando actualizo el navegador en localhost...

En cuanto a lo demás, uso una pc windows, sí. Y me pasa seguido que lo que hago en ella no quede igual en el servidor... je
  #6 (permalink)  
Antiguo 16/10/2015, 08:50
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Rand() no funciona en el servidor

Bueno, el problema se simplifica, entonces: No está devolviendo datos, pero tampoco genera un error. Eso implica que no hay error de sintaxis.

Desde el punto de vista de BBDD, la respuesta sería: "Tu tabla está vacía".
Eso es lo que significa el mensaje.

Verifica la tabla en el servidor. A ver si no se ha vaciado por acciones que no se reportaron.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 16/10/2015, 09:01
 
Fecha de Ingreso: mayo-2015
Ubicación: Brasil
Mensajes: 13
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Rand() no funciona en el servidor

Hmm... no sé cómo representarlo aquí pero la tabla 'ejercicios' tres columnas:
basico [ej1, ej2, ej3...]
intermedio [vacío]
avanzado [vacío]

Son tres columnas tipo TEXT donde voy tirando código js y html para cargarlos en un div de bootstrap.
En algún momento, probé el contenido con while y me devolvió una lista normal en la página... Pero en tu script dice que no hay nada... weird.
  #8 (permalink)  
Antiguo 16/10/2015, 10:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Rand() no funciona en el servidor

dejame entender la estructura de esa tabla...

Postea el resultado de esta consulta, que te sugiero que ejecutes directamente y a mano con phpMyadmin. NO la ejecutes con PHP:

Código MySQL:
Ver original
  1. SHOW CREATE TABLE ejercicios;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 16/10/2015, 10:36
 
Fecha de Ingreso: mayo-2015
Ubicación: Brasil
Mensajes: 13
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Rand() no funciona en el servidor

Esto es lo que me sale. A ver si ayuda...

Resultado SQL

Host: 127.0.0.1
Database: local
Generation Time: 16-Out-2015 às 18:36
Generated by: phpMyAdmin 4.4.14 / MySQL 5.6.26
Comando SQL: SHOW CREATE TABLE ejercicios;
Linhas: 1
Table
ejercicios

Create Table

CREATE TABLE `ejercicios` (
`basico` text NOT NULL,
`intermediario` text NOT NULL,
`avanzado` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
  #10 (permalink)  
Antiguo 18/10/2015, 18:53
 
Fecha de Ingreso: mayo-2015
Ubicación: Brasil
Mensajes: 13
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Rand() no funciona en el servidor

Hola, chicos! Estuve revisando el código durante el fin de semana (que para eso está...) y noté un pequeño error en el código de verificación que debe ser
Código PHP:
Ver original
  1. if($resultado)
  2. {
  3.   if($resultado->num_[B]rows[/B]>0)
Y llego a la conclusión de que el problema está en la sesión de consulta a la base de datos mysql en el servidor.
Explico: todo funciona en localhost pero en el servidor siempre me sale la misma entrada de la bd que debería ser aleatoria. Otra cosa que noté es que otra consulta (el número de aciertos hechos en total) que debería actualizarse cada vez que se carga la página, tiene un "retraso" y presenta valores desactualizados.
Tengo una pequeña función JS que suma los aciertos. Al confirmar, se envia ese valor por POST a un script que suma a la db y vuelve con "header: Location" actualizando nuevamente los valores.
Me pregunto si eso es alguna configuración local o en el servidor que mantiene valores cada vez que se actualiza el navegador y eso me inutiliza la función RAND(). Hay algo que pueda hacer en la página que "purgue" el valor totalmente y lo vuelva a cargar? O voy desencaminado?

Etiquetas: mysql
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 07:08.