Ir para conteúdo
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 landerbadi
      Boa tarde pessoal. Estou tentado fazer uma consulta no banco de dados porém estou tendo dificuldades. Tenho uma tabela chamada "itens" com os seguintes campos: id, item, ativo. Nela tem cadastrado vários itens. No campo ativo eu coloco a letra "S" para informar que este item está ativo no sistema. Por exemplo: 1, casa, S 2, mesa, S 3, cama, S 4, moto S 5, rádio O quinto registro "radio" não está ativo no sistema pois não tem um "S" no campo ativo. E outra tabela chamada "produtos" com os seguintes campos (id, item1, item2, item3) com os seguintes registros: 1, casa, mesa, moto 2, mesa, casa, cama 3, rádio, cama, mesa Eu preciso fazer uma busca na tabela produtos da seguinte maneira: Eu escolho um registro na tabela "itens", por exemplo "mesa". Preciso fazer com que o php me liste todos os registros da tabela "produtos" que contenham a palavra "mesa". Até aqui tudo bem eu consigo listar. Estou fazendo assim: <?php $item = "mesa" $sql = mysqli_query($conn, "SELECT * FROM produtos WHERE item1 LIKE '$item' OR item2 LIKE '$item' OR item3 LIKE '$item' LIMIT 10"); while($aux = mysqli_fetch_assoc($sql)) { $id = $aux["id"]; $item1 = $aux["item1"]; $item2 = $aux["item2"]; $item3 = $aux["item3"]; echo $id . " - " . $item1 . ", " . $item2 . ", " $item3 . "<br>"; } ?> O problema é que está listando todos os registros que contém o item mesa. Eu preciso que o php verifique os demais item e me liste somente os registro em que todos os registros estejam ativos no sistema. No exemplo acima ele não deveria listar o registro 3. pois nesse registro contém o item "radio" e este item não está ativo no sistema. Ou seja, o registro "radio" na tabela itens não possui um "S" na coluna "ativo". Alguém sabe como resolver isso?
    • Por ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • Por First
      Olá a todos!
       
      Eu estou criando um sistema do zero mas estou encontnrando algumas dificuldades e não estou sabendo resolver, então vim recorrer ajuda de vocês.
      Aqui está todo o meu código: https://github.com/PauloJagata/aprendizado/
       
      Eu fiz um sistema de rotas mas só mostra o conteúdo da '/' não sei porque, quando eu tento acessar o register nada muda.
      E eu também quero que se não estiver liberado na rota mostra o erro de 404, mas quando eu tento acessar um link inválido, nada acontece.
      Alguém pode me ajudar com isso? E se tiver algumas sugestão para melhoria do código também estou aceitando.
       
       
      Desde já, obrigado.
×

Informação importante

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