Ver Mensaje Individual
  #4 (permalink)  
Antiguo 30/06/2016, 02:09
ica1977
 
Fecha de Ingreso: febrero-2016
Mensajes: 36
Antigüedad: 8 años, 2 meses
Puntos: 2
Respuesta: optimizar proceso php mediante ciclos o bucles?

Cita:
Iniciado por kukiko11 Ver Mensaje
Código PHP:
Ver original
  1. //Buscamos toda la data relacionada con los avances del usuario para su posterior uso
  2. $user_progress=$conexion->prepare("SELECT u.points AS puntos, u.level AS reputacion, FROM usuarios u WHERE u.id=? LIMIT 1");
  3. $user_progress->bind_param('i',$user_id);
  4. $user_progress->execute();
  5. $user_progress->store_result();
  6. $user_progress->bind_result($points,$level);
  7. $user_progress->fetch();
  8.  
  9. //variables a usar
  10. $actual_value=$points;
  11. $max_value= 1000;
  12. //calculo del porcentaje de avance para alcanzar el siguiente nivel
  13. $percent = floor($actual_value*100/$max_value);
  14.  
  15. //Calculamos el nivel de reputacion del usuario y su avance basandonos en sus puntos actuales
  16.  
  17. if     ($actual_value>=1000 and $actual_value<3000)   { $max_value= 3000; $percent =  floor($actual_value*100/$max_value);   $levelup=1; }
  18. elseif ($actual_value>=3000 and $actual_value<6000)   { $max_value= 6000; $percent =  floor($actual_value*100/$max_value);   $levelup=2; }
  19. elseif ($actual_value>=6000 and $actual_value<9000)   { $max_value= 9000; $percent =  floor($actual_value*100/$max_value);   $levelup=3; }
  20. elseif ($actual_value>=9000 and $actual_value<14000)  { $max_value= 14000; $percent = floor($actual_value*100/$max_value);   $levelup=4; }
  21. elseif ($actual_value>=14000 and $actual_value<18000) { $max_value= 18000; $percent = floor($actual_value*100/$max_value);   $levelup=5; }
  22. elseif ($actual_value>=18000 and $actual_value<23000) { $max_value= 23000; $percent = floor($actual_value*100/$max_value);   $levelup=6; }
  23. elseif ($actual_value>=23000 and $actual_value<28000) { $max_value= 28000; $percent = floor($actual_value*100/$max_value);   $levelup=7; }
  24. elseif ($actual_value>=28000 and $actual_value<36000) { $max_value= 36000; $percent = floor($actual_value*100/$max_value);   $levelup=8; }
  25. elseif ($actual_value>=36000 and $actual_value<50000) { $max_value= 50000; $percent = floor($actual_value*100/$max_value);   $levelup=9; }
  26. elseif ($actual_value>=50000 and $actual_value<60000) { $max_value= 60000; $percent = floor($actual_value*100/$max_value);   $levelup=10;}
  27.  
  28. if ($level!=0) {
  29. //Subimos el nivel del usuario
  30. $update_level=$conexion->prepare("UPDATE usuarios SET level=? WHERE user=?");
  31. $update_level->bind_param('is', $levelup, $username);
  32. $update_level->execute();
  33. $update_level->close();
  34. }

estoy implementando el siguiente codigo para lo que es llevar el control del nivel de reputacion que tienen los usuarios de mi web y sus avances en forma de porcentaje... (todo esto, es calculado en base a los puntos que posean)

el codigo funciona perfectamente, sin embargo... lo he hecho bajo lo que se, y lo considero un tanto manual y rustico si se quiere... hay alguna forma de simplificar lo que alli hice mediante el uso de ciclos?

y otra duda.... al subir de nivel me gustaria guardar dicho avance en una tabla llamada 'actividad' la cual ya he creado, el detalle esta en que no se como hacer la consulta de insercion SOLO y unicamente cuando un usuario avance de nivel...
Solo un pequeño consejo, si basas la reputación en los porcentajes, aplicales a todos el valor maximo de puntos, porque sino, resulta que tiene mas reputación el que tiene 2999 que el que tiene 3000 (es solo por ponerte un ejemplo, haz los cálculos sobre tu codigo). Ademas de esta forma asignas solamente una vez un valor a la variable $max_value.

Sobre como hacer una inserción en una tabla, encontraras bastante información por el foro, y para que solo realice esa operación cuando haya una subida de nivel, tendrás que usar una sentencia de control, que compare el valor viejo con el actual, y si es mayor, que almacene ese nuevo valor en la tabla.

A nivel de código, yo lo simplificaría mas, para que comprobar si esta entre 2 valores? Comprueba solo si es menor que el valor máximo, y si se cumple sales de la secuencia de elseif con un goto. (muchos diran que no les gusta, pero es una orden valida si se usa con cabeza)

Tendrías algo así:

SI Puntos<3000 {Tu código y un goto fin}
SI Puntos<6000 {Tu código y un goto fin}
.
.
.
fin:
resto de código;

Esto seria así si son muchos usuarios los de nivel bajo, te ahorrara algo de tiempo de proceso de la CPU. Pero bueno, esto dependerá del numero total de usuarios que vayan a usar la aplicación, sino, es insignificante.

Última edición por ica1977; 30/06/2016 a las 02:16