Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
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 nivelAcredito 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.
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);$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 fazerTem 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>";}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>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>.esta $unidadeTrabalho é uma variavel pego ela via PHP
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.Vou testar ele tbm
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](https://github.com/Spell-Master/sm-web/tree/master/javascript/Paginator)>
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](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>";}
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'