Neste tutorial vamos continuar a trabalhar com o código construído em Crie um aplicativo web com PHP e MySQL. Portanto, se você não o fez, corre lá, ou baixe aqui os arquivos do projeto. Nele você terá um código capaz de fazer uma busca simples numa tabela MySQL. Agora o nosso trabalho será o de formatar a resposta de forma a deixá-la mais legível.

Formulário simples de busca

Atualmente a busca retorna o nome do curso e o turno do aluno em duas linhas, conforme a linha de código abaixo que está no arquivo search.php:

echo "<p><h3>".$results['NO_CURSO']."</h3>".$results['DS_TURNO_ALUNO']."</p>";

Página de resultados da busca

Note que o código usa a variável $results para coletar os valores da linha. A busca na tabela MySQL retorna uma array (lista) de resultados cujas linhas são compostas pelas linhas da tabela. Cada linha tem um valor correspondente a cada coluna. Você pode usar o nome da coluna para acessar o valor dela: $results[‘nome_da_coluna’].

Para testar isso vamos fazer com que cada linha exiba o curso, o turno, o sexo e a raça do aluno, de forma que ele irá ficar assim:

echo "<p>Curso:".$results['NO_CURSO']." - Turno:".$results['DS_TURNO_ALUNO']." - Sexo: ".$results['DS_SEXO_ALUNO']." - Raça: ".$results['DS_COR_RACA_ALUNO']."</p>";

Página de resultados da busca

 

Para testar esse novo código, é só fazer a substituição no código original no arquivo search.php e salvar o arquivo novamente no servidor.

Operações com dados

Agora o que queremos é calcular o percentual que o número de respostas a busca representa em relação ao total de registros no banco de dados. Para tanto, precisamos primeiro fazer o sistema contar o total de registros, o que fazemos com a seguinte linha de comando:

$total = mysql_query("SELECT * FROM alunos") or die(mysql_error());
$num_rows = mysql_num_rows($total);

E aí contamos o número de linhas no retorno da busca:

$raw_results = mysql_query("SELECT * FROM alunos
WHERE (`NO_CURSO` LIKE '%".$query."%') OR (`DS_TURNO_ALUNO` LIKE '%".$query."%')") or die(mysql_error());
$num_rows2 = mysql_num_rows($raw_results);

Por fim, calculamos o percentual:

$percent = $num_rows2 / $num_rows * 100;

E exibimos o resultado:

echo "Foram encontrados:".$num_rows." resultados. ";
$percent = $num_rows2 / $num_rows * 100;
echo "Isso representa ";
echo round($percent, 2);
echo "% do total de alunos";

Todas essas alterações são feitas no arquivo search.php. O resultado é o seguinte:

Busca por termos estabelecidos

Agora o que queremos é estabelecer a quantidade de alunos por sexo e raça por curso. Para tanto vamos fazer alterar a busca inicial. Ao invés de uma caixa de texto, vamos criar uma caixa de seleção em que os cursos disponíveis no banco de dados aparecem listados. Isso evita que o usuário busque por termos que não estão no sistema.

Começamos alterando o index.php para trocar a caixa de texto por uma caixa de seleção:

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;title&gt;Busca&lt;/title&gt;
&lt;!--&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;--&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;form action="search.php" method="GET"&gt;&lt;select&nbsp;name="cars"&gt;
&nbsp;&nbsp;&lt;option&nbsp;value="volvo"&gt;Volvo&lt;/option&gt;
&nbsp;&nbsp;&lt;option&nbsp;value="saab"&gt;Saab&lt;/option&gt;
&nbsp;&nbsp;&lt;option&nbsp;value="fiat"&gt;Fiat&lt;/option&gt;
&nbsp;&nbsp;&lt;option&nbsp;value="audi"&gt;Audi&lt;/option&gt;
&lt;/select&gt;
&lt;input type="submit" value="Busca" /&gt;
&lt;/form&gt;

&lt;/body&gt;
&lt;/html&gt;

Note que agora há um elemento dentro do

&lt;form&gt;

chamado

&lt;select&gt;

. No momento ele contém só algumas informações de exemplo. Nós queremos popular esse elemento com a lista de cursos disponíveis no banco de dados.

Para popular o select vamos usar o php. Primeiro é preciso se conectar ao banco de dados:

&lt;?php
mysql_connect("localhost", "root", "") or die("Error connecting to database: ".mysql_error());
mysql_select_db("database") or die(mysql_error());
?&gt;

Depois fazemos a busca no banco pelos nomes de curso. Vamos usar o comando SELECT DISTINCT para obter os nomes uma única vez, do contrário teremos uma lista de nomes de curso com o mesmo número de alunos de cada curso, o que não é necessário.

$raw_results = mysql_query("SELECT DISTINCT `CO_CURSO`,`NO_CURSO` FROM `alunos`") or die(mysql_error());

Por fim, vamos usar o loop while para que, enquanto houver um curso diferente, se crie a opção com o nome desse curso dentro do select:

echo "&lt;select name='query'&gt;";


while($results = mysql_fetch_array($raw_results)){
echo "&lt;option value=".$results['CO_CURSO']."&gt;".$results['NO_CURSO']."&lt;/option&gt;";
}
echo "&lt;/select&gt;";

Caixa de seleção com os nomes dos cursos

No fim, nosso index.php ficará assim:

&lt;!-- Esta é a página com o formulário de pesquisa. --&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head&gt;
&lt;title&amp;gt;Busca&amp;lt;/title&gt;
&lt;!--&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&amp;gt;--&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;form action="search.php" method="GET"&gt;
&lt;?php
mysql_connect("localhost", "root", "") or die("Error connecting to database: ".mysql_error());
mysql_select_db("database") or die(mysql_error());

$raw_results = mysql_query("SELECT DISTINCT `CO_CURSO`,`NO_CURSO` FROM `alunos`") or die(mysql_error());

while($results = mysql_fetch_array($raw_results)){
echo "&lt;option value=".$results['CO_CURSO']."&gt;".$results['NO_CURSO']."&lt;/option&gt;";
}
echo "&lt;/select&gt;";
?&gt;
&lt;input type="submit" value="Busca" /&gt;
&lt;/form&gt;

&lt;/body&gt;
&lt;/html&gt;

Agora é hora de utilizar o termo de busca para construir a página de resposta. Para isso vamos editar o search.php. Primeiro pegamos o valor obtido

$query = $_GET['query']; 
// pega o valor enviado pelo formulário

$min_length = 3;
// determina um número mínimo de caracteres por query
$total = mysql_query("SELECT * FROM alunos") or die(mysql_error());
// seleciona todos os itens da tabela
$num_rows = mysql_num_rows($total);
//conta quantas linhas tem a tabela completa


if(strlen($query) &amp;gt;= $min_length){ 
// Se a query é menor que o mínimo, então

$query = htmlspecialchars($query); 
// muda caracteres html para código

$query = mysql_real_escape_string($query);
// evita injeção de dados pelo formulário

$raw_results = mysql_query("SELECT * FROM alunos
WHERE (`CO_CURSO` LIKE '%".$query."%')") or die(mysql_error());
// busca todos os itens da tabela que correspondem ao termo de busca
$num_rows2 = mysql_num_rows($raw_results);
// conta quantas linhas tem o resultado da busca acima

$mulheres = mysql_query("SELECT * FROM alunos
WHERE (`CO_CURSO` LIKE '%".$query."%') AND (`IN_SEXO_ALUNO` LIKE '1')") or die(mysql_error());
$mulheres_p = mysql_num_rows($mulheres);
// aqui pesquisamos dentro do curso selecionado quantas alunas são mulheres e usamos o mysql_num_rows para obter a quantidade de linhas que retornaram
$results = mysql_fetch_array($raw_results); //pega os resultados da busca e transforma numa array
$homens = $num_rows2 - $mulheres_p; //calcula o número de homens
$percent = $mulheres_p / $num_rows2 * 100;  //calcula o percentual de mulheres
$percent2 = 100 - $percent; //calcula o percentual de homens

echo "&lt;p&gt;O curso de ".$results['NO_CURSO']." tem ".$mulheres_p."(";
echo round($percent,2); //arredonda o valor para duas casas decimais
echo "%) alunas mulheres e ".$homens."(";
echo round($percent2,2);
echo "%) alunos homens. &lt;/p&gt;";
//exibe os resultados
$brancos = mysql_query("SELECT * FROM alunos
WHERE (`CO_CURSO` LIKE '%".$query."%') AND (`CO_COR_RACA_ALUNO` LIKE '1')") or die(mysql_error());
$brancosp = mysql_num_rows($brancos);
$pretos = mysql_query("SELECT * FROM alunos
WHERE (`CO_CURSO` LIKE '%".$query."%') AND (`CO_COR_RACA_ALUNO` LIKE '2')") or die(mysql_error());
$pretosp = mysql_num_rows($pretos);
$pardos = mysql_query("SELECT * FROM alunos
WHERE (`CO_CURSO` LIKE '%".$query."%') AND (`CO_COR_RACA_ALUNO` LIKE '3')") or die(mysql_error());
$pardosp = mysql_num_rows($pardos);
$amarelos = mysql_query("SELECT * FROM alunos
WHERE (`CO_CURSO` LIKE '%".$query."%') AND (`CO_COR_RACA_ALUNO` LIKE '4')") or die(mysql_error());
$amarelosp = mysql_num_rows($amarelos);
$indigenas = mysql_query("SELECT * FROM alunos
WHERE (`CO_CURSO` LIKE '%".$query."%') AND (`CO_COR_RACA_ALUNO` LIKE '5')") or die(mysql_error());
$indigenasp = mysql_num_rows($indigenas);
$nao = mysql_query("SELECT * FROM alunos
WHERE (`CO_CURSO` LIKE '%".$query."%') AND (`CO_COR_RACA_ALUNO` LIKE '6')") or die(mysql_error());
$naop = mysql_num_rows($nao);
$nao_quis = mysql_query("SELECT * FROM alunos
WHERE (`CO_CURSO` LIKE '%".$query."%') AND (`CO_COR_RACA_ALUNO` LIKE '0')") or die(mysql_error());
$nao_quisp = mysql_num_rows($nao_quis);

echo "&lt;p&gt;Do total de ".$num_rows2." alunos, ".$brancosp." se declararam brancos, ".$pretosp." pretos, ".$pardosp." pardos, ".$amarelosp." amarelos, ".$indigenasp." indigenas. Não há informação sobre ".$naop." e ".$nao_quisp." não quiseram informar.&lt;/p&gt;";
//calcula e exibe o total de alunos por cor/raça
}
?&gt;
&lt;pre&gt;

Note que o novo código deverá substituir o antigo no search.php original, mantendo o cabeçalho e rodapé HTML.

Com isso, o resultado de busca exibirá o seguinte resultado:

Resultado da busca

 

Tags:

One comment

Crie páginas interativas com PHP e MySQL – parte 2 de 4

Deixe uma resposta