Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Problema al generar un valor aleatorio sin que se repita

Estas en el tema de Problema al generar un valor aleatorio sin que se repita en el foro de PHP en Foros del Web. Tengo el siguiente método que lo que hace es generar un número aleatorio. Para que no genere dos números aleatorios iguales, lo que hago es ...
  #1 (permalink)  
Antiguo 04/10/2013, 10:44
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Problema al generar un valor aleatorio sin que se repita

Tengo el siguiente método que lo que hace es generar un número aleatorio.

Para que no genere dos números aleatorios iguales, lo que hago es guardar cada número aleatorio en sesión, luego comparo el número con el array en sesión, si no está entonces retorno el valor y sino vuelvo a generar otro número aleatorio.

El problema es que hay un tramo del código en el que genera un valor nulo, entre que compara el valor e introduce la pregunta en sesión.

El resultado es que hay preguntas que se quedan con valor null.

En el código explico dónde creo que hay errores. Los cuales por más que los he buscado, pensado y analizado no los encuentro.

La función en el controlador que obtiene tanto amigos aleatorios como preguntas aleatorias sobre dicho amigo.

Código PHP:
Ver original
  1. /*
  2.     obtiene un amigo aleatorio y cinco preguntas sobre el
  3. */
  4. function play_start()
  5. {
  6.     if ( isset( $_SESSION['user_twitter'] ) AND $_SESSION['twitter_status'] == true )
  7.     {
  8.         //vacio la sesion con los numeros obtenidos aleatoriamente
  9.         //y la declaro de nuevo como array para utilizarla en el array_push del metodo
  10.         //getrandomvalues()
  11.         unset( $_SESSION['randomresult']['count'] );
  12.        
  13.         //obtengo los amigos en una sesion
  14.         gettruefriendslist();
  15.        
  16.         //instancio la clase personal
  17.         $newget                     = new Twitter_main();
  18.        
  19.         //obtengo un numero de amigo aleatorio
  20.         $getfriendrandom            = $newget->getrandomvalue( $_SESSION['gettruefriendslist'] );
  21.        
  22.         //guardo el amigo aleatorio en sesion
  23.         $_SESSION['randomresult']['friend'] = $_SESSION['gettruefriendslist'][$getfriendrandom];
  24.        
  25.         //instancio la clase Conectar
  26.         $newget2                    = new Conectar();
  27.        
  28.         //selecciono las preguntas y las guardo en array
  29.         $select                     = "SELECT * FROM questions";
  30.        
  31.         $result_conexion            = $newget2->conectar( $select );
  32.  
  33.         while ($result = mysqli_fetch_array( $result_conexion ))
  34.         {
  35.             $getquestions[] = $result;
  36.         }
  37.        
  38.        
  39.         //vacio la sesion con las preguntas
  40.         //y la declaro de nuevo como array para utilizarla en el array_push
  41.         unset( $_SESSION['randomresult']['questions'] );
  42.         $_SESSION['randomresult']['questions']= array();
  43.        
  44.         //VUELVO A VACIAR la sesion con los numeros obtenidos aleatoriamente
  45.         //y la declaro de nuevo como array para utilizarla en el array_push del metodo
  46.         //getrandomvalues()
  47.         unset( $_SESSION['randomresult']['count'] );
  48.        
  49.         $_SESSION['randomresult']['questions']= array();
  50.         //declaro questions como array
  51.         $questionsrandom = array();
  52.        
  53.         //obtengo todas las etiquetas
  54.         $tags = $newget->gettags();
  55.    
  56.         //busco 5 preguntas aleatorias
  57.         //y sustituyo [nombre] por el valor que deseo finalmente
  58.         for($i=0; $i<=4 ; $i++)
  59.            
  60.         {
  61.             //obtengo 5 numeros aleatorios
  62.                         //aquí es donde comienza el error
  63.             $getquestionrandom      = $newget->getrandomvalue ( $getquestions );
  64.            
  65.                         //no estoy seguro si el error está aquí al guardar de esta manera el valor en questionsrandom
  66.             //guardo las preguntas segun los numeros anteriores
  67.             array_push($questionsrandom, $getquestions[$getquestionrandom]);
  68.            
  69.             //instancio al metodo para hacer las sustituciones
  70.             $questionsrandom[$i]['question'] = $newget->setvaluestags($tags,
  71.             "@".$_SESSION['randomresult']['friend']['screen_name'], $questionsrandom[$i]['question']);
  72.         }
  73.         //finalmente lo guardo en sesion
  74.         array_push($_SESSION['randomresult']['questions'], $questionsrandom );
  75.     }
  76.        
  77. }

Aquí es donde genero los valores aleatorios, tanto para obtener el amigo como para las preguntas

Código PHP:
Ver original
  1. /*
  2.         genera un valor aleatorio de un array
  3.     */
  4.     public function getrandomvalue ( $imput )
  5.     {
  6.         if( empty( $_SESSION['randomresult']['count'] )
  7.             OR !is_array( $_SESSION['randomresult']['count'] ) )
  8.         {
  9.             $_SESSION['randomresult']['count'] = array();
  10.         }
  11.         if ( is_array( $imput ) )
  12.         {
  13.             //cuento los valores del array
  14.             $this->result = count ( $imput );
  15.            
  16.             //resto un valor para que random no escoja un valor no encontrado en el array
  17.             $this->result = $this->result - 1;
  18.            
  19.             //elijo un numero al azar
  20.             $this->result = mt_rand( 0, $this->result );
  21.            
  22.             /*$this->result = array_rand( $imput );*/
  23.             $inarray = in_array( $this->result, $_SESSION['randomresult']['count'] );
  24.             //no se si puede estar aquí el error, es otra posibilidad que he analizado pero no encuentro nada
  25.             if( $inarray === false )
  26.             {
  27.                 //guardo el valor en count
  28.                 array_push( $_SESSION['randomresult']['count'], $this->result );
  29.                 //finalmente retorno el numero escogido
  30.                 return $this->result;
  31.             }          
  32.             else
  33.             {
  34.                 $this->getrandomvalue( $imput );
  35.             }
  36.         }
  37.     }

La estructura del array que utilizo para las preguntas aleatorias son

Código PHP:
Ver original
  1. $getquestions array(10){
  2.   [0, 1, 2, ...] array(6){
  3.    [0]=> string(...)
  4.    ["id_question"] => string(...)
  5.    [1]=> string(...)
  6.    ["question"] => string(...)
  7.    [2]=> string(...)
  8.    ["id_typequestions"] => string(...)
  9.    }
  10. }

Quien necesite más de mi código solo tiene que pedirlo y si no compromete al sistema entonces lo aportaré sin problemas.

¿Alguien me puede ayudar a entender por qué obtengo preguntas con valor null?
__________________
Ayúdame a hacerlo por mi mismo.
  #2 (permalink)  
Antiguo 04/10/2013, 12:01
Avatar de Cuervoo  
Fecha de Ingreso: octubre-2013
Mensajes: 165
Antigüedad: 11 años, 1 mes
Puntos: 43
Respuesta: Problema al generar un valor aleatorio sin que se repita

A simple vista no se ve nada (o yo no vi nada) muy evidente. Como usas clases y métodos que no están en el código no se puede copiar y probar qué puede llegar a ser.

Pero si te sirve, te puedo decir que si no usas un debugger podés usar echos en forma de "breackpints" para ir siguiendo los pasos, una forma no muy elegante pero a mi cada tanto me ayuda.

Fijate las variables que setea, los valores que va comparando, por donde se va metiendo.
Sobre todo que cuando entra a if ( $inarray === false ), devuelva un valor correcto. Y despues todos los valores que agrega array_push($questionsrandom, $getquestions[$getquestionrandom]) lo haga bien.

Un ejemplo sería, previo a esa linea.
echo "Agrega la pregunta: array_push($questionsrandom, {$getquestions[$getquestionrandom]})<br />";

Y vas a ir viendo si agrega la pregunta o un valor nulo. Si no es ahi vas haciendo lo mismo por distintos puntos donde pueda estar el error hasta que lo puedas aislar y solucionar.
  #3 (permalink)  
Antiguo 06/10/2013, 07:50
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Problema al generar un valor aleatorio sin que se repita

Cita:
Iniciado por Cuervoo Ver Mensaje
A simple vista no se ve nada (o yo no vi nada) muy evidente. Como usas clases y métodos que no están en el código no se puede copiar y probar qué puede llegar a ser.

Pero si te sirve, te puedo decir que si no usas un debugger podés usar echos en forma de "breackpints" para ir siguiendo los pasos, una forma no muy elegante pero a mi cada tanto me ayuda.

Fijate las variables que setea, los valores que va comparando, por donde se va metiendo.
Sobre todo que cuando entra a if ( $inarray === false ), devuelva un valor correcto. Y despues todos los valores que agrega array_push($questionsrandom, $getquestions[$getquestionrandom]) lo haga bien.

Un ejemplo sería, previo a esa linea.
echo "Agrega la pregunta: array_push($questionsrandom, {$getquestions[$getquestionrandom]})<br />";

Y vas a ir viendo si agrega la pregunta o un valor nulo. Si no es ahi vas haciendo lo mismo por distintos puntos donde pueda estar el error hasta que lo puedas aislar y solucionar.
Muchas gracias por tu ayuda. He probado estos días todo tipo de maneras para atrapar el error (var_dumps, echo) en cada parte del código y he logrado saber dónde se genera precisamente el error pero no entiendo el por qué, por lo tanto no puedo solucionarlo de momento.

El error se genera en el momento que in_array no es false porque el valor ya existe en la lista de números generados, entonces se vuelve a generar un número aleatorio y ese número no existe, pero en la función donde recojo ese número aleatorio lo detecta como null.

Harto ya, voy a instalar xdebug, leer cómo se utiliza y ver cual es el motivo.

Sospecho que el motivo es que la función llama al método, este genera otro valor si el valor generado existe pero ese paso, el de generar un nuevo valor, resta un paso en el for de la función, por lo que hay una pregunta que se queda vacía.

Eso no tendría sentido, puesto que el método se vuelve a llamar a sí mismo y al no retornar valor, solamente volver a llamarse a si mismo ese paso/iteración quedaría al margen de la función, es decir, la función se quedaría esperando a que el método le de un valor y continuaría con la iteración del for.

No se si me he explicado bien.

En definitiva, veré a ver si con xdebug puedo solucionarlo y además la comprobación de repetidos la haré en la función en vez de en el método y si así funciona bien entonces mis sospechas se habrán hecho ciertas.

Saludos!!!
__________________
Ayúdame a hacerlo por mi mismo.
  #4 (permalink)  
Antiguo 06/10/2013, 09:43
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problema al generar un valor aleatorio sin que se repita

Yo te propondría un ejercicio de análisis: ¿Que condiciones deberían cumplirse en esa llamada para obtener intencionalmente un NULL?

A veces, cuando recorriendo la lógica con datos reales, no se obtiene la respuesta de qué falla, es mejor mirarlo a la inversa...
__________________
¿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 06/10/2013, 10:11
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Problema al generar un valor aleatorio sin que se repita

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Yo te propondría un ejercicio de análisis: ¿Que condiciones deberían cumplirse en esa llamada para obtener intencionalmente un NULL?

A veces, cuando recorriendo la lógica con datos reales, no se obtiene la respuesta de qué falla, es mejor mirarlo a la inversa...
En la función, justo después de la línea 64 del código que he puesto aquí he hecho dos var_dump()

Código PHP:
Ver original
  1. var_dump( $getquestionrandom );
  2. var_dump( $_SESSION['randomresult']['count'] );

Lo curioso, es que el método funciona correctamente, genera los valores aleatoriamente y en caso de que haya alguno repetido vuelve a generar otro valor hasta que no esté repetido y los va guardando en la sesión count.

Por lo tanto lo raro, rarísimo, es que de los var_dump anteriores en la última ejecución en local me hayan indicado lo siguiente

Código PHP:
Ver original
  1. int 6
  2. array (size=1)
  3.   0 => int 6
  4.            
  5.  
  6.                        
  7.            
  8. int 1
  9. array (size=2)
  10.   0 => int 6
  11.   1 => int 1
  12.            
  13.  
  14.                        
  15.            
  16. int 10
  17. array (size=3)
  18.   0 => int 6
  19.   1 => int 1
  20.   2 => int 10
  21.            
  22.  
  23.                        
  24.            
  25. null
  26. array (size=4)
  27.   0 => int 6
  28.   1 => int 1
  29.   2 => int 10
  30.   3 => int 9
  31.            
  32.  
  33.                        
  34.            
  35. //esto es del xdebug
  36. ( ! ) Notice: Undefined index:  in C:\xampp\htdocs\xampp\web\videosfav\twitter2\control\controller_public.php on line 207
  37. Call Stack
  38. #   Time    Memory  Function    Location
  39. 1   0.0020  135888  {main}(  )  ..\index.php:0
  40. 2   1.0251  580864  html_start(  )  ..\index.php:23
  41. 3   1.0251  580880  play_start(  )  ..\html_public.php:133
  42.            
  43.  
  44.                        
  45.                        
  46. int 4
  47. array (size=5)
  48.   0 => int 6
  49.   1 => int 1
  50.   2 => int 10
  51.   3 => int 9
  52.   4 => int 4

Si te fijas, lo curioso es que en sesión estan todos los valores correctamente pero en la función esta vez el 9 lo recoge como null :S

Eso es lo raro y no entiendo el por qué.

Para que un valor sea int pero el método retorne null o la función recoja null no se me ocurre ningún caso posible sin añadir código que ahí no está y yo no he escrito, cabe decir que el proyecto y código lo he hecho exclusivamente yo, nadie más ha tocado el código y no estoy utilizando framework.

EDITO y cabe decir que en la BD hay 11 preguntas, por lo tanto una novena pregunta sí tendría que haber existido.
__________________
Ayúdame a hacerlo por mi mismo.
  #6 (permalink)  
Antiguo 06/10/2013, 11:13
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 7 meses
Puntos: 270
Respuesta: Problema al generar un valor aleatorio sin que se repita

Lo que te dicen los var_dump es correcto.No te debería parecer raro que una variable esté a null, y la otra no lo esté.Una no está tomando el valor de la otra, así que no dependen entre sí.
Al usar una superglobal ($_SESSION), la estás asignando valor directamente.A la otra variable se le asigna un valor según el valor retornado de una función.Si tiene un null, es porque la función puede retornar null.
Esto te deberia dar una pista:
Código PHP:
Ver original
  1. function a()
  2. {
  3. }
  4.  
  5. $b=a();
  #7 (permalink)  
Antiguo 06/10/2013, 14:38
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Problema al generar un valor aleatorio sin que se repita

Cita:
Iniciado por dashtrash Ver Mensaje
Lo que te dicen los var_dump es correcto.No te debería parecer raro que una variable esté a null, y la otra no lo esté.Una no está tomando el valor de la otra, así que no dependen entre sí.
Al usar una superglobal ($_SESSION), la estás asignando valor directamente.A la otra variable se le asigna un valor según el valor retornado de una función.Si tiene un null, es porque la función puede retornar null.
Esto te deberia dar una pista:
Código PHP:
Ver original
  1. function a()
  2. {
  3. }
  4.  
  5. $b=a();
Tienes razón. Entiendo a qué te refieres. Pero si te fijas el método solo puede retornar un valor comprendido en el rango de preguntas disponibles. No puede retornar null pero a la vez en la sesión guardar por ejemplo el int 9. No tiene sentido que haga eso :S

Si tiene sentido entonces algo se está escapando a mi comprensión :S
__________________
Ayúdame a hacerlo por mi mismo.
  #8 (permalink)  
Antiguo 06/10/2013, 18:01
Avatar de Cuervoo  
Fecha de Ingreso: octubre-2013
Mensajes: 165
Antigüedad: 11 años, 1 mes
Puntos: 43
Respuesta: Problema al generar un valor aleatorio sin que se repita

Te fijaste cual es el valor que tiene result cuando da null? Hacé que muestre $this->result y fijate si siempre es el mismo valor cuando da null o va cambiando. Seguile los pasos en las tres líneas que lo modificás.

Código PHP:
Ver original
  1. $this->result = count ( $imput );
  2.            
  3. //resto un valor para que random no escoja un valor no encontrado en el array
  4. $this->result = $this->result - 1;
  5.            
  6. //elijo un numero al azar
  7. $this->result = mt_rand( 0, $this->result );

En esas tres.
  #9 (permalink)  
Antiguo 07/10/2013, 01:32
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 7 meses
Puntos: 270
Respuesta: Problema al generar un valor aleatorio sin que se repita

Cita:
Iniciado por guardarmicorreo Ver Mensaje
Tienes razón. Entiendo a qué te refieres. Pero si te fijas el método solo puede retornar un valor comprendido en el rango de preguntas disponibles. No puede retornar null pero a la vez en la sesión guardar por ejemplo el int 9. No tiene sentido que haga eso :S

Si tiene sentido entonces algo se está escapando a mi comprensión :S
Yo veo una línea de ejecución que hace que la función no ejecute ningún return.Por lo que su valor devuelto será null...
  #10 (permalink)  
Antiguo 07/10/2013, 02:16
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Problema al generar un valor aleatorio sin que se repita

Cita:
Iniciado por Cuervoo Ver Mensaje
Te fijaste cual es el valor que tiene result cuando da null? Hacé que muestre $this->result y fijate si siempre es el mismo valor cuando da null o va cambiando. Seguile los pasos en las tres líneas que lo modificás.

Código PHP:
Ver original
  1. $this->result = count ( $imput );
  2.            
  3. //resto un valor para que random no escoja un valor no encontrado en el array
  4. $this->result = $this->result - 1;
  5.            
  6. //elijo un numero al azar
  7. $this->result = mt_rand( 0, $this->result );

En esas tres.
He hecho var_dump() a las tres líneas.

El código en el método para los var_dump() ha sido el siguiente

Código PHP:
Ver original
  1. //cuento los valores del array
  2.             echo "result count<br>";
  3.             $this->result = count ( $imput );
  4.            
  5.             var_dump( $this->result );
  6.            
  7.             //resto un valor para que random no escoja un valor no encontrado en el array
  8.             echo "result -1<br>";
  9.             $this->result = $this->result - 1;
  10.            
  11.             var_dump( $this->result );
  12.             //elijo un numero al azar
  13.             echo "result mt_rand<br>";
  14.             $this->result = mt_rand( 0, $this->result );

Mientras que el código para los var_dump() en la función ha sido el siguiente

Código PHP:
Ver original
  1. for($i=0; $i<=4 ; $i++)
  2.            
  3.         {
  4.             //obtengo 5 numeros aleatorios        
  5.             echo "iteración <b>". $i."</b><br>";
  6.             $getquestionrandom      = $newget->getrandomvalue ( $getquestions );
  7.                
  8.             ?>
  9.             <pre>
  10.             <?php
  11.                
  12.                 var_dump( $getquestionrandom );
  13.                 var_dump( $_SESSION['randomresult']['count'] );
  14.                 echo "fin de la iteración <b>". $i."</b><br>";
  15.            
  16.             //var_dump($getquestions[$getquestionrandom]);
  17.             ?>
  18.             </pre>
  19.             <?php
  20.             //guardo las preguntas segun los numeros anteriores
  21.             array_push($questionsrandom, $getquestions[$getquestionrandom]);
  22.            
  23.             //instancio al metodo para hacer las sustituciones
  24.             $questionsrandom[$i]['question'] = $newget->setvaluestags($tags,
  25.             "@".$_SESSION['randomresult']['friend']['screen_name'], $questionsrandom[$i]['question']);
  26.         }

Los resultados

Código PHP:
Ver original
  1. //estos primeros var_dump corresponden a la elección del usuario aleatoriamente
  2. //por este motivo no se cuenta y no influye en el problema puesto que antes de
  3. //entrar en las preguntas aleatorias la sesión count es vaciada.
  4. result count
  5. int 5
  6. result -1
  7. int 4
  8. result mt_rand
  9. int 2
  10.            
  11.                        
  12.  
  13.  //aquí es donde comienza a escoger las preguntas aleatorias                       
  14.                                
  15.  
  16.                 iteración 0
  17. result count
  18. int 11
  19. result -1
  20. int 10
  21. result mt_rand
  22. int 0
  23.            
  24.                        
  25.  
  26.                            
  27.                                
  28.  
  29.                            
  30.            
  31. int 0
  32. array (size=1)
  33.   0 => int 0
  34.                 fin de la iteración 0
  35.            
  36.  
  37.                 iteración 1
  38. result count
  39. int 11
  40. result -1
  41. int 10
  42. result mt_rand
  43. int 10
  44.            
  45.                        
  46.  
  47.                            
  48.                                
  49.  
  50.                            
  51.            
  52. int 10
  53. array (size=2)
  54.   0 => int 0
  55.   1 => int 10
  56.                 fin de la iteración 1
  57.            
  58.  
  59.                 iteración 2
  60. result count
  61. int 11
  62. result -1
  63. int 10
  64. result mt_rand
  65. int 6
  66.            
  67.                        
  68.  
  69.                            
  70.                                
  71.  
  72.                            
  73.            
  74. int 6
  75. array (size=3)
  76.   0 => int 0
  77.   1 => int 10
  78.   2 => int 6
  79.                 fin de la iteración 2
  80.            
  81.  
  82.                 iteración 3
  83. result count
  84. int 11
  85. result -1
  86. int 10
  87. result mt_rand
  88. int 0
  89.            
  90.                        
  91.  
  92. result count
  93. int 11
  94. result -1
  95. int 10
  96. result mt_rand
  97. int 5
  98.            
  99.                        
  100.  
  101.                            
  102.                                
  103.  
  104.                            
  105.            
  106. null
  107. array (size=4)
  108.   0 => int 0
  109.   1 => int 10
  110.   2 => int 6
  111.   3 => int 5
  112.                 fin de la iteración 3
  113.            
  114.  
  115.            
  116. //esto es del xdebug
  117. ( ! ) Notice: Undefined index:  in C:\xampp\htdocs\xampp\web\videosfav\twitter2\control\controller_public.php on line 218
  118. Call Stack
  119. #   Time    Memory  Function    Location
  120. 1   0.0010  135904  {main}(  )  ..\index.php:0
  121. 2   1.0441  582568  html_start(  )  ..\index.php:23
  122. 3   1.0441  582584  play_start(  )  ..\html_public.php:133
  123.  
  124.                 iteración 4
  125. result count
  126. int 11
  127. result -1
  128. int 10
  129. result mt_rand
  130. int 0
  131.            
  132.                        
  133.  
  134. result count
  135. int 11
  136. result -1
  137. int 10
  138. result mt_rand
  139. int 3
  140.            
  141.                        
  142.  
  143.                            
  144.                                
  145.  
  146.                            
  147.            
  148. null
  149. array (size=5)
  150.   0 => int 0
  151.   1 => int 10
  152.   2 => int 6
  153.   3 => int 5
  154.   4 => int 3
  155.                 fin de la iteración 4
  156.            
  157.  
  158.            
  159. //esto es del xdebug
  160. ( ! ) Notice: Undefined index:  in C:\xampp\htdocs\xampp\web\videosfav\twitter2\control\controller_public.php on line 218
  161. Call Stack
  162. #   Time    Memory  Function    Location
  163. 1   0.0010  135904  {main}(  )  ..\index.php:0
  164. 2   1.0441  582568  html_start(  )  ..\index.php:23
  165. 3   1.0441  582584  play_start(  )  ..\html_public.php:133

EDITO

La aparición de null no sigue un patrón. Puede aparecer en cualquier lugar y hasta en dos posiciones en una misma ejecución. Nunca tres, hasta el momento. Hay veces que no aparece null y lo realiza tal y como se espera.
__________________
Ayúdame a hacerlo por mi mismo.
  #11 (permalink)  
Antiguo 07/10/2013, 02:23
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 7 meses
Puntos: 270
Respuesta: Problema al generar un valor aleatorio sin que se repita

Cita:
La aparición de null no sigue un patrón. Puede aparecer en cualquier lugar y hasta en dos posiciones en una misma ejecución. Nunca tres, hasta el momento. Hay veces que no aparece null y lo realiza tal y como se espera.
Sigue un patrón: depende del número de llamas recursivas que hagas a la función.
Fíjate en...
Código PHP:
Ver original
  1. ....
  2. else
  3.             {
  4.                 $this->getrandomvalue( $imput );
  5.             }
  6.  ...

No debería ser?....
Código PHP:
Ver original
  1. ....
  2. else
  3.             {
  4.                 return $this->getrandomvalue( $imput );
  5.             }
  6.  ...
  #12 (permalink)  
Antiguo 07/10/2013, 02:36
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Problema al generar un valor aleatorio sin que se repita

Cita:
Iniciado por dashtrash Ver Mensaje
Sigue un patrón: depende del número de llamas recursivas que hagas a la función.
Fíjate en...
Código PHP:
Ver original
  1. ....
  2. else
  3.             {
  4.                 $this->getrandomvalue( $imput );
  5.             }
  6.  ...

No debería ser?....
Código PHP:
Ver original
  1. ....
  2. else
  3.             {
  4.                 return $this->getrandomvalue( $imput );
  5.             }
  6.  ...
Pero cuando esa línea se ejecuta vuelve a comenzar desde arriba la ejecución del método y debería retornar en el if ¿no? :S

De todas formas voy a probarlo.
__________________
Ayúdame a hacerlo por mi mismo.
  #13 (permalink)  
Antiguo 07/10/2013, 02:43
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Problema al generar un valor aleatorio sin que se repita

Muchas gracias dashtrash!!

Ese era el problema, el return que no había en esa línea.

Después de 15 pruebas no retorna null.

Pero quiero entender por qué daba ese error, si lo lógico es que esa línea haga comenzar de nuevo la ejecución del método y retorne en el if o vuelva a ejecutar el método. Me gustaría entender el por qué, el motivo. Pero sí, definitivamente esa es la solución a este problema.
__________________
Ayúdame a hacerlo por mi mismo.
  #14 (permalink)  
Antiguo 07/10/2013, 02:56
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 7 meses
Puntos: 270
Respuesta: Problema al generar un valor aleatorio sin que se repita

Si que retorna por el if.Pero, adonde retorna? A la anterior llamada recursiva.No retorna directamente al nivel más alto, donde tú esperas el valor de retorno.
En cuanto hay al menos 1 llamada recursiva, vas a tener en la pila:
[0 : Script que invoca el metodo]
[1: Metodo de busqueda.Produce una llamada recursiva]
[2: Metodo de busqueda.Retorna por el if]

Lo retornado en 2, no va directamente a 0.Va a 1.Y , en 1, el metodo no retorna el valor devuelto.Por lo que devuelve null.
  #15 (permalink)  
Antiguo 07/10/2013, 03:20
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Problema al generar un valor aleatorio sin que se repita

Muchas gracias a todos los que me han ayudado con este problema.

Muchas gracias dashtrash por explicarmelo tan bien!! :D

Lo doy por resuelto y es algo más que añado a mis conocimientos, lo valoro más que haber resuelto el problema :P

Gracias!!
__________________
Ayúdame a hacerlo por mi mismo.

Etiquetas: mysql, select, valor
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 21:49.