Ir para conteúdo

POWERED BY:

helkton

Paginação com nível de acesso

Recommended Posts

Ola galera seguinte, tenho um sistema de uma escola de cursos e nela tenho a paginação de alunos funcionando paginando tudo certinho, porem agora tenho uma questão:

Estou criando alguns niveis de aceso para o sistema ter varias unidades escolares tipo...

Unidade I

Unidade II

Unidade III e por ai vai "cada uidade em uma cidade" 

Os niveis sao os basicos, admin, professor, instrutor, recepcionista cada um deles com um ID de identificação ja consigo fazer alguns bloqueios de acordo com o nivel de qcesso do login, porem preciso limitar o acesso a paginacao tbm

Tipo quando o funcionario da Unidade I dependendo do nivel dele, ele nao podera visilualizar os alunos das outras unidades somente as da unidade dele

 

Na minha paginacao atual qdo eu pulo pra outra pagina ele me tras todos os resultados

Como corrigir, alguma dica de como fazer ou alguma outra logica

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!
Aparentemente, uma falha na lógica.
Uma vez que um user logado só pode acessar o que lhe é permitido, toda e qualquer query deverá conter alguma variável limitadora de acordo com o user logado.
Desta forma, um user não terá acesso a algo que ñ lhe é permitido.

Quando montar a query de paginação, passe um where unidade = '$unidade-do-user-logado'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entao ja tentei assim..

Minha query da paginação estou tentando assim....

if($idNivelLogin == 0){//Nivel 0 é o adm ele podera ver todos os alunos
$sqlConsultAluno = $conecta->query("SELECT * FROM alunos");

}else{//Todos os outros níveis deveria cair aqui
$sqlConsultAluno = $conecta->query("SELECT * FROM alunos where idAlunoUnidade = '2'");
}

La na minha query inicial ao listar os alunos de cada unidade esta listando de acordo com o nivel de login e montando a paginação ok

Porem qdo seleciono a proxima pagina ele busca todos os alunos independente do nivel

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acredito que o problema está na rotina da paginação. Como a página seguinte sabe onde a consulta parou? Desconfio que a consulta para a página seguinte seja essa: $sqlConsulAluno=$conecta->query("SELECT * FROM alunos where paginaseguinte > paginaanterior") e aqui qualquer usuario mal intencionado poderá ter acesso ao endereço da bela loira de olhos azuis da unidade 3.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

segue o esquema da minha query de paginação

<?php
if($nivelLogin == 0){//nivel adm pode ver todos os alunos
	$sqlAlunos = "SELECT * FROM alunos";
}else{//Todos os outros niveis de login cairia aqui, listando de acordo com o IDLOCALIDADE
	$sqlAlunos = "SELECT * FROM alunos WHERE idLocalidadeAluno = '$idLocalidade'";
}
$conectaAlunos = $conecta->query($sqlAlunos);
$countAlunos = mysqli_num_rows($conectaAlunos);
//qdade de pagina
$qdadePG= ceil($countAlunos / $qdade_result_pagina);
//Limitar links antes e depois
$max_links = 5;?>


<nav aria-label="Page navigation example">
  <ul class="pagination justify-content-center">
    <li class="page-item">

      <a class='page-link' href="#" onclick='listar_alunos(1, <?php echo $qdade_result_pagina;?>)'>
        Primeira </a>
      </li>


<?php for ($pag_ant = $pagina - $max_links; $pag_ant <= $pagina - 1; $pag_ant++) {
  if ($pag_ant > 1) {
    echo "<li class='page-item'>
      <a class='page-link' href='#'' onclick='listar_alunos($pag_ant, ".$qdade_result_pagina.")'>
        $pag_ant </a>
      </li>";
  }
} ?>
      <li class="page-item active">
        <a class='page-link'> <?php echo $pagina?> </a>
      </li>

<?php for ($pag_dep = $pagina + 1; $pag_dep <= $pagina + $max_links; $pag_dep++) {
  if ($pag_dep <= $qdadePG) {
    echo "<li class='page-item'>
      <a class='page-link' href='#'' onclick='listar_alunos($pag_dep, ".$qdade_result_pagina.")'>
        $pag_dep </a>
      </li>";
  }
}

 ?>


      <li class="page-item">
        <a class='page-link' href="#" onclick='listar_alunos(<?php echo $qdadePG ?>, <?php echo $qdade_result_pagina;?>)'>
          Ultima </a>
        </li>

      </ul>
    </nav>

se alguem puder me ajudar nessa logica agradeço vlw ou de alguma outra forma de fazer

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem como você passar o código JavaScript listar_alunos()?

 

Encontrei um tutorial bacana nessa página Como fazer Paginação em PHP com MySQL (devmedia.com.br) mas encontrei um monte de mensagem de erro na hora de testar. Mudei tudo para a gramática do mysqli. O bom desse código é que ele não usa o JavaScript:

 

<?php
$nivelLogin=2;
$mysqli=new mysqli("localhost","root","","diario");
if($nivelLogin == 0){$busca="select * from tbprod order by prod";} else {
	$busca = "select * from tbprod where prod like 'm%' order by prod";}
$total_reg=10;
if(isset($_GET['pagina'])){$pagina=$_GET['pagina'];}else{$pagina=null;}
if(!$pagina){$pc=1;}else{$pc=$pagina;}
$inicio=$pc-1;
$inicio=$inicio*$total_reg;
$limite=$mysqli->query("$busca LIMIT $inicio,$total_reg");
$todos=$mysqli->query("$busca");
$tr=mysqli_num_rows($todos);
$tp=$tr/$total_reg;
while($dados=$limite->fetch_array()){
    echo $dados['prod']."<br>";}
$anterior=$pc-1;
$proximo=$pc+1;
echo "<a href=?pagina=$anterior><- Anterior</a> | ";
if($pc<$tp){echo "<a href=?pagina=$proximo>Proxima -></a>";}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

segue meu JavaScript que pega algumas informações

 

<script>
var qdade_result_pagina = 1; //Quantidade de Registros por pagina
var pagina = 1; //pagina inicial
var idLocalidade = <?php echo $unidadeTrabalho?>;//localidade de trabalho do funcionario logado
var tipoLogin = <?php echo $tipoLogin?>;//tipo de funcionario logado
$(document).ready(function (){
	listar_alunos(pagina, qdade_result_pagina, idLocalidade, tipoLogin);//Chama funcao para mostrar resultados
});
function listar_alunos(pagina, qdade_result_pagina, idLocalidade, tipoLogin){
	var dados = {
		pagina: pagina,
		qdade_result_pagina: qdade_result_pagina,
		idLocalidade: idLocalidade,
		tipoLogin: tipoLogin
	}
	$.post('listar_alunos_db', dados , function(data){
		$('#resultAluno').html(data);
	});
}
</script>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não testei os códigos, mas acredito que o código JS deveria ser assim:

 

var idLocalidade=<?='$idLocalidade'?>, você colocou $unidadeTrabalho.
var tipoLogin=<?=$nivelLogin>, você colocou $tipoLogin.

 

Mas o mais grave é que você não pode usar o marcador <?php dentro do <script>.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema está aqui:

 

$.post('listar_alunos_db', dados , function(data){

        $('#resultAluno').html(data);

 

Tudo indica que existe um arquivo de texto chamado listar_alunos_db e que o Ajax está mandando para o painel de paginação. Esse não é o comando adequado para pegar as informações que foram filtradas logo no começo da listagem.

 

Por outro lado, eu publiquei logo atrás um código que faz o mesmo serviço e sem usar o JavaScript.

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

A questão é bem simples, como já mencionado deve haver alguma clausula na query ao identifique qual conteúdo determinado usuário pode acessar.

Hora que uma paginação para que funcione corretamente são necessárias duas querys, uma determinará o limite de resultados a outra os resultados de acordo com o offset do índice acessado.

 

A primeira query irá buscar quantos resultados existem essa irá dizer o limite, ao qual deve haver a quantidade de páginas a exibir. Ex.:

SELECT id FROM alunos where idAlunoUnidade = '2'

 

A segunda query irá usar o resultado da primeira query para exibir cada resultado conforme a página acessada. Ex.:

SELECT * FROM alunos where idAlunoUnidade = '2' LIMIT {$quantidade_de_registros_da_primeira_query} OFFSET {$pagina_atual_acessada}

 

Esse procedimento se repete a cada mudança de página, sempre exigindo alguma clausula que indique qual conteúdo o usuário pode acessar.

 

Em outro caso é possível fazer uma única query trazer todos os resultados e através de um javascript criar a paginação onde esse não irá mudar a página apenas mostrar ou esconder os elementos de acordo com cada página acessada.

Para não reinventar a roda aqui, eu já desenvolvi um script para essa finalidade:

https://github.com/Spell-Master/sm-web/tree/master/javascript/Paginator

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 06/12/2022 at 14:46, Omar~ disse:

A questão é bem simples, como já mencionado deve haver alguma clausula na query ao identifique qual conteúdo determinado usuário pode acessar.

Hora que uma paginação para que funcione corretamente são necessárias duas querys, uma determinará o limite de resultados a outra os resultados de acordo com o offset do índice acessado.

 

A primeira query irá buscar quantos resultados existem essa irá dizer o limite, ao qual deve haver a quantidade de páginas a exibir. Ex.:

SELECT id FROM alunos where idAlunoUnidade = '2'

 

A segunda query irá usar o resultado da primeira query para exibir cada resultado conforme a página acessada. Ex.:

SELECT * FROM alunos where idAlunoUnidade = '2' LIMIT {$quantidade_de_registros_da_primeira_query} OFFSET {$pagina_atual_acessada}

 

Esse procedimento se repete a cada mudança de página, sempre exigindo alguma clausula que indique qual conteúdo o usuário pode acessar.

 

Em outro caso é possível fazer uma única query trazer todos os resultados e através de um javascript criar a paginação onde esse não irá mudar a página apenas mostrar ou esconder os elementos de acordo com cada página acessada.

Para não reinventar a roda aqui, eu já desenvolvi um script para essa finalidade:

https://github.com/Spell-Master/sm-web/tree/master/javascript/Paginator

Na sua biblioteca tem imensas bibliotecas de informações em CSS, JS, HTML, mas não tem nenhuma conexão com o banco de dados. O código que sugeri tem 19 linhas de PHP, nenhum CSS, nenhum JS e nenhum comentário, e a terceira linha já mostra como conectar o PHP ao banco de dados. Isso não é um exemplo de como apresentar as informações em público, principalmente por usar o método GET que congestiona o serviço do servidor, mas é um meio bem rápido de obter a informação de forma o mais rápido possível para deixar a maquiagem e a eficiência do uso do servidor para depois:

 

<?php
$nivelLogin=2;
$mysqli=new mysqli("localhost","root","","diario");
if($nivelLogin == 0){$busca="select * from tbprod order by prod";} else {
	$busca = "select * from tbprod where prod like 'm%' order by prod";}
$total_reg=10;
if(isset($_GET['pagina'])){$pagina=$_GET['pagina'];}else{$pagina=null;}
if(!$pagina){$pc=1;}else{$pc=$pagina;}
$inicio=$pc-1;
$inicio=$inicio*$total_reg;
$limite=$mysqli->query("$busca LIMIT $inicio,$total_reg");
$todos=$mysqli->query("$busca");
$tr=mysqli_num_rows($todos);
$tp=$tr/$total_reg;
while($dados=$limite->fetch_array()){
    echo $dados['prod']."<br>";}
$anterior=$pc-1;
$proximo=$pc+1;
echo "<a href=?pagina=$anterior><- Anterior</a> | ";
if($pc<$tp){echo "<a href=?pagina=$proximo>Proxima -></a>";}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por ILR master
      Fala galera, tudo certo?
       
      Seguinte: No servidor A estou tentando fazer uma consulta com o servidor B, mas está dando erro.
      Estou usando o mesmo código de conexão do servidor B que funciona perfeitamente, mas no servidor A, dá erro.
      Segue código:
       
      $host = 'servidor B';
      $user = 'user';
      $pass = '********';
      $db   = 'banco';
       
      // conexão e seleção do banco de dados
      $conexao = mysqlI_connect($host, $user, $pass, $db);
      mysqlI_set_charset($conexao,"utf8");
      //print "Conexão rodando e OK!"; 
      //mysqlI_close($conexao);
       
      Alguém pode me ajudar?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.