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.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a ajuda dos amigos, mas preciso entender uma processo que não estou conseguindo sucesso.

      Como mencionado no Título estou escrevendo um Sistema Web para Gerenciamento de Empresa.
       
      Minha dúvida, que preciso muito entender:
      - preciso agora escrever a Rotina para Emissão de NFe e essa parte não estou conseguindo.
       
      tenho assistido alguns vídeos e leituras, mas não estou conseguindo sucesso, já fiz toda as importações das LIB da NFePhp conforme orientação.

      Preciso de ajuda.

      Algum dos amigos tem conhecimento de algum passo-a-passo explicando a criação dessa rotina ?

      tenho visto alguns vídeos com LARAVEL, mas quando tento utilizar e converter para PHP+Codeiginter, dá uma fila de erros que não entendo, mesmo informando as lib necessárias.

      Alguns do amigo tem algum vídeo, leitura explicando essa parte ?

      Grato,

      Cesar.
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer ao auxílio dos amigos, mas preciso entender e resolver um problema.
       
      Tenho uma Rotina que o usuário seleciona os produtos que deseja para requerer ao setor responsável.
       
      O usuário escolhe um produto qualquer e Clicla em um button para incluir a lista.

      O problema que estou enfrentando é que após escolher o produto e teclar ENTER o Sistema já salva no BD.
       
      Gostaria de criar uma Tecla de Atalho, para quando incluir/escolher o produto na lista, o usuário tecla como exemplo:
      ALT+A  para agregar a lista
      ALT+S para salvar a lista de itens desejados.

      Assim, quando teclar enter, o sistema não dispara o GRAVAR na Base de Dados.

      Grato,

      Cesar
       
       
       
×

Informação importante

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