I have a question concerning a certain part of a system that I am developing. The system is for management of a higher education institution and has a page that is to manage the courses of the institution and I put some filters via select with auto submit using javascript, and I made a paging system.
My question is: What alternative do I have to lower my code because I thought it got too big and I think there are other ways to do this with fewer rows and fewer queries in the database. The way it is I have to always make two queries in the bd, one for pagination and another for displaying results
Follow the code:
//Abrindo conexao com banco de dados
$con=conectar();
if(isset($_GET)){
//Recebe número da pagina, caso não exista recebe valor 1
$pg = (isset($_GET['pg'])) ? filter_var($_GET['pg'], FILTER_SANITIZE_NUMBER_INT) : 1;
//Variaveis
$polo = isset($_GET['polo']) ? filter_var($_GET['polo'], FILTER_SANITIZE_NUMBER_INT) : null;
$tipo = isset($_GET['tipo']) ? filter_var($_GET['tipo'], FILTER_SANITIZE_NUMBER_INT) : null;
//Config paginação
$limite = 2;
$inicio = ($pg*$limite) - $limite;
if($tipo == "" && $polo != "") {
$puxa_cursos=$con->prepare("SELECT * FROM cursos WHERE polo = :polo ORDER BY nome ASC LIMIT $inicio, $limite");
$puxa_cursos->bindValue(":polo", $polo);
$puxa_cursos->execute();
//Contar cursos para paginação
$contar_cursos=$con->prepare("SELECT * FROM cursos WHERE polo = :polo");
$contar_cursos->bindValue(":polo", $polo);
$contar_cursos->execute();
}else if($polo == "" && $tipo != "") {
$puxa_cursos=$con->prepare("SELECT * FROM cursos WHERE tipo = :tipo ORDER BY nome ASC LIMIT $inicio, $limite");
$puxa_cursos->bindValue(":tipo", $tipo);
$puxa_cursos->execute();
//Contando cursos para paginação
$contar_cursos=$con->prepare("SELECT * FROM cursos WHERE tipo = :tipo");
$contar_cursos->bindValue(":tipo", $tipo);
$contar_cursos->execute();
}else if ($polo == "" && $tipo == "") {
$puxa_cursos=$con->prepare("SELECT * FROM cursos ORDER BY nome ASC LIMIT $inicio, $limite");
$puxa_cursos->execute();
//Contando cursos para paginação
$contar_cursos=$con->prepare("SELECT * FROM cursos");
$contar_cursos->execute();
}else {
$puxa_cursos=$con->prepare("SELECT * FROM cursos WHERE polo = :polo AND tipo = :tipo ORDER BY nome ASC LIMIT $inicio, $limite");
$puxa_cursos->bindValue(":polo", $polo);
$puxa_cursos->bindValue(":tipo", $tipo);
$puxa_cursos->execute();
//Contando registros para paginação
$contar_cursos=$con->prepare("SELECT * FROM cursos WHERE polo = :polo AND tipo = :tipo");
$contar_cursos->bindValue(":polo", $polo);
$contar_cursos->bindValue(":tipo", $tipo);
$contar_cursos->execute();
}
//Criar array para guardar resultados
$cursos = array();
//Enquanto tiver resultados correspondentes, armazena no array
while($row_cursos=$puxa_cursos->fetch(PDO::FETCH_ASSOC)) {
$cursos[] = array(
'id' => $row_cursos['id'],
'nome' => utf8_encode($row_cursos['nome']),
'tipo' => $row_cursos['tipo'],
'polo' => $row_cursos['polo']
);
}
//Calcula quantidade de paginas com arredondamento para cima
$paginas = ceil($contar_cursos->rowCount() / $limite);
}