Foros del Web » Programando para Internet » PHP »

Usar datos de resultado de Query, fuera del While

Estas en el tema de Usar datos de resultado de Query, fuera del While en el foro de PHP en Foros del Web. Buen día. Tengo una duda y espero me den una luz. En mi sistema, tengo varias opciones de menú a la que algunos no pueden ...
  #1 (permalink)  
Antiguo 08/05/2018, 11:49
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 545
Antigüedad: 5 años, 3 meses
Puntos: 44
Usar datos de resultado de Query, fuera del While

Buen día.

Tengo una duda y espero me den una luz.
En mi sistema, tengo varias opciones de menú a la que algunos no pueden ingresar, (Aprobar Ordenes de Compra por ejemplo) lo que hago es que al dar clic a esa opción se valla al php en cuestión y evalué si el usuario tiene privilegio de Aprobar Ordenes de Compra si tiene lo deja pasar y si no lo manda a una pagina de error y lo regresa a donde estaba antes de haber dado clic al enlace, hasta ahí todo bien, funciona y todo.

La cosa es que quiero implementar otro tipo de "seguridad" o mejor dicho otro tipo de método, quiero ocultar las opciones a las que no tenga permiso el usuario, por lo que se me ocurrió hacer un query donde consulto todos los privilegios por el usuario de la sesión

Código PHP:
Ver original
  1. $id = $_SESSION['iduser'];
  2. $privilegios = $mysqli->query("SELECT accion,privilegio FROM privilegio WHERE usuario='$id' ") or trigger_error($mysqli->error);
  3. while($row = $privilegios->fetch_array(MYSQLI_ASSOC)){
  4.     $axx = $row['accion'];
  5.     $pxx = $row['privilegio'];
  6.     $pasox = array($axx => $pxx);
  7.     // foreach($pasox as $acci=>$privi)
  8.     // {
  9.     // echo "Accion " . $acci . " Con Privilegio " . $privi;
  10.     // echo "<br>";
  11.     // }
  12.     // var_dump($pasox);
  13. }

* Esta porcion de codigo la quiero incluir en el menu para evitar ponerla en todos lados.

Pero haciendo pruebas, tengo el problema que no me logra sacar la info que necesito si no estoy dentro del while del result

Si habo el var_dump($pasox) dentro del while funciona y muestra todo el array ($pasox) pero si lo hago fuera solo muestra la ultima fila y ojo se que eso es normal pero lo que quiero saber es si puedo evitar eso, por eso es el tema

Incluso si quiero hacer un (if) fuera del while sucede lo mismo, obviamente cuando imprimo una tabla de datos lo hago dentro del while pero con esto no puedo hacerlo puesto que quiero tratar el resultado en otros archivos php, incluso pensé en meter el resultado en una variable de sesión pero no me sale.

Luego buscar en el array para ver si el fulano tiene o no "X" privilegio y por medio de CSS ocultarle algunas cosas

Código PHP:
Ver original
  1. if ($axx = 21 ) {
  2.     echo "Existe 1";
  3. }
  4. else{
  5.     echo "No Existe 1";
  6. }
  7.  
  8. if (in_array(21, $pasox) ) {
  9.     echo "Existe 2";
  10. }
  11. else{
  12.     echo "No Existe 2";
  13. }

Tienen alguna idea de que podría hacer para sacar un array o una variable que tenga todos los privilegios de un usuario y usarlo donde sea y cuando sea?

Se que hay varios modelos de gestión de permisos por ahí pero yo necesito algo que se adecue a lo que ya tengo
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #2 (permalink)  
Antiguo 08/05/2018, 12:08
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 10 años, 5 meses
Puntos: 528
Respuesta: Usar datos de resultado de Query, fuera del While

Dependerá mucho de cómo tengas almacenados los permisos, la forma en que puedes sacar la lista, pero creo que tu código falla aquí:

$pasox = array($axx => $pxx);

Con cada iteración estás sobreescribiendo el arreglo, creo que deberías hacerlo así:

$pasox[]=array($axx => $pxx);
  #3 (permalink)  
Antiguo 08/05/2018, 15:03
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 545
Antigüedad: 5 años, 3 meses
Puntos: 44
Respuesta: Usar datos de resultado de Query, fuera del While

Muy bien, muy bien, vamos avanzando, ya se puede hacer el var_dump($pasox) desde fuera del while y se muestran todos los permisos.

La forma en como están los datos es así, columna acción, columna permiso, permiso puede ser 0 o 1, y después de sacar esos datos lo que necesito hacer casi que donde sea es evaluar, como así ?

Aprobar Orden de Compra es una acción en la DB con código 44

Pseudo codigo
Código:
Si acción 44 = 1 entonces imprimir menu // Osea tiene permiso este usuario
    Aprobar Orden de Compra
Fin Si
Así evaluaría unas cuantas acciones, después con CSS las ocultaría, esa es mi idea, tipo el sistema de roles de Symfony
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #4 (permalink)  
Antiguo 15/05/2018, 13:44
Avatar de vicram10  
Fecha de Ingreso: enero-2009
Ubicación: Asuncion
Mensajes: 316
Antigüedad: 9 años, 8 meses
Puntos: 27
Respuesta: Usar datos de resultado de Query, fuera del While

de la manera como yo lo hago es asi

Tengo una tabla donde es una clave compuesta, o sea se repite una palabra clave y es variable el id del departamento o role

Tabla: menu_acceso

codMenu / user_depart

agregar-usuario / 1
agregar-usuario / 2
agregar-usuario / 5
agregar-usuario / 10

Tengo una funcion que revisa dicha tabla acuerdo al ID_DEPART de cada usuario de la siguiente forma

Código PHP:
Ver original
  1. //para saber si que permisos tiene el usuario que se loguea
  2.     function PermisosMenu($menu)
  3.     {
  4.         global $capaNegocios, $datosUsuario, $user_key;
  5.        
  6.         //el administrador puede ver todo
  7.         if ($datosUsuario['es_admin'] == 1)
  8.         {
  9.             return true;
  10.         }else{
  11.             $idDepart = (int) $datosUsuario['id_depart'];
  12.             //verificamos si tiene los permisos necesarios
  13.             $tienePermiso = $capaNegocios->ContadorRegistrosTabla('menu_acceso', "where codMenu = '$menu' and user_depart = $idDepart");
  14.             if ($tienePermiso > 0)
  15.                 return true;
  16.             else
  17.                 return false;
  18.         }
  19.     }
Obs.: la variable que uso $datosUsuario es un array con los datos del usuario que esta logueado


Para usar dicha funcion lo hago desde el array o constructor de mi menu principal de la siguiente forma

Código PHP:
Ver original
  1. $menu_principal = array(
  2.     'usuarios' => array(
  3.             'titulo_menu' => 'Agregar Usuarios',
  4.             'url' => '?opt=Usuarios/Agregar', //o la url que usas para cada accion
  5.             'visible' => PermisosMenu('agregar-usuario'), //este devuelve true o false como se puede ver arriba
  6.     ),
  7. );

Entonces donde imprimo el menu hago asi

Código PHP:
Ver original
  1. foreach($menu_principal as $key => $value){
  2.     if ($value['visible']){
  3.         echo '<a href="', $value['url'] ,'">', $value['titulo_menu'] ,'</a>';
  4.     }
  5. }
__________________
Asunción Paraguay
Licenciado - Desarrollador Web - Gerente Desarrollo TI (BEPSA)
Espacio Geek - Comunidad Tecnologica

Última edición por vicram10; 15/05/2018 a las 13:49 Razón: no funciona la opcion table :P
  #5 (permalink)  
Antiguo 15/05/2018, 14:03
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 545
Antigüedad: 5 años, 3 meses
Puntos: 44
Respuesta: Usar datos de resultado de Query, fuera del While

Agradezco mucho su respuesta

Su menú se crea cada vez que se crea la pagina? a mi no me gusta eso de los menús dinámicos

Por otro lado, mi forma de manejo de permisos ya esta creada y funciona bien, lo que quería era hacer un array de los permisos de los usuarios y poder evaluar si un usuario tiene o no permiso a X opción, si no tiene pues se lo escondo.

Analizare mejor su código y veré si puedo sacar algo de ahí, aunque recuerde el asunto central de mi post, incluso esta en el tema Usar datos de resultado de Query, fuera del While
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #6 (permalink)  
Antiguo 15/05/2018, 14:10
Avatar de vicram10  
Fecha de Ingreso: enero-2009
Ubicación: Asuncion
Mensajes: 316
Antigüedad: 9 años, 8 meses
Puntos: 27
Respuesta: Usar datos de resultado de Query, fuera del While

yap.. en parte te puede servir

Código PHP:
Ver original
  1. $pasox[] = array($axx => $pxx);

Este array contienen los permisos que posee el usuario (permisos de acceso a cada menu)?.

y lo segundo seria como armas el menu para poder insertar ese vector y comparar si tiene o no acceso al menu..
__________________
Asunción Paraguay
Licenciado - Desarrollador Web - Gerente Desarrollo TI (BEPSA)
Espacio Geek - Comunidad Tecnologica
  #7 (permalink)  
Antiguo 15/05/2018, 15:53
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 545
Antigüedad: 5 años, 3 meses
Puntos: 44
Respuesta: Usar datos de resultado de Query, fuera del While

Cita:
Iniciado por vicram10 Ver Mensaje
yap.. en parte te puede servir

Código PHP:
Ver original
  1. $pasox[] = array($axx => $pxx);

Este array contienen los permisos que posee el usuario (permisos de acceso a cada menu)?.

y lo segundo seria como armas el menu para poder insertar ese vector y comparar si tiene o no acceso al menu..
Como dijo Jack el Destripador, por partes por favor...

El array $pasox[] en efecto contiene todas las claves de acciones ($axx) apuntando a su debido permiso ($pxx) que este puede ser 0 o 1

En escencia, si se loguea el usuario FDW su array de permisos seria algo así
Código:
accion1 => 1
accion2 => 1
accion3 => 0
accion4 => 1
accion5 => 0
accion6 => 1
El menu yo no lo genero, yo tengo un archivo llamado menu.php con varias listas de menu, y por ejemplo en el menu tengo la opcion INACTIVAR USUARIO que pertenece a la acción 5 y como FDW tiene permiso 0, yo pondria como hidden esa opcion de menu y FDW no la podria ver.

Mi idea es incluir en el menu.php un archivo que me extraiga los permisos, (include permisos.php;) porque? porque asi yo puedo incluir ese archivo no solo en menus si no en cualquier otra cosa, al estar incluido, yo podria tomar el array $pasox[] generado en permisos.php y hacer magia, ocultando cosas segun me convenga

Por eso mi urgencia de manejar un array o result del query, fuera del while($row = $privilegios->fetch_array(MYSQLI_ASSOC)){}

PD: los nombres de las variables son ejemplos, no crean que así nombro mis variables
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #8 (permalink)  
Antiguo 15/05/2018, 16:53
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 10 años, 5 meses
Puntos: 528
Respuesta: Usar datos de resultado de Query, fuera del While

No entiendo si lo último que expones es simplemente un comentario sobre tu procedimiento o si tienes alguna duda...

De cualquier manera como sugerencia, dentro del script php donde realices la acción o procedimiento, revisa que el usuario efectivamente tiene permiso de hacerlo, ya sabes, por que el cliente podría falsear el menú, nunca hay que confiar en los datos de entrada.
  #9 (permalink)  
Antiguo 16/05/2018, 09:16
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 545
Antigüedad: 5 años, 3 meses
Puntos: 44
Respuesta: Usar datos de resultado de Query, fuera del While

Cita:
Iniciado por ocp001a Ver Mensaje
No entiendo si lo último que expones es simplemente un comentario sobre tu procedimiento o si tienes alguna duda...
Pues la duda sigue, la duda del tema PRINCIPAL.

Cita:
Iniciado por ocp001a Ver Mensaje
De cualquier manera como sugerencia, dentro del script php donde realices la acción o procedimiento, revisa que el usuario efectivamente tiene permiso de hacerlo, ya sabes, por que el cliente podría falsear el menú, nunca hay que confiar en los datos de entrada.
Eso siempre lo haré, y es lo que actualmente hago, lo único que quiero es esconder opciones de menú sin permiso, pero tomando como base mi actual sistema de permisos, explicado en el primer post
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #10 (permalink)  
Antiguo 16/05/2018, 10:09
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 10 años, 5 meses
Puntos: 528
Respuesta: Usar datos de resultado de Query, fuera del While

Bien, entonces, si no entendí mal, en tu menu.php tienes varias listas de menú predefinidas.

De ser así, no lo veo muy práctico, y en cambio te recomiendo generar el menú con base en los permisos de usuario en tiempo real, es decir, podrías guardar los permisos del usuario en una variable de sesión, y en el php (o javascript) tener una función que genere el menú según los permisos dados.

Yo tengo un sistema de permisos de la siguiente forma:

En mi sistema hay secciones, dentro de las secciones módulos, cada módulo puede tener de 1 a 10 pestañas, y dentro de cada pestaña pueden hacer 4 acciones: Guardar, modificar, borrar y reportear.
Obviamente habrá pestañas que no hagan las 4 acciones, pero así se puede generalizar.

Tengo una tabla donde registro los módulos y sus pestañas.

Así, se puede definir menús de forma ilimitada, estableciendo perfiles de usuario, y asignando a cada usuario un perfil/menú.

Si un día se necesita que a un usuario se le defina más o menos permisos, se modifica su perfil o se crea un perfil especial para el usuario.

En el login, se carga la lista de permisos del perfil ligado al usuario y se guarda en sesión.

Le paso el arreglo con los permisos a javascript mediante JSON, y ahí tengo una función que dibuja el menú, organizado por secciones y módulos.

Dentro del sistema, cada módulo sólo necesita leer los permisos del usuario para dicho módulo, por ejemplo:

módulo catálogo de clientes:
Código PHP:
Ver original
  1. if(!isset($usuario['permisos']['cat_clientes']))
  2.    die('No tiene permitido entrar a este modulo');
  3. if($usuario['permisos']['cat_clientes']['pes1']==1)
  4.    //dibujar pestaña 1
  5. if($usuario['permisos']['cat_clientes']['pes2']==1)
  6.    //dibujar pestaña 2

Espero que esto te ayude en algo. De lo contrario , te sugiero describir con más detalle cómo dibujas el menú, con el código que llevas para tartar de ayudarte de manera más específica.
  #11 (permalink)  
Antiguo 16/05/2018, 14:53
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 545
Antigüedad: 5 años, 3 meses
Puntos: 44
Respuesta: Usar datos de resultado de Query, fuera del While

Cita:
Iniciado por ocp001a Ver Mensaje
Espero que esto te ayude en algo. De lo contrario , te sugiero describir con más detalle cómo dibujas el menú, con el código que llevas para tartar de ayudarte de manera más específica.
En realidad mi me dio una idea, y es dibujar el menu al "vuelo", dinamicamente. Claro eso lo tendria que pensar y replantear a futuro.

Con lo citado: Yo no dibujo el menu, creo que asi le dicen cuando el menu es dinamico, yo ya tengo el archivo menu.php, y es un menu que con Bootstrap hace que se vea decente.

Código HTML:
Ver original
  1. <ul class="dropdown-menu mega-dropdown-menu row">
  2.     <li class="col-sm-3">
  3.         <ul>
  4.             <li class="dropdown-header">Proveedores</li>
  5.             <li><a href="CREAR_PROVEEDOR">CREAR</a></li>
  6.             <li><a href="ADMIN_PROVEEDOR">ADMINISTRAR</a></li>
  7.             <li class="divider"></li>
  8.         </ul>
  9.     </li>
  10.     <li class="col-sm-3">
  11.         <ul>
  12.             <li class="dropdown-header">Solicitud de Compra</li>
  13.             <li><a href="ORDEN_COMPRA">NUMERAR SOLICITUD</a></li>
  14.             <li class="divider"></li>
  15.         </ul>
  16.     </li>
  17. </ul>

pues en ese archivo, quiero hacer un include del archivo permisos.php, ese archivo tendría una query a la base y guardaría en un array los permisos del usuario del tipo accion => permiso, obviamente tomando como parámetro el usuario logeado

Código:
CREAR_PROVEEDOR => 1
ADMIN_PROVEEDOR=> 1
ORDEN_COMPRA => 0
En el menu.php haría un simple IF, en cada opción, que si en mi array de permisos, esta a 1 X opcion la muestre, y si no que le ponga la clase hidden y por ende la oculte.

Código PHP:
Ver original
  1. IF ($ORDEN_COMPRA =1 ){
  2.  <a href="CREAR_PROVEEDOR">CREAR</a>
  3. }
  4. else{
  5.   <a href="CREAR_PROVEEDOR" class="hidden">CREAR</a>
  6. }

Como ven no es mucha ciencia, lo único que necesito es manejar el array de permisos y pues no queria variable de sesión pero a como veo la cosa, creo que tocara algo asi
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #12 (permalink)  
Antiguo 16/05/2018, 15:33
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 10 años, 5 meses
Puntos: 528
Respuesta: Usar datos de resultado de Query, fuera del While

No necesitas obligatoriamente usar una variable de sesión, es lo que se usa comúnmente para no estar leyendo de la base de datos cada vez que se refresca la url, pero no es que no se pueda.

Por otra parte, más que tener un

Código PHP:
Ver original
  1. IF ($ORDEN_COMPRA ==1 ){
  2.      <a href="CREAR_PROVEEDOR">CREAR</a>
  3.     }
  4.     else{
  5.       <a href="CREAR_PROVEEDOR" class="hidden">CREAR</a>
  6.     }

sería mejor un

Código PHP:
Ver original
  1. IF ($ORDEN_COMPRA ==1 ){
  2.      <a href="CREAR_PROVEEDOR">CREAR</a>
  3.     }

Es decir, si no tiene el permiso, ni siquiera se crea la opción, no tiene sentido ocultar algo y cargar html que no se va a ver al cliente, después de todo, si alguien inspecciona el html podría habilitar la oción, aunque la valides luego en el servidor, no le veo caso tenerla.


Ahora bien, sobre la pregunta original, podrías crear un arreglo asociativo, para más comodidad:
Código PHP:
Ver original
  1. $id = $_SESSION['iduser'];
  2.     $privilegios = $mysqli->query("SELECT accion,privilegio FROM privilegio WHERE usuario='$id' ") or trigger_error($mysqli->error);
  3.     while($row = $privilegios->fetch_array(MYSQLI_ASSOC)){
  4.         $pasox[$row['accion']] =$row['privilegio'];
  5.         // foreach($pasox as $acci=>$privi)
  6.         // {
  7.         // echo "Accion " . $acci . " Con Privilegio " . $privi;
  8.         // echo "<br>";
  9.         // }
  10.         // var_dump($pasox);
  11.     }

Así, en el menú podrías hacer algo como:

Código PHP:
Ver original
  1. IF ($pasox['ORDEN_COMPRA'] ==1 ){
  2.      <a href="CREAR_PROVEEDOR">CREAR</a>
  3.     }
  #13 (permalink)  
Antiguo 17/05/2018, 11:12
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 545
Antigüedad: 5 años, 3 meses
Puntos: 44
Respuesta: Usar datos de resultado de Query, fuera del While

Cita:
Iniciado por ocp001a Ver Mensaje
No necesitas obligatoriamente usar una variable de sesión, es lo que se usa comúnmente para no estar leyendo de la base de datos cada vez que se refresca la url, pero no es que no se pueda.

Por otra parte, más que tener un

Es decir, si no tiene el permiso, ni siquiera se crea la opción, no tiene sentido ocultar algo y cargar html que no se va a ver al cliente, después de todo, si alguien inspecciona el html podría habilitar la oción, aunque la valides luego en el servidor, no le veo caso tenerla.


Ahora bien, sobre la pregunta original, podrías crear un arreglo asociativo, para más comodidad:


Se me fue la logica con lo primero sorry, es cierto, el if solo dibuja el menu cuando el privilegio es 1

Con lo segundo, con lo del array asociativo. El ultimo IF que pone deberia ponerlo en el menu.php, mas no hacer include, ya que ese if en cuestion lo debo hacer dentro del while, que quiero decir? que no puedo usar el query de permisos con otro archivo al cual yo le quiera ocultar algo.

Pero me parece buena la idea.

Gracias
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #14 (permalink)  
Antiguo 17/05/2018, 16:24
Avatar de vicram10  
Fecha de Ingreso: enero-2009
Ubicación: Asuncion
Mensajes: 316
Antigüedad: 9 años, 8 meses
Puntos: 27
Respuesta: Usar datos de resultado de Query, fuera del While

tu query de privilegios agregalo en uno de tus archivos que es llamado por todos tus otros archivos, entonces por asociacion de archivos lo tendras disponible en todos lados.

si tu menu.php se llama desde todos los lados, entonces ahi dentro podes tener el query con la variable de tus permisos.

y podras usarlo en cualquier otro lado.
__________________
Asunción Paraguay
Licenciado - Desarrollador Web - Gerente Desarrollo TI (BEPSA)
Espacio Geek - Comunidad Tecnologica
  #15 (permalink)  
Antiguo 18/05/2018, 08:53
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 545
Antigüedad: 5 años, 3 meses
Puntos: 44
Respuesta: Usar datos de resultado de Query, fuera del While

Cita:
Iniciado por vicram10 Ver Mensaje
tu query de privilegios agregalo en uno de tus archivos que es llamado por todos tus otros archivos, entonces por asociacion de archivos lo tendras disponible en todos lados.

si tu menu.php se llama desde todos los lados, entonces ahi dentro podes tener el query con la variable de tus permisos.

y podras usarlo en cualquier otro lado.
Es una buena idea
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.



La zona horaria es GMT -6. Ahora son las 05:31.