Foros del Web » Programando para Internet » PHP »

Ciclo for con consulta a la bd

Estas en el tema de Ciclo for con consulta a la bd en el foro de PHP en Foros del Web. Hola amigos, tengo el siguiente problema, tengo una tabla asi: NIVEL | POSICION | USUARIO 1 1 0 1 2 0 2 1 0 2 ...
  #1 (permalink)  
Antiguo 05/04/2021, 13:41
 
Fecha de Ingreso: marzo-2004
Mensajes: 194
Antigüedad: 17 años, 1 mes
Puntos: 1
Ciclo for con consulta a la bd

Hola amigos, tengo el siguiente problema, tengo una tabla asi:
NIVEL | POSICION | USUARIO
1 1 0
1 2 0
2 1 0
2 2 0
Lo que tengo que hacer es una consulta que verifique el valor del usuario de la posición 1 del nivel 1, si el valor es 0 que introduzca un valor X, si el valor es !=0 busque el valor del usuario siguiente, si el valor es cero, introduzca un valor X de los contrario vaya a la primera posición del nivel 2 y verifique .. así sucesivamente
El tema es que son más de 8000 registros que tiene por verificar
yo lo tengo asi:
select usuario from Mitabla where nivel='1' and posicion='1';
if (usuario==0){ inserte el valor }
else{select usuario from Mitabla where nivel='1' and posicion='2';
if usuario==0{inserte el valor }
else {select usuario from Mitabla where nivel='2' and posicion='1';

existe alguna manera de hacerlo?
Habia pensado por algun FOR o algo así, pero ni idea como hacerlo

De antemano agradezco la colaboracion
  #2 (permalink)  
Antiguo 05/04/2021, 18:47
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 15 años
Puntos: 120
Respuesta: Ciclo for con consulta a la bd

y para que quieres recorrer toda tu tabla si con una consulta SQL , obtene la lista de todos los tengan "usuario=0" y recorres y asignas el valor que quieres claro con su query respectivo como update

Código MySQL:
Ver original
  1. SELECT usuario,nivel,posicion FROM Mitabla WHERE usuario='0' OR usuario IS NULL;
Código PHP:
Ver original
  1. foreach($pdo->fetchAll(\PDO::FETCH_ASSOC) as $row){
  2.      $valor_de_usuario = '99';
  3.        funcion_que_actualiza_usuario($row["nivel"],$row["posicion"], $valor_de_usuario );
  4. }
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9
  #3 (permalink)  
Antiguo 05/04/2021, 20:34
 
Fecha de Ingreso: marzo-2004
Mensajes: 194
Antigüedad: 17 años, 1 mes
Puntos: 1
Respuesta: Ciclo for con consulta a la bd

Gracias por responder, en realidad el tema es mas complejo de lo que yo lo expuse, busqué simplificarlo para facilitar un poco las cosas pero en realidad es asi
los niveles son 12
cada nivel tien el doble de posiciones del anterior es decir
Nivel 1 -> 1 posición
Nivel 2 -> 2 posiciones
Nivel 3 -> 4 posiciones
Nivel 4 -> 8 posiciones
Nivel 5 -> 16 posiciones
Nivel 6 -> 32 posiciones y así sucesivamente

La posición de mi usuario es relativa a la posición de un usuario principal entonces que debo hacer? consultar la posición del usuario ppal (su nivel y la posición en su nivel) y luego reviso en el nivel siguiente si la posición 1 esta libre, en caso de estarlo, registro al usuario alli, de lo contrario reviso la posicion 2. si no esta vacia paso al otro nivel y consulto los cuatro espacios (uno por uno), de estar llenos voy al nivel siguiente y consulto los ocho espacios de ese nivel y en el primero que encuentre registro mi usuario.
Siendo asi debo realizar un máximo de 4094 consultas.

No se si exista una manera simplificada de hacerlo que no sea
realizar la consulta y validar, si es cero registrar de los contrario realizar la otra consulta y asi sucesivamente.
  #4 (permalink)  
Antiguo 06/04/2021, 12:06
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 15 años
Puntos: 120
Respuesta: Ciclo for con consulta a la bd

en si tienes una piramide de pascal, al cual quieres ir rellenando, dependiendo del usuario que sea elegido como maestro, y a ese maestro agregarle otro usuario descendiente que este libre no? o bueno ejej seria mejor si nos explicas un poco, para ayudarte en la logica que usas, si bien es contraproducente hacer bucles en bases de datos, por para ello era mejor optar por un DB de ficheros o usar mongo
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9
  #5 (permalink)  
Antiguo 06/04/2021, 18:01
 
Fecha de Ingreso: marzo-2004
Mensajes: 194
Antigüedad: 17 años, 1 mes
Puntos: 1
Respuesta: Ciclo for con consulta a la bd

Gracias por responder y es cierto, es una pirámide
quise probar solo llenando los datos en la tabla ya creada pero eso me limita la cantidad de niveles
de todas maneras al hacer consultar por consulta se cuelga en el 6 nivel y pues voy a explicar el tema como lo hice
defino el nivel y la posición del usuario ppal en un variables
$n = nivel ppal
$pos = posicion ppal
defino los niveles en variables y las posiciones siguientes en variables
//-------------------------NIVEL 1
$nivelA = $n+1;
$pos1 = ($pos*2)-1;
$pos2 = ($pos*2);
//-------------------------NIVEL 2
$nivelB = $n+2;
$pos3=($pos1*2)-1;
$pos4=($pos1*2);
$pos5=($pos2*2)-1;
$pos6=($pos2*2);
//-------------------------NIVEL 3
$nivelC = $n+3;
$pos7=($pos3*2)-1;
$pos8=($pos3*2);
$pos9=($pos4*2)-1;
$pos10=($pos4*2);
$pos11=($pos5*2)-1;
$pos12=($pos5*2);
$pos13=($pos6*2)-1;
$pos14=($pos6*2);

Teniendo en cuenta que debajo de cada posición existen dos campos
uno que es igual al doble de la posición menos 1 y otro que es igual al doble de la posición

luego empiezo a consultar uno por uno en donde el usuario es cero para reemplazar ese cero por el id del nuevo usuario asi

Consulto la pimera posicion y creo una variable que si es "0" cree una variable con el id del usuario nuevo de lo contrario realice la consulta de la siguiente posicion

$nred = "select * from tabla where nivel='$nivelA' and posicion='$pos1'"
$nusuario = $nreds['usuario'];
if($nusuario==0){
$redpos = $nreds['idr'];
}else{
$nred = "select * from tabla where nivel='$nivelA' and posicion='$pos2'";
$nusuario = $nreds['usuario'];
if($nusuario==0){
$redpos = $nreds['idr'];
}else{
$nred = "select * from tabla where nivel='$nivelB' and posicion='$pos3'";
$nusuario = $nreds['usuario'];


pero eso es un if dentro de un if dentro de un if y asi son 8000

dentro de las cosas que se me han ocurrido pense en hacer la verificación por niveles y si estan todos los campos ocupados llamar un archivo externo que me realice la otra consulta, pero no creo tampoco que sea una manera optima de realizarlo



La zona horaria es GMT -6. Ahora son las 20:27.