Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

AnthraxisBR

If para parametro de consulta MySQL

Recommended Posts

Tenho uma parte do meu sistema que em opera o controle das obrigações fiscais, essa parte é exibida de acordo com o nível de acesso, com o parâmetro de filtro, e ela é responsável por buscar as empresas no banco de dados, depois verificar quais empresas foram inclusas no controle fiscal, e dentro disso existem muitas condições pra como/o que/onde as coisas devem ser disparas, tudo funciona ok, o porém é:

 

MUITOS IFs e condições estão fazendo isso demorar.

 

Fiz 10 testes em cada um dos três navegadores principais do Windows a média de resposta para 311 registros foi 1075ms.

 

O código responsável por fazer só a parte da busca e as condições é esse:

 

<?php
$login_test = new loginController();
$login_test->verif_login();

$_POST = Sanitize::filter($_POST);
$filtro_regime = $_POST['regime'];
$filtro_regime_nome = Components::nome_regime_trib($filtro_regime);

$filtro_empresa = $_POST['empresa'];
$filtro_mes_ano = $_POST['mes_ano'];
$status = $_POST['status'];
$user = $_SESSION['userCod'];
$nivel = $_SESSION['userLevel'];
$dataD = explode("/", "$filtro_mes_ano");
$m = $dataD[0];
$a = $dataD[1];

$tributacao = $filtro_regime_nome;


                $opt = $_GET['opt'];
                if ($opt == 'menu_btn') {
                    $sql = "SELECT id,cod,nome,cnpj,insc_estadual,tributacao,grupo_easy FROM empresas_base WHERE responsavel = '$user' GROUP BY id ORDER BY id";
                } else {
                    if ($nivel <= 3) {
                        if ($filtro_regime != "0") {
                            $sql = "SELECT id,cod,nome,cnpj,insc_estadual,tributacao,grupo_easy FROM empresas_base WHERE tributacao = '$filtro_regime_nome' AND responsavel = '$user' GROUP BY id ORDER BY id";
                        } else {
                            $sql = "SELECT id,cod,nome,cnpj,insc_estadual,tributacao,grupo_easy FROM empresas_base WHERE nome = '$filtro_empresa' AND responsavel = '$user' GROUP BY id ORDER BY id";
                        }
                    } else {
                        if ($filtro_regime != "0") {
                            $sql = "SELECT id,cod,nome,cnpj,insc_estadual,tributacao,grupo_easy FROM empresas_base WHERE tributacao = '$filtro_regime_nome' GROUP BY id ORDER BY id";
                        } else {
                            $sql = "SELECT id,cod,nome,cnpj,insc_estadual,tributacao,grupo_easy FROM empresas_base WHERE nome = '$filtro_empresa' GROUP BY id ORDER BY id";
                        }
                    }
                }
                $rs = Components::get_rs_consulta_query($sql);
                while ($row = mysqli_fetch_array($rs)) {
                    $empresaID = $row['id'];
                    $empresaCod = $row['cod'];
                    $empresa = utf8_encode($row['nome']);
                    $cnpj = $row['cnpj'];
                    $insc_est = $row['insc_estadual'];
                    $grupo_easy = $row['grupo_easy'];
                    $regime_trib = $row['tributacao'];
                    // verifica pelo POST status se é pra exibir concluidos e incompletos
                    if ($status == '0' OR $status == '2') {
                        $sql2 = "SELECT * FROM controle_fiscal WHERE empresa = '$empresaCod' AND mes_correspondente = '$m' AND ano_correspondente = '$a' GROUP BY id ORDER BY id ";
                    } else {
                        if ($tributacao == 'SIMPLES NACIONAL') {
                            $sql2 = "SELECT * FROM controle_fiscal WHERE empresa = '$empresaCod' AND mes_correspondente = '$m' AND ano_correspondente = '$a' AND data_envio != '' AND data_confirmacao != '' AND sintegra != '0' AND difal_destda != '0' AND retencoes_cpom != '0' GROUP BY id ORDER BY id";
                        } elseif ($tributacao == 'PRESUMIDO' OR $tributacao == 'REAL') {
                            $sql2 = "SELECT * FROM controle_fiscal WHERE empresa = '$empresaCod' AND mes_correspondente = '$m' AND ano_correspondente = '$a' AND data_envio != '' AND data_confirmacao != '' AND sped_fiscal != '0' AND sped_contrib != '0' AND dctf != '0' AND retencoes != '0' GROUP BY id ORDER BY id";
                        }
                    }
                    $rs2 = Components::get_rs_consulta_query($sql2);
                    while ($row2 = mysqli_fetch_array($rs2)) {
                        $porc_form = 0;
                        //Todos
                        $apuracao = $row2['apuracao'];
                        $recibo_simples = $row2['recibo_simples'];
                        $controle_cod = $row2['cod'];
                        $data_envio = $row2['data_envio'];
                        $data_confirmacao = $row2['data_confirmacao'];
                        $entrada_notas = $row2['triagem_notas_ent'];
                        $saida_notas = $row2['triagem_notas_saida'];

                        //Simples
                        $sintegra = $row2['sintegra'];
                        $difal_destda = $row2['difal_destda'];
                        $retencoes_cpom = $row2['retencoes_cpom'];
                        //Presumido
                        $sped_fiscal = $row2['sped_fiscal'];
                        $sped_contrib = $row2['sped_contrib'];
                        $dctf = $row2['dctf'];
                        $retencoes = $row2['retencoes'];
                        $pgdas = $row2['pgdas'];

                        if ($insc_est == 'CANCELADA' OR $insc_est == "INATIVA" OR $grupo_easy == 'X') {

                            if ($data_envio != 0) {
                                $data_envio_inativa = '';
                            } else {

                                $data_envio_inativa = " - " . 'Nada a enviar';
                            }

                            if ($data_confirmacao != 0) {
                                $data_confirmacao_inativa = '';
                            } else {

                                $data_confirmacao_inativa = " - " . 'Nada a confirmar';
                            }
                            if ($apuracao != 0) {

                                $apuracao_inativa = '';
                            } else {

                                $apuracao_inativa = 'Nada a apurar';
                            }

                            if ($tributacao == 'PRESUMIDO' OR $tributacao == "REAL") {
                                $retencoes_inativa = "Não necessário";
                                $sped_fiscal_inativa = 'Não necessário';
                                $sped_contrib_inativa = 'Não necessário';
                                $dctf_inativa = '';
                                $sintegra_inativa = '';
                                $difal_inativa = '';
                                $retencoes_cpom_inativa = '';
                                $sped_fiscal = '';
                                $sped_contrib = '';
                                $retencoes = '';
                            } elseif ($tributacao == 'SIMPLES NACIONAL') {
                                //$pgdas_inativa = 'Não necessário';
                                $retencoes_inativa = "";
                                $sped_fiscal_inativa = '';
                                $sped_contrib_inativa = '';
                                $sintegra_inativa = 'Não necessário';
                                $difal_inativa = 'Não necessário';
                                $retencoes_cpom_inativa = 'Não necessário';
                                $retencoes_cpom = '';
                                $difal_destda = '';
                                $sintegra = '';
                            }
                        } else {
                            $data_envio_inativa = '';
                            $data_confirmacao_inativa = '';
                            $apuracao_inativa = '';
                            $sintegra_inativa = '';
                            $pgdas_inativa = '';
                            $difal_inativa = '';
                            $retencoes_cpom_inativa = '';
                            $retencoes_inativa = "";
                            $dctf_inativa = '';
                            $sped_fiscal_inativa = '';
                            $sped_contrib_inativa = '';
                        }
                        if ($data_confirmacao == '' AND $data_envio != '') {
                            $data_envio_formated = DateTime::createFromFormat('d/m/Y', $data_envio);

                            $datetime1 = $data_envio_formated->format('Y-m-d');
                            $datetime2 = date('Y-m-d');
                            $time_inicial = strtotime($datetime1);
                            $time_final = strtotime($datetime2);
                            $diferenca = $time_final - $time_inicial;
                            $dias = (int) floor($diferenca / (60 * 60 * 24));
                            if ($dias == 1) {
                                $data_confirmacao = 'Enviado ontem.';
                                $data_confirmacao_td_class = 'default';
                            } elseif ($dias < 5) {

                                $data_confirmacao = "A " . $dias . " dias sem confirmação";
                                $data_confirmacao_td_class = "warning";
                            } else {

                                $data_confirmacao = "ATENÇÃO! A " . $dias . " dias sem confirmação";
                                $data_confirmacao_td_class = "danger";
                            }
                        } else {
                            $data_confirmacao_td_class = "";
                            $data_confirmacao = $row2['data_confirmacao'];
                        }

                        if ($apuracao != 0) {
                            $apuracao_val = 1;
                        } else {
                            $apuracao_val = 0;
                        }
                        if ($apuracao != 0) {
                            $data_envio_val = 1;
                            if ($data_confirmacao != '' || $data_confirmacao != 0) {
                                $data_confirmacao_val = 1;
                            } else {
                                $data_confirmacao_val = 0;
                            }
                        } else {

                            if ($data_envio != '' || $data_envio != 0) {
                                $data_envio_val = 1;
                            } else {
                                $data_envio_val = 0;
                            }

                            if ($data_confirmacao != '' || $data_confirmacao != 0) {
                                $data_confirmacao_val = 1;
                            } else {
                                $data_confirmacao_val = 0;
                            }
                        }

                        if ($entrada_notas != 0) {
                            $entrada_notas_val = 1;
                        } else {
                            $entrada_notas_val = 0;
                        }
                        if ($saida_notas != 0) {
                            $saida_notas_val = 1;
                        } else {
                            $saida_notas_val = 0;
                        }
                        if ($insc_est == 'INATIVA' OR $insc_est == 'CANCELADA' OR $grupo_easy == 'X') {
                            $data_envio_val = 1;
                            $data_confirmacao_val = 1;

                            $sintegra_val = 1;
                            $recibo_simples_val = 1;
                            if ($pgdas != 0) {
                                $pgdas_val = 1;
                            } else {
                                $pgdas_val = 0;
                            }
                            $difal_destda_val = 1;
                            $retencoes_cpom_val = 1;
                            $apuracao_val = 1;
                            $sped_fiscal_val = 1;
                            $sped_contrib_val = 1;
                            $retencoes_val = 1;
                            $saida_notas_val = 1;
                            $entrada_notas_val = 1;
                            if ($tributacao == 'SIMPLES NACIONAL') {
                                $val_obrig = $saida_notas_val + $entrada_notas_val + $apuracao_val + $data_envio_val + $data_confirmacao_val + $sintegra_val + $recibo_simples_val + $difal_destda_val + $retencoes_cpom_val + $pgdas_val;

                                $porc_form = (($val_obrig * 100) / 10);
                            } else {
                                $val_obrig = $saida_notas_val + $entrada_notas_val + $apuracao_val + $data_envio_val + $data_confirmacao_val + $sped_fiscal_val + $sped_contrib_val + $dctf_val + $retencoes_val;
                                $porc_form = (($val_obrig * 100) / 9);
                            }
                        } else {
                            if ($tributacao == 'SIMPLES NACIONAL') {

                                if ($sintegra != 0) {
                                    $sintegra_val = 1;
                                } else {
                                    $sintegra_val = 0;
                                }

                                if ($recibo_simples != 0) {
                                    $recibo_simples_val = 1;
                                    $pgdas_val = 1;
                                } else {
                                    $recibo_simples_val = 0;
                                    if ($pgdas != 0) {
                                        $pgdas_val = 1;
                                    } else {
                                        $pgdas_val = 0;
                                    }
                                }

                                if ($difal_destda != 0) {
                                    $difal_destda_val = 1;
                                } else {
                                    $difal_destda_val = 0;
                                }

                                if ($retencoes_cpom != 0) {
                                    $retencoes_cpom_val = 1;
                                } else {
                                    $retencoes_cpom_val = 0;
                                }


                                $val_obrig = $saida_notas_val + $entrada_notas_val + $apuracao_val + $data_envio_val + $data_confirmacao_val + $sintegra_val + $recibo_simples_val + $difal_destda_val + $retencoes_cpom_val + $pgdas_val;

                                $porc_form = (($val_obrig * 100) / 10);
                            } elseif ($tributacao == 'PRESUMIDO' || $tributacao == "REAL") {

                                if ($sped_fiscal != 0) {
                                    $sped_fiscal_val = 1;
                                } else {
                                    $sped_fiscal_val = 0;
                                }


                                if ($sped_contrib != 0) {
                                    $sped_contrib_val = 1;
                                } else {
                                    $sped_contrib_val = 0;
                                }

                                if ($dctf != 0) {
                                    $dctf_val = 1;
                                } else {
                                    $dctf_val = 0;
                                }

                                if ($retencoes != 0) {
                                    $retencoes_val = 1;
                                } else {
                                    $retencoes_val = 0;
                                }
                                $val_obrig = $saida_notas_val + $entrada_notas_val + $apuracao_val + $data_envio_val + $data_confirmacao_val + $sped_fiscal_val + $sped_contrib_val + $dctf_val + $retencoes_val;
                                $porc_form = (($val_obrig * 100) / 9);


                                $sped_fiscal_sum += $sped_fiscal_val;
                                $sped_contrib_sum += $sped_contrib_val;
                                $retencoes_sum += $retencoes_val;
                                $dctf_sum += $dctf_val;
                            }
                        }

                        $tr_styles = fiscalModel::get_tr_obrigacoes_stats($status, $tributacao, $apuracao, $recibo_simples, $data_envio, $data_confirmacao, $sintegra, $difal_destda, $retencoes_cpom, $dctf, $retencoes, $pgdas, $sped_contrib, $sped_fiscal);
                    }

 

Citar

Alguma sugestão de como melhorar essas consultas e condições?


OBS: não quero código, quero saber o que pesquisar pra melhorar essa parte.

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema ai é que ocorrem Consultas, e dentro do loop dessas pesquisas rodam outras consultas...

 

Da uma lida:

http://rberaldo.com.br/o-problema-do-n-mais-1/

 

Talvez armazenar todos os valores a pesquisar dessa consulta e depois efetuar apenas uma com os valores tratados....

Exemplo em cima do seu código...

//$empresas = array("'Empresa1'", "'Empresa2'", "'Empresa3'");
//$ArrempresaCod = implode(',', $empresas);

$sql2 = "
SELECT 
	* 
FROM 
controle_fiscal 
WHERE 
	empresa IN ($ArrempresaCod)
	AND mes_correspondente = '$m' 
	AND ano_correspondente = '$a' 
GROUP BY id ORDER BY id ";

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
6 minutos atrás, gabrieldarezzo disse:

O problema ai é que ocorrem Consultas, e dentro do loop dessas pesquisas rodam outras consultas...

 

Da uma lida:

http://rberaldo.com.br/o-problema-do-n-mais-1/

 

Talvez armazenar todos os valores a pesquisar dessa consulta e depois efetuar apenas uma com os valores tratados....

Exemplo em cima do seu código...


//$empresas = array("'Empresa1'", "'Empresa2'", "'Empresa3'");
//$ArrempresaCod = implode(',', $empresas);

$sql2 = "
SELECT 
	* 
FROM 
controle_fiscal 
WHERE 
	empresa IN ($ArrempresaCod)
	AND mes_correspondente = '$m' 
	AND ano_correspondente = '$a' 
GROUP BY id ORDER BY id ";

 

 

 

Nossa, eu nunca tinha ouvido falar nesse 'IN", vou estudar como funciona, mas no caso basicamente seria:

 

<?php
//query da consulta  
$sql = "SELECT id,cod,nome,cnpj,insc_estadual,tributacao,grupo_easy FROM empresas_base GROUP BY id ORDER BY id";
//rs da query -> classe components
$rs = Components::get_rs_consulta_query($sql);
//Contando quantidade de elementos na query -> Classe components
$count = Components::get_count_consulta_query($sql);
$key = 0;
//inicia a array
$emps = Array();
//loop para criar a array -> Acredito que aqui que esteja criando errado
while ($row = mysqli_fetch_array($rs)) {
  $emp_cod = $row['cod'];

     $emps[$key] = $emp_cod;

$key ++;
}
$m = date('m');
$a = date('Y');
$Arr_empresa_cod = implode(',', $emps);
//print_r($Arr_empresa_cod); --> Essa parte imprime o problema está na consulta com IN abaixo pelo motivo da array vir errada
$sql_2 = "
SELECT 
	* 
FROM 
controle_fiscal 
WHERE 
	empresa IN ($Arr_empresa_cod)
	AND mes_correspondente = '$m' 
	AND ano_correspondente = '$a' 
GROUP BY id ORDER BY id ";

$rs_2 = Components::get_rs_consulta_query($sql_2);
while ($row_2 = mysqli_fetch_array($rs_2)) {
 print_r($row_2).'<br>';
}

Só que neste cado mesmo tendo dado uma olhada, não entendi como deve ser estruturada a array  que passa pelo IN, esse código me devolve a array do $row_2 como nula, tem alguma ideia do que está errado?

 

O erro referente é o seguinte:

 

Citar

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\easy\Easy-development\view\fiscal\fiscal_list_controle.php on line 52

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiramente obrigado @gabrieldarezzo pela indicação, me ajudou muito!

 

Bom consegui resolver o problema, chega a ser bizarro a proporção de melhora no tempo de consulta que o sistema obteve, vou postar aqui a solução pois pode ser útil pra alguém.

 

<?php
$sql = "SELECT id,cod,nome,cnpj,insc_estadual,tributacao,grupo_easy FROM empresas_base GROUP BY id ORDER BY id";
$emps = Components::get_rs_array_stmt_PDO($sql);
$emps_cod = array_column($emps, 'id');
$SQL_emp_cod = implode(',', $emps_cod);
$sql_2 = sprintf("
SELECT 
	* 
FROM 
controle_fiscal 
WHERE 
	id IN ($SQL_emp_cod)
", $SQL_emp_cod);
$controls = Components::get_rs_array_stmt_PDO($sql_2);
foreach ($controles as $control){
    print_r($control['id'])."<br>";
}

Observações:

 

1 - Mudei a forma da conexão para a classe PDO, não sei até que ponto isso interferiu no tempo da consulta.

2 - Código ficou mais limpo.

3 - O tempo de consulta anteriormente estava com a média de 1075ms, depois dessa mudança, com os mesmo testes o tempo médio de resposta passou para 77.8ms, ou seja, mais de 13x mais rápido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom haha a ideia do fórum é essa mesma.

 

Tambem acho a syntax do PDO muito mais limpa.

Outra sacada dele é caso você trocar de banco relacional não vai ser tão traumático.

(Migrar de Mysql -> MariaDb, MS SqlServer, Oracle etc.)  (Em tese.. claro hehe)

Lista de bancos suportados:

http://php.net/manual/pt_BR/pdo.drivers.php

 

 

Uma coisa que é muito bacana em PDO é os prepared-statements: 

http://php.net/manual/pt_BR/pdo.prepared-statements.php

 

Evita ataque de SQL Injections e evita precisar ficar tratando/cast em inputs, da uma lida depois vale a pena.

 

 

Bons estudos :tongue:

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • 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.
    • Por landerbadi
      Olá pessoal, boa tarde
       
      Tenho uma tabela chamada "produtos" com os seguintes campos (id, produto) e outra tabela chamada "itens" com os seguintes campos (id, prod_01, prod_02, prod_03, prod_04).
       
      Na tabela produtos eu tenho cadastrado os seguintes produtos: laranja, maçã, uva, goiaba, arroz, feijão, macarrão, etc.
       
      Na tabela itens eu tenho cadastrado os itens da seguinte maneira:
       
      1, laranja, uva, arroz, feijão;
      2, maçã, macarrão, goiaba, uva;
      3, arroz, feijão, maçã, azeite
       
      Meu problema é o seguinte: 
      Eu escolho um produto da tabela "produtos", por exemplo "uva".  Preciso fazer uma consulta na tabela "itens" para ser listado todos os registros que contenham o produto "uva" e que todos os demais produtos estejam cadastrados na tabela "produtos".
       
      No exemplo acima seria listado apenas dois registros, pois o terceiro registro não contém o produto "uva". 
       
      Alguém pode me ajudar? Pois estou quebrando a cabeça a vários dias e não consigo achar uma solução.
×

Informação importante

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