Ir para conteúdo
Fórum Script Brasil
  • 0

Contadores em PHP MySQL


elossio

Pergunta

Pessoal, boa tarde!

Tenho um banco de dados em MySQL contendo tabela "inscrito" referente a um cadastro de clientes.

Preciso de um PHP script para agrupar contadores por campo "UF". 

Estou com dificuldade de alterar os valores iniciais de uma array de contadores ($Inscritos).  Como posso fazer isso?

Segue abaixo, meu script de teste. obrigado pela atenção.

<?php
$Estado = array();
$Estado[0]="AC";
$Estado[1]="AL";
$Estado[2]="AM";
$Estado[3]="AP";
$Estado[4]="BA";
$Estado[5]="CE";
$Estado[6]="DF";
$Estado[7]="ES";
$Estado[8]="GO";
$Estado[9]="MA";
$Estado[10]="MG";
$Estado[11]="MS";
$Estado[12]="MT";
$Estado[13]="PA";
$Estado[14]="PB";
$Estado[15]="PE";
$Estado[16]="PI";
$Estado[17]="PR";
$Estado[18]="RJ";
$Estado[19]="RN";
$Estado[20]="RO";
$Estado[21]="RR";
$Estado[22]="RS";
$Estado[23]="SC";
$Estado[24]="SE";
$Estado[25]="SP";
$Estado[26]="TO";
$Inscritos = array();
$Inscritos[0]=0;
$Inscritos[1]=0;
$Inscritos[2]=0;
$Inscritos[3]=0;
$Inscritos[4]=0;
$Inscritos[5]=0;
$Inscritos[6]=0;
$Inscritos[7]=0;
$Inscritos[8]=0;
$Inscritos[9]=0;
$Inscritos[10]=0;
$Inscritos[11]=0;
$Inscritos[12]=0;
$Inscritos[13]=0;
$Inscritos[14]=0;
$Inscritos[15]=0;
$Inscritos[16]=0;
$Inscritos[17]=0;
$Inscritos[18]=0;
$Inscritos[19]=0;
$Inscritos[20]=0;
$Inscritos[21]=0;
$Inscritos[22]=0;
$Inscritos[23]=0;
$Inscritos[24]=0;
$Inscritos[25]=0;
$Inscritos[26]=0;
$conec = mysql_connect('localhost:3306', 'root') or die ('Não foi possível conectar: ' .mysql_error()); 
if ($conec) {
        $bco = mysql_select_db('laser',$conec) or die ('Não foi possível localizar o banco de dados: ' .mysql_error()); 
    if ($bco) {
        $stgsql = "SELECT UF from inscrito ORDER BY UF" ;
        $res = mysql_query($stgsql, $conec) ;
        $linhas = mysql_num_rows($res) ;
        $linhasini = 1 ;
        $dados = mysql_fetch_array($res) ;
        $insc = "oo" ;
        $est = 0;
        $contador = 0 ;
        while ($linhasini <= $linhas) {
            $contador = $contador + 1;
            echo "Linhasini = $linhasini<br>";
            If ($dados[0]  <> $insc) {
                $contador = 1 ;
                for ($i = 0; $i <= 26; $i++) {
                    if ($Estado[$i] = $dados[0]) {
                        $Inscritos[$i] = $contador ;
                        $est = $i;
                        echo "<font color='#FF0000'></font>$dados[0] É DIFERENTE DE $insc<br>";
                        echo "Valor de i: $i - Estado: $Estado[$i] - Valor de est: $est - Inscritos: $Inscritos[$est] - Contador: $contador<br>";
                        break;
                        }
                    }
            }
            else {
                $Inscritos[$est] = $contador;
                echo "<font color='#FF5000'></font>$dados[0] é igual a $insc<br>";
                echo "Valor de i: $i - Estado: $Estado[$i] - Valor de est: $est - Inscritos: $Inscritos[$est] - Contador: $contador<br>";
            }        }
            $insc = $dados[0];
            $dados = mysql_fetch_array ($res);
            $linhasini++;
            }
        $total = 0;
        for ($i = 0; $i <= 26; $i++) {
            $total = $total + $Inscritos[$i];
        }
}
mysql_close($conec) ;
}
?>

Editado por elossio
Negritando parte do código
Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

Olá lowys, bom dia!

Você entendeu certo. Preciso contabilizar o numeros de inscritos em cada Estado. Cheguei a navegar pelos arrays usando os comandos foreach, next, current e reset, mas continuo não tendo o resultado esperado de poder substituir os valores iniciais do array $Inscritos pelo valor do $contador.

Estou usando um servidor local de teste com o Xampp for Linux 5.6.15-1.

Cheguei a usar o código abaixo, um pouco modificado, ainda sem sucesso:

<?php
$Estado = array();
$Estado[0]="AC";
$Estado[1]="AL";
$Estado[2]="AM";
$Estado[3]="AP";
$Estado[4]="BA";
$Estado[5]="CE";
$Estado[6]="DF";
$Estado[7]="ES";
$Estado[8]="GO";
$Estado[9]="MA";
$Estado[10]="MG";
$Estado[11]="MS";
$Estado[12]="MT";
$Estado[13]="PA";
$Estado[14]="PB";
$Estado[15]="PE";
$Estado[16]="PI";
$Estado[17]="PR";
$Estado[18]="RJ";
$Estado[19]="RN";
$Estado[20]="RO";
$Estado[21]="RR";
$Estado[22]="RS";
$Estado[23]="SC";
$Estado[24]="SE";
$Estado[25]="SP";
$Estado[26]="TO";
//print_r($Estado);
$Inscritos = array();
$Inscritos[0]='0';
$Inscritos[1]='0';
$Inscritos[2]='0';
$Inscritos[3]='0';
$Inscritos[4]='0';
$Inscritos[5]='0';
$Inscritos[6]='0';
$Inscritos[7]='0';
$Inscritos[8]='0';
$Inscritos[9]='0';
$Inscritos[10]='0';
$Inscritos[11]='0';
$Inscritos[12]='0';
$Inscritos[13]='0';
$Inscritos[14]='0';
$Inscritos[15]='0';
$Inscritos[16]='0';
$Inscritos[17]='0';
$Inscritos[18]='0';
$Inscritos[19]='0';
$Inscritos[20]='0';
$Inscritos[21]='0';
$Inscritos[22]='0';
$Inscritos[23]='0';
$Inscritos[24]='0';
$Inscritos[25]='0';
$Inscritos[26]='0';
reset($Inscritos);
//var_dump($Inscritos);
$conec = mysql_connect('localhost:3306', 'root') or die ('Não foi possível conectar: ' .mysql_error()); 
if ($conec) {
        $bco = mysql_select_db('laser',$conec) or die ('Não foi possível localizar o banco de dados: ' .mysql_error()); 
    if ($bco) {
        $stgsql = "SELECT UF from inscrito ORDER BY UF" ;
        $res = mysql_query($stgsql, $conec) ;
        $linhas = mysql_num_rows($res) ;
        $linhasini = 1 ;
        $dados = mysql_fetch_array($res) ;
        $insc = "oo" ;
        $est = 0;
        $contador = 0 ;
        while ($linhasini <= $linhas) {
            $contador = $contador + 1;
//            echo "Linhasini = $linhasini<br>";
            If ($dados <> $insc) {
                $contador = 1 ;
                reset($Estado);
                $chave = key ($Estado);
//                echo "Chave: $chave<br>";
                While ($chave < 27) {
                    $valor = current($Estado);
                    echo "Chave: $chave<br>";
                    echo "Valor: $valor<br>";
                    if ($valor = $dados) {
                        $Inscritos[$chave] = $contador;
                        $est = $chave;
                        $chave = count($Estado);
                        break;
                    // valor
                    }
                    else {
                    next($Estado);
                    $chave = key ($Estado);
                    }
                    $chave++;
                // chave
                }
            // 
            }
            else {
            $Inscritos[$est] = $contador;
            }
            $insc = $dados;
            $dados = mysql_fetch_array ($res);
            $linhasini++;
        //
            }
        $Inscritos[0] = 0;
//        print_r($Inscritos);
        $total = 0;
        for ($i = 0; $i <= 26; $i++) {
            $total = $total + $Inscritos[$i];
        }
}
mysql_close($conec) ;
}
?>

Não estou enxergando o óbvio no código. Por isso, peço ajuda dos especialistas.

Obrigado.

 

Editado por elossio
Link para o comentário
Compartilhar em outros sites

  • 0

Não entendi o que caracteriza um inscrito, mas seu código tem alguns problemas:

1. Sempre vai entrar neste if:

            If ($dados <> $insc) {

Afinal, $dados é um array e $insc é uma string. Sempre serão diferentes.

2. Se vai usar um número, use 0, não '0'. Não use aspas em dados numéricos. Não gera erro, mas é uma questão conceitual.

3.  funções mysql_* estão obsoletas desde o PHP 5.5  e já foram removidas no PHP 7. Prefira usar MySQLi ou PDO. Veja mais aqui: http://rberaldo.com.br/mysql-obsoleto-php/


 

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Beraldo,

Vou seguir sua recomendação considerando que há uma séries de scripts pela frente. Ambiente todo novo1

Quanto ao conteúdo da tabela inscritos, a que você se refere, trata-se de uma lista de associados na Associação Brasileira da Classe Laser cujo o portal web roda numa velha plataforma Joomla 1.15 com alguns scripts ASP embutidos, dentre os quais a lista de associados http://www.laser.org.br/abcl/index.php?option=com_wrapper&view=wrapper&Itemid=58&lang=pt, cujo o ambiente de produção está sob o Windows Server 2003 com ASP/VBscript.

Neste momento, estou convertendo o ASP script do Mapa de Associados http://www.laser.org.br/abcl/index.php?option=com_wrapper&view=wrapper&Itemid=58&lang=pt para um script PHP (o script objeto deste post). Acho que você terá uma ideia mais precisa que é criar totalizadores por Estado.

Estou aberto a sugestões! Fico bastante agradecido. Vou atribuir novamente a constante 0 ao array $Inscritos.

Atenciosamente,

 

Link para o comentário
Compartilhar em outros sites

  • 0
10 horas atrás, wash disse:

Olá!

Se você precisa apenas saber a quantidade, resolva direto na query:

SELECT COUNT(UF) as quant, UF  from inscrito GROUP BY UF

Prezado Wash,

Preciso apresentar um subtotal por UF. Isto é, o número de registros do Estado do Acre (AC) ao Estado de Tocantins (TO) do banco de dados. Por isso, decidi criar dois array $Estado e $Incritos. O primeiro,  cada elemento é identificado pela string da UF. O segundo array, o elemento armazena o número de ocorrências pretendido. É neste segundo array que os contadores devem ser salvos. Posteriormente, após varredura completa no banco de dados, apresento um $total geral.

Conforme citado pelo colega Berardo, acredito que o problema esteja na condição do comando if ($dados <> $insc). Estou revendo o código e a lógica. 

Aliás, o ambiente e script já está atualizado (PHP 7.0.2 e MySQLi) conforme recomendação do Berardo.

Contudo, o problema persiste. Sigo em frente na revisão do código. Se alguém puder ajudar, fico muito agradecido! 

Editado por elossio
Link para o comentário
Compartilhar em outros sites

  • 0

Pessoal, consegui resolver o problema graça às sugestões dos colegas, a do wash principalmente no comando SQL.

A seguir o código com as alterações propostas. Devo mais tarde aprimorá-lo com o uso de objetos:

<?php
$Inscritos = array();
$Inscritos['AC'] = 0;
$Inscritos['AL'] = 0;
$Inscritos['AM'] = 0;
$Inscritos['AP'] = 0;
$Inscritos['BA'] = 0;
$Inscritos['CE'] = 0;
$Inscritos['DF'] = 0;
$Inscritos['ES'] = 0;
$Inscritos['GO'] = 0;
$Inscritos['MA'] = 0;
$Inscritos['MG'] = 0;
$Inscritos['MS'] = 0;
$Inscritos['MT'] = 0;
$Inscritos['PA'] = 0;
$Inscritos['PB'] = 0;
$Inscritos['PE'] = 0;
$Inscritos['PI'] = 0;
$Inscritos['PR'] = 0;
$Inscritos['RJ'] = 0;
$Inscritos['RN'] = 0;
$Inscritos['RO'] = 0;
$Inscritos['RR'] = 0;
$Inscritos['RS'] = 0;
$Inscritos['SC'] = 0;
$Inscritos['SE'] = 0;
$Inscritos['SP'] = 0;
$Inscritos['TO'] = 0;

$host = 'localhost';
$user = 'root';
$pass = '';
$db = 'laser';

$conec = mysqli_connect($host, $user, $pass, $db) or die ('Não foi possível conectar: ' .mysqli_error()); 
if ($conec) {
        $stgsql = "SELECT COUNT(UF) as QUANT, UF from inscrito GROUP BY UF" ;
        $res = mysqli_query($conec, $stgsql) ;
        $linhas = mysqli_num_rows($res) ;
        $linhas;
        $linhasini = 1 ;
        $dados = mysqli_fetch_array($res) ;
        while ($linhasini <= $linhas) {
            $quant = $dados[0] ;
            $uf = $dados[1];
            if (array_search($uf, $Inscritos)) {
//                echo "Linhasini = $linhasini - UF = $uf - QUANT = $quant<br>";
                $Inscritos[$uf] = $quant;
            }
            $dados = mysqli_fetch_array ($res);
            $linhasini++;
            }
//        var_dump($Inscritos);
        $total = 0;
        foreach ($Inscritos as $valor) {
            $total = $total + $valor;
        }

mysqli_close($conec) ;
}
?>

Editado por elossio
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...