Title: Sesiones con roles php
Tags: php;sesiones
Question: Tengo que realizar una aplicación en la que depende del usuario que esté logueado, entre en una página u otra.
Tengo en la base de datos dos tablas:
Propietarios (Dni,apellnom,password,telefono) donde:
- Dni contiene el dni de cada uno de los propietarios
- apellnom, contiene el nombre y apellidos de los propietarios
- telefono: contiene el teléfono del propietario
Clientes (Dni,apellnom,password,telefono) donde:
- Dni contiene el dni de cada uno de los clientes
- apellnom, contiene el nombre y apellidos de los clientes
- telefono: contiene el teléfono del cliente

Dentro de Propietario tengo un usuario que se llama administrador. Quiero que al loguearme con su dni"1111A" y su contraseña acceda a una página que solo pueda visualizar el.
Tambien necesito que en otras páginas puedan verla o los clientes, o los propietarios.

Os dejo el código del manejador de sesiones:

```<?php
//Recibimos las dos variables
$usuario=$_POST["usuario"];
$password=$_POST["password"];
session_start();
$conexion=mysqli_connect("localhost","root","","inmobiliaria");
mysqli_set_charset($conexion, "utf8");
$consulta="SELECT * FROM `clientes` WHERE Dni='".$usuario."' AND PASSWORD='".$password."'";
$resultado=mysqli_query($conexion,$consulta);
//si es cliente
if(mysqli_num_rows($resultado)==1){
    $fila=mysqli_fetch_assoc($resultado);
    $_SESSION['clientes']=$fila;
    header("Location: index.php");
}
//si es propietario
$consulta="SELECT * FROM `propietarios` WHERE Dni='".$usuario."' AND PASSWORD='".$password."'";
$resultado=mysqli_query($conexion,$consulta);
if(mysqli_num_rows($resultado)==1){
    $fila=mysqli_fetch_assoc($resultado);
    $_SESSION['propietarios']=$fila;
    header("Location: index.php");
}
/* Si no el usuario no se encuentra en ninguna de las dos tablas 
imprime el siguiente mensaje */
$mensajeaccesoincorrecto = "El usuario y la contraseña son incorrectos, por favor vuelva a introducirlos.";
echo "<a href='index.php'&gt;". $mensajeaccesoincorrecto."</a&gt;";
?&gt;
</body&gt;</html&gt;`


y esta la página a la que intento entrar con el usuario con dni 1111A de la tabla propietarios.

<?php
echo
    '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
    <html xmlns="http://www.w3.org/1999/xhtml"&gt;
    <head&gt;
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
    <html&gt; 
    <head&gt; 
    <title&gt;Roles y sesiones</title&gt; 
    </head&gt; 
    <body&gt;';
session_start();
include('funciones.php');
cabecera('INMOBILIARIA');
echo "<div id=\"contenido\"&gt;\n";
echo "<h1&gt;Bienvenidos - Inmobiliaria</h1&gt;";
echo "</div&gt;";
if(isset($_SESSION['propietarios'])){

    $conexion=mysqli_connect("localhost","root","","inmobiliaria");
    mysqli_set_charset($conexion, "utf8");

    $sqlListado="SELECT Dni, apellnom, telefono FROM propietarios";
            $sqlListado.=" order by Dni";
            $resultPrincipal=$conexion-&gt;query($sqlListado);
            $numLineas=$resultPrincipal-&gt;num_rows;
            if($numLineas&gt;0){
                echo "<table align=center border=2 bgcolor='#F0FFFF' &gt;"; 
                echo "<td  align=center width='70px'&gt;<b&gt;Listado de Propietarios: </b&gt;</td&gt;"; 
                echo '<table border="1" bgcolor="efd5c4" width="300px" align=center&gt;<tr&gt;<th&gt;DNI</th&gt;<th&gt;Nombre y apellidos</th&gt;<th&gt;Teléfono</th&gt;</tr&gt;';
                while ($fila=$resultPrincipal-&gt;fetch_assoc()){
                    extract($fila);
                    echo "<tr&gt;<td&gt;$Dni</td&gt;<td&gt;$apellnom</td&gt;<td&gt;$telefono</td&gt;";
                    echo " </td&gt; </tr&gt;";
                }
            }
            else{
                echo "<h3&gt;No hay ningun propietario registrado.</h3&gt;";
            }

            $sqlListado="SELECT Dni, apellnom, telefono FROM clientes";
            $sqlListado.=" order by Dni";
            $resultPrincipal=$conexion-&gt;query($sqlListado);
            $numLineas=$resultPrincipal-&gt;num_rows;
            if($numLineas&gt;0){
                echo "<table align=center border=2 bgcolor='#F0FFFF' &gt;"; 
                echo "<td  align=center width='70px'&gt;<b&gt;Listado de Clientes: </b&gt;</td&gt;"; 
                echo '<table border="1" bgcolor="efd5c4" width="300px" align=center&gt;<tr&gt;<th&gt;DNI</th&gt;<th&gt;Nombre y apellidos</th&gt;<th&gt;Teléfono</th&gt;</tr&gt;';
                while ($fila=$resultPrincipal-&gt;fetch_assoc()){
                    extract($fila);
                    echo "<tr&gt;<td&gt;$Dni</td&gt;<td&gt;$apellnom</td&gt;<td&gt;$telefono</td&gt;";
                    echo " </td&gt; </tr&gt;";
                }
            }
            else{
                echo "<h3&gt;No hay ningun cliente registrado.</h3&gt;";
            }

}else{
    // nos envía a la siguiente dirección en el caso de no poseer autorización  
    header("location:index.php");
}
?&gt; 
```

Comment: ¿Qué has intentado? ¿Qué errores has obtenido?

Comment: En el indice tengo un login, inicio sesion con un usuario de la tabla propietarios e intengo entrar a esa página, y me lo deja ver. Pero si entro con un usuario de la tabla clientes tambien me deja entrar en esa página. Por lo que deja entrar a cualquier usuario que esté logueado. Lo que necesito es que por ejemplo ahí solo entre un usuario concreto de la tabla propietarios. Si necesitas algún dato más te lo pongo.

Here is the accepted answer: Para empezar, te sugiero que aprendas el uso de variables de sesión con un ejemplo mucho más simple, fácil de entender y de seguir. Una vez que tengas clara su lógica, ya le puedes añadir todo lo que vayas necesitando. Algo así:

```<?php
// inicias sesión
session_start();
// inicias la conexión a tu base de datos
$conn = new mysqli('localhost','root','','stackoverflow');
// si el usuario te pide que cierres su sesión, la reinicias
if(isset($_GET['logout'])){
    session_destroy();
    session_start();
}
// si te han enviado el formulario de login, valida al usuario
if(isset($_POST['usuario'])){
    $rs=$conn-&gt;query("
        SELECT * FROM clientes
          WHERE dni='".$_POST['usuario']."'
          AND `password`='".$_POST['password']."';
    ");
    if($rs-&gt;num_rows) $_SESSION['usuario']='cliente';
    $rs=$conn-&gt;query("
        SELECT * FROM propietarios
          WHERE dni='".$_POST['usuario']."'
          AND `password`='".$_POST['password']."';
    ");
    if($rs-&gt;num_rows) $_SESSION['usuario']='propietario';
}
// si no se ha logueda correctamente, solicita datos de acceso
if(!isset($_SESSION['usuario'])){
    echo '
        <form method="post"&gt;
            <input name="usuario" autofocus&gt;
            <input name="password" type="password"&gt;
            <button&gt;Acceder</button&gt;
        </form&gt;
    ';
    exit();
}
echo '
    <div style="background-color:pink"&gt;
        Si has llegado hasta aquí es que eres: '.$_SESSION['usuario'].'
    </div&gt;
    <div&gt;
        <a href="?logout=1"&gt;Salir</a&gt;
    </div&gt;
';
```

No me hace mucha gracia que las consultas no sean preparadas o ese modelo de datos con dos tablas diferentes para validar usuarios, pero bueno, se trata de que veas los pasos que habría que dar. Tampoco se trata de hacer una primera versión perfecta, sino de que se entienda y te permita crecer. De hecho, podrías haberte hecho una validación hardcodeada y te evitabas toda la parte de la base de datos.

Fíjate que lo tienes todo en el mismo fichero y, si algo te falta, lo vas pidiendo: ¿No tengo variable de sesión? Muestro formulario de login ¿Me envían datos de login? Los valido en la base de datos. Si ya lo tienes todo, pues directamente lo muestras. Prueba y me dejas las dudas en los comentarios. Ánimo con ello.

Comment for this answer: Muchas gracias así lo veo mucho mas claro y creo que he logrado realizar lo que quería. Estoy estudiando un ciclo de DAW y de momento es la forma de la que nos están "enseñando".
Comment for this answer: Pues, ya sabes: divide y vencerás :) [Recuerda validar y votar](https://es.stackoverflow.com/help/someone-answers) y [Gana +2 de reputación](https://es.meta.stackoverflow.com/a/3762/119615)


{'source': 'StackExchangeDataset', 'subset': 'es.stackoverflow.com', 'metadata': {'AnswerCount': 1, 'CommentCount': 2, 'ContentLicense': 'CC BY-SA 4.0', 'CreationDate': '2020:00:04/30/20', 'FavoriteCount': None, 'PostTypeId': 1, 'Tags': '<php><sesiones>', 'Title': 'Sesiones con roles php', 'ViewCount': 173, 'id': 351152, 'user_AboutMe': '', 'user_AccountId': 16809632.0, 'user_DisplayName': 'Aerys', 'user_Reputation': 27.0, 'user_Views': 6.0, 'user_id': 143626.0}}