Doubt about alternative to decrease code size and make fewer queries

-1

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);



}
    
asked by anonymous 15.07.2017 / 16:04

1 answer

1

You can use your if to define the query and finally perform it, you can also use mysql's own functions to count the value of your query instead of performing a new one, eg

<?php

    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(!empty($polo) && empty($tipo)) {

        $consulta = "SELECT id, nome, tipo, polo, count(id) as total_cursos FROM cursos WHERE polo = ? ORDER BY nome ASC LIMIT $inicio, $limite";
        $valueBindOne = $polo;

    }else if(empty($polo) && !empty($tipo)) {

        $consulta = "SELECT id, nome, tipo, polo, count(id) as total_cursos FROM cursos WHERE tipo = ? ORDER BY nome ASC LIMIT $inicio, $limite";
        $valueBindOne = $tipo;

    }else if (empty($polo) && empty($tipo)) {

        $consulta = "SELECT id, nome, tipo, polo, count(id) as total_cursos FROM cursos ORDER BY nome ASC LIMIT $inicio, $limite";        

    }else {

        $consulta = "SELECT id, nome, tipo, polo, count(id) as total_cursos FROM cursos WHERE polo = ? AND tipo = ? ORDER BY nome ASC LIMIT $inicio, $limite";
        $valueBindOne = $polo;
        $valueBindTwo = $tipo;

    }

    $puxa_cursos = $con->prepare($consulta);

    if(!empty($valueBindOne) && empty($valueBindTwo)){
        $puxa_cursos->bindValue(1, $valueBindOne);
    }else{
        $puxa_cursos->bindValue(1, $valueBindOne);
        $puxa_cursos->bindValue(2, $valueBindTwo);
    }

    $puxa_cursos->execute();
    $cursos = $puxa_cursos->fetchAll(PDO::FETCH_OBJ);
    $paginas = ceil($puxa_cursos->rowCount() / $limite);

  }

Finally you will have an object called courses and you can access its values in an easier way, eg

  foreach($cursos as $curso){
    echo $curso->id;
    echo $curso->nome;
    echo $curso->tipo;
    echo $curso->polo;
    echo $curso->total_cursos;
  }
    
15.07.2017 / 18:21