Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PHP (https://www.clubdelphi.com/foros/forumdisplay.php?f=15)
-   -   Menu por tipo de usuario (https://www.clubdelphi.com/foros/showthread.php?t=45815)

enecumene 14-07-2007 01:22:01

Menu por tipo de usuario
 
Saludos compañeros del foro!!. tengo un problema, trabajo con php+Mysql, y sucede lo siguiente estoy tratando de hacer un include con menu por el tipo de usuario, me explico, si el usuario logeado es administrador le deberia salir un menu especifico para administrador, y si el usuario es operador le deberia salir un menu especifico para operador diferente al del administrador. espero haberme explicado bien. anexo les dejo el codigo que utilizo:

Código PHP:

<?php 
include('db.php');  
$sql="select * from authorize where username='$user' and group1 <> 'Operador'";
$resultmysql_query($sql);
if(
mysql_num_rows($result))
{
 while( 
$row mysql_fetch_array($result) ) 
    { 
       include(
'menu_adm.html');
       }
    } else {
         include(
'menu_op.html');
         }    

 
 
?>

en este codigo trato de interpretar que si el tipo de usuario es distinto a Operador me deberia salir el menu de administrador "menu_adm.html" de lo contrario el menu de operador "menu_op.html". pero no me funciona!!!. me sale el menu de operador sin importar que el usuario sea administrador.

Saludos

D-MO 14-07-2007 01:26:03

Se trata de adivinar el problema?

enecumene 14-07-2007 01:28:38

D-MO, disculpa es que lo termine antes completarlo pero ya lo edite y complete lo que trataba de explicar. disculpas.

Hagen 14-07-2007 01:44:44

Tal vez el error esté en la consulta
 
Pues, esta linea esta muy sospechosa
Código PHP:

$sql="select * from authorize where username='$user' and group1 <> 'Operador'"

group1 no sera $group1

La mejor forma de saber si tu consulta "sql" esta bien, es imprimirla antes de ejecutarla.

Saludos...

roman 14-07-2007 01:48:57

¿Estás seguro de que esa consulta te regresa algo? Porque da la impresión de que no encuentra nada y mysql_num_rows regresa 0. También podría ser que haya un error en la consulta. Si display_errors está inactivo, no lo notarías pero haría que mysql_num_rows regrese false.

// Saludos

enecumene 14-07-2007 01:55:27

bueno roman, efectivamente, hice el arreglo que me sugirio Hagen:

Código SQL [-]
$sql="select * from authorize where username='$user' and ".$grupo." <> 'Operador'";

y me sale el siguiente error:

Cita:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\AppServ\www\seopc\admin\menu.php on line 5
hay alguna mejor manera de hacerlo?. Gracias.

roman 14-07-2007 02:03:02

¿Mejor manera de hacer qué? ¿Reproducir el error? Si en tu tabla hay un campo llamado group1 entonces no haría falta ningún cambio. Por el contrario, si no existe tal campo, entonces habría que ver qué es lo que realmente intentabas al poner group1 (no era una variable porque se presenta un error).

El hecho de que ahora te muestre un error significa que sí tienes activado el display_errors. Por tanto, parece que la consulta era correcta pero no te está regresando nada. Quizá nosea Operador, sino operador (o minúscula).

En todo caso, haz como dice Hagen, e imprime la consulta:

Código PHP:

echo $sql

para asegurarte que estás mandando lo correcto.

// Saludos

enecumene 14-07-2007 02:30:54

Ya hice la impresion y ya vi cual es el problema:

Código SQL [-]
  select * from authorize where username='' and group1 <> 'Operador'

donde dice:

Cita:

where username=''
me sale en blanco. estoy tratando de resolverlo pero que va algo tan sencillo me tiene en la loma.:D.

que hago aqui? debo arreglar la consulta. aclaro que tengo un hidden field llamado 'user' y tiene ese valor:

Código PHP:

<? echo $_SESSION[user_name];?>

la consulta la deberia hacer asi?

Código SQL [-]
select * from authorize where username='$_SESSION[user_name]' and group1 <> 'Operador'

seguro que es algo muy sencillo pero no logro caer en ello. Saludos

enecumene 14-07-2007 02:35:54

Efectivamente eso era lo que me faltaba, ahora si funciona. la consulta lo tenia que hacerla asi:

Código SQL [-]
select * from authorize where username='$_SESSION[user_name]' and group1 <> 'Operador'

Gracias a Roman, D-Mo y Hagen por su tiempo. mil gracias!!

dec 14-07-2007 02:38:49

Hola,

Yo lo que me pregunto es si el acceso a "menu_adm.html" podría tener algunas consecuencias negativas, puesto que, al fin y al cabo, alguien podría dar con la URL necesaria... no sé. Digo que me lo pregunto, evidentemente, no sé si pasaría algo o no podría pasar nada.

enecumene 14-07-2007 02:45:25

Bueno dec no se a que te refieres pero yo lo tengo de esta manera:

Código PHP:

<td width="187" valign="top" bgcolor="#000000"><div align="center">
      <p>
      <span class="style19"><? include('menu.php '); ?></span></p>
    </div></td>

no se si de esta manera trae consecuencias negativas.:confused:. Saludos.

dec 14-07-2007 02:50:11

Hola,

Pues nos vamos a "menu.php". Yo me refiero a que alguien averigue que existe un archivo "menu_adm.html" y lo "visite". En este caso, si el contenido es el que muestras, se incluirá el Script "menu.php". Ahora bien, ¿puede haber algún problema porque alguien "sin privilegios" acceda a "menu.php"? Yo no lo sé. Y esa es la duda que tenía.

Pero, ya digo, que tal vez no haya ningún problema, que en realidad es algo que me ha chocado, pero, nada más, puedo estar equivocado y que en realidad no se de ningún problema. :)

roman 14-07-2007 02:56:13

dec tiene razón. Si toda la seguridad se basa en esa elección en menu.php, alguien podrá acceder directo a menu_adm.html. Quizá baste que pongas menu_adm.html fuera del alcance global, bien sea sacándolo del árbol de directorios web e indicando la ruta completa en el include, o bien con alguna directiva de Apache en un htaccess (suponiendo que usas Apache).

// Saludos

enecumene 14-07-2007 03:01:34

Gracias Dec y Roman, tratare de hacer sus recomendaciones. Mil Gracias.

roman 14-07-2007 03:08:47

Cuando autenticas al usuario, bien podrías guardar su estatus de operador en otra variable de sesión, y así evitar una consulta al servidor en cada aceso al menú.

// Saludos

lucasarts_18 14-07-2007 03:47:33

Cita:

Empezado por enecumene
Ya hice la impresion y ya vi cual es el problema:

Código SQL [-]
select * from authorize where username='' and group1 <> 'Operador'

Te recomiendo ampliamente que uses mysql_error

Hasta Luego .-

roman 14-07-2007 03:57:26

Pero en este caso no hay error, la consulta es correcta; es sólo que no había ningún registro que la satisficiera.

// Saludos

lucasarts_18 14-07-2007 04:03:12

Cita:

Empezado por roman
Pero en este caso no hay error, la consulta es correcta; es sólo que no había ningún registro que la satisficiera.

Claro...:), pero como buena práctica yo lo uso siempre para evitar otros quebraderos de cabeza, por otra parte creo que se podría subsanar con count a la variable $result, si es mayor a 0, aplicamos la función mysql_num_rows, no sé, no recuerdo del todo pero al parecer lo he usado en algunas partes de esa forma.

Ya dirán....:D

Hasta Luego .-

roman 14-07-2007 05:00:50

count a la variable $result no creo que funcione. En todo caso, se hace un count en la misma consulta sql:

Código SQL [-]
select count(*) from authorize where username='$_SESSION[user_name]' and group1 <> 'Operador'

pues de esta manera minimizamos el tamaño de los datos que se traen del servidor. Porque, a menos que se necesiten otros datos, en este contexto parece que sólo se quiere validar, así que basta saber si el valor regresado es 0 o mayor que 0.

Ahora bien, lo de usar mysql_error tambien hay que hacerlo con cuidado; yo diría que sólo durante el desarrollo pero no en producción, porque puede mostrar información acerca de nuestra base de datos que no convenga.

// Saludos

lucasarts_18 14-07-2007 06:05:41

Cita:

Empezado por roman
Ahora bien, lo de usar mysql_error tambien hay que hacerlo con cuidado; yo diría que sólo durante el desarrollo pero no en producción, porque puede mostrar información acerca de nuestra base de datos que no convenga.

Claro, puede ser peligroso, sin embargo las librerías PEAR, específicamente el package DB tiene varios métodos de capturar error, uno de ellos es el getUserInfo y el otro es getDebugInfo, el primero es para entornos de producción y el segundo para entornos de desarrollo, ambos muestran mensajes adecuados para cada situación para no arriesgar la seguridad.

Ahora estoy probando PDO, para ver que tal.

Hasta Luego .-


La franja horaria es GMT +2. Ahora son las 07:30:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi