Jump to content
Fórum Script Brasil
  • 0

sistema de busca com filtro


acscarolina
 Share

Question

<?php
$host = "localhost";
$user = "root";
$pass = "";
$banco = "filtro_questoes";
$connection = mysqli_connect($host, $user, $pass, $banco) or die ("Erro ao conectar-se"); 
mysqli_select_db($connection, $banco) or die ("Não foi possível selecionar o banco");

//////////////////////DISCIPLINAS//////////////////////////////////////////////
$sql_disciplina = "SELECT * FROM tabela_disciplina ORDER BY Disciplina ASC";
$pega_disciplina = mysqli_query($connection, $sql_disciplina);

////////////////////////////////////////BANCAS/////////////////////////////////
$sql_banca="SELECT * FROM tabela_banca ORDER BY Banca ASC";
$pega_banca = mysqli_query($connection,$sql_banca);

////////////////////////////////////////INSTITUIÇÃO/////////////////////////////////
$sql_instituicao="SELECT * FROM tabela_instituicao ORDER BY Instituicao ASC";
$pega_instituicao = mysqli_query($connection,$sql_instituicao);

////////////////////////////////////////CARGO/////////////////////////////////
$sql_cargo="SELECT * FROM tabela_cargo ORDER BY Cargo ASC";
$pega_cargo = mysqli_query($connection,$sql_cargo);

////////////////////////////////////////ANO////////////////////////////////////
$sql_ano="SELECT * FROM tabela_ano ORDER BY Ano ASC";
$pega_ano = mysqli_query($connection,$sql_ano);

//////////////////////NÍVEL//////////////////////////////////////////////
$sql_nivel = "SELECT * FROM tabela_nivel ORDER BY id_nivel ASC";
$pega_nivel = mysqli_query($connection, $sql_nivel);

////////////////////////////////TRAZ AS QUESTÕES DE ACORDO COM O CRITÉRIO/////
if(!empty($_POST['bt_enviar'])) 
{
$disciplina = (empty($_POST['Disciplina']))? 'null' : $_POST['Disciplina'];
$banca = (empty($_POST['Banca']))? 'null' : $_POST['Banca'];
$instituicao = (empty($_POST['Instituicao']))? 'null' : $_POST['Instituicao'];
$cargo = (empty($_POST['Cargo']))? 'null' : $_POST['Cargo'];
$ano = (empty($_POST['Ano']))? 'null' : $_POST['Ano'];
$nivel = (empty($_POST['Nivel']))? 'null' : $_POST['Nivel'];
$sql_questao="SELECT * FROM tabela_questao WHERE ( id_disciplina = $disciplina OR $disciplina = 0) AND (id_banca = $banca OR $banca = 0) AND (id_ano = $ano OR $ano = 0) AND (id_nivel = $nivel OR $nivel = 0) AND (id_instituicao = $instituicao OR $instituicao = 0) AND (id_cargo = $cargo OR $cargo = 0)";
$seleciona_questao = mysqli_query($connection,$sql_questao);
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>Busca</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<span></span>
<select name="Disciplina">
<option value="" selected="selected">Selecione a disciplina</option>
<?php
if(mysqli_num_rows($pega_disciplina) == ) {
echo '<option value="">Não foram encontradas disciplinas</option>';
}else{
while($linha = mysqli_fetch_array($pega_disciplina)){
echo '<option value="'.$linha['id_disciplina'].'">'.utf8_encode($linha['Disciplina']).'</option>';
}
}
?>
</select>
<span></span>
<select name="Banca">
<option value="" selected="selected">Selecione a banca</option>
<?php
if(mysqli_num_rows($pega_banca) == ) {
echo '<option value="">Não foram encontradas bancas</option>';
}else{
while($linhaB = mysqli_fetch_array($pega_banca)){
echo '<option value="'.$linhaB['id_banca'].'">'.utf8_encode($linhaB['Banca']).'</option>';
}
}
?>

</select>
<span></span>
<select name="Instituicao">
<option value="" selected="selected">Selecione a instituição</option>
<?php
if(mysqli_num_rows($pega_instituicao) == ) {
echo '<option value="">Não foram encontradas instituições</option>';
}else{
while($linhaD = mysqli_fetch_array($pega_instituicao)){
echo '<option value="'.$linhaD['id_instituicao'].'">'.utf8_encode($linhaD['Instituicao']).'</option>';
}
}
?>

</select>
<span></span>
<select name="Cargo">
<option value="" selected="selected">Selecione o cargo</option>
<?php
if(mysqli_num_rows($pega_cargo) == ) {
echo '<option value="">Não foram encontrados cargos</option>';
}else{
while($linhaD = mysqli_fetch_array($pega_cargo)){
echo '<option value="'.$linhaD['id_cargo'].'">'.utf8_encode($linhaD['Cargo']).'</option>';
}
}
?>

</select>
<span></span>
<select name="Nivel">
<option value="" selected="selected">Selecione o nível</option>
<?php
if(mysqli_num_rows($pega_nivel) == ) {
echo '<option value="">Não foram encontrados níveis</option>';
}else{
while($linhaC = mysqli_fetch_array($pega_nivel)){
echo '<option value="'.$linhaC['id_nivel'].'">'.utf8_encode($linhaC['Nivel']).'</option>';
}
}
?>

</select>
<span>Ano</span>
<select name="Ano">
<option value="" selected="selected">Selecione o Ano</option><br />
<br />
<?php
if(mysqli_num_rows($pega_ano) == ) {
echo '<option value="">Não foram encontrados</option>';
}else{
while($linhaB = mysqli_fetch_array($pega_ano)){
echo '<option value="'.$linhaB['id_ano'].'">'.utf8_encode($linhaB['Ano']).'</option>';
}
}
?>
<br /><br /><input type="submit" name="bt_enviar" value="buscar" /><br />
</form>
<hr />

<?php 
if(!empty($_POST['bt_enviar'])) 
{
if(mysqli_num_rows($seleciona_questao) == )
{
echo '<h1>Desculpe, mas sua busca, não retornou resultados</h1>';
}
else
{
echo "<ul>";
while($linhaquestao = mysqli_fetch_array($seleciona_questao)){
echo '<li>'.utf8_encode($linhaquestao['Questao']).'</li>';
}
echo "</ul>";
}
}
?>
</body>
  </html>

Olá, estou montando um sistema de busca com filtro para buscar questões de múltipla escolha em um site, de acordo com a disciplina, banca, cargo, ano, etc. Para isso cadastrei as questões em uma tabela no banco de dados mysql (tabela_questao) e as alternativas em outra tabela (tabela_alternativa). Agora eu preciso que a questão e suas alternativas apareçam juntas quando o usuário filtrar as questões de acordo com suas necessidades. Como faço isso? Não consigo pensar em uma forma de ligar as alternativas às questões filtradas. Segue o código inteiro e duas das tabelas que foram montadas no mysql.

 

tabela questão.png

tabela resposta.png

Link to comment
Share on other sites

8 answers to this question

Recommended Posts

  • 0

Q pena! Sempre achei este fórum tão bacana, mas está apresentando alguns defeitos e não se pode mais editar mensagens!

Complementando a mensagem anterior:

Cada vez que uma query for executada, faz-se necessário checar se houve alguma falha. Para evitar códigos repetitivos

Sugiro que crie uma classe para conexão e comunicação com o banco de dados, que tenha um método para execução de queries que já faça a checagem de eventuais falhas.

Assim seu script ficará mais enxuto, mais legível, de mais fácil compreensão e manutenção.

Link to comment
Share on other sites

  • 0

Não entendi muito bem qual é o mistério, mas só de fazer assim, seu script já fica mais enxuto:

Arquivo connect.php:

<?php

//  variáveis para conexão com o banco de dados
$host = 'localhost';
$user = 'root';
$password = '';
$database = 'scriptbrasil';

// estabelecer conexão com o mysql
$sqli = new mysqli($host, $user, $password);

// verificar se houve erro na conexão
if ($sqli->connect_error) {
    // se houve erro, mostra erro na tela
    echo "<p>Erro ao Conectar: $sqli->connect_error</p>";
}
// alterar o tipo de codificação da conexão com o banco de dados,  para utf8
if (!$sqli->set_charset('utf8')) {
    echo "<p class='error'>O charset não é utf8: $sqli->error</p>";
}

// selecionar/abrir o banco de dados para trabalhar
if (!$sqli->select_db($database)) {
    // se o banco de dados não for encontrado
    echo "<p class='error'>O banco de dados <b>$database</b>, não existe, chefe!</p>";
}

Arquivo que mostra os selects:

<?php
require 'connect.php';

// TRAZ AS QUESTÕES DE ACORDO COM O CRITÉRIO
if (sizeof($_POST)) {
    foreach ($_POST as $key => $value) {
        if ($value) {
            // guarda os critérios na variável $wheres 
            $wheres[] = 'id_' . strtolower($key) . ' = ' . $value;
        }
    }
    // executa a busca:
    $seleciona_questao = $sqli->query('SELECT * FROM tabela_questao WHERE ' . implode(' AND ', $wheres));
    // verifica se houve falhas
    if ($sqli->error) {
        // se houve alguma falha, mostre na tela:
        echo '<p class="error">Falha ao executar query: ' . $sqli->error . '</p>';
    }
}
?>

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Busca</title>
    </head>
    <body>
        <form method="post">
            <?php
            // define os nomes das tabelas e os campos de ordenação
            // se o campo a ser ordenado é igual ano nome da tabela, defina como null
            $selects = [
                'Disciplina' => null,
                'Banca' => null,
                'Instituicao' => null,
                'Cargo' => null,
                'Nivel' => 'id_nivel',
                'Ano' => null,
            ];
            // percorre os nomes das tabelas
            foreach ($selects as $k => $order) {
                $order = $order == null ? $k : $order;
                // inicia o select html:
                $select = "<label>$k</label><select name='$k'>";
                // executa a query de busca:
                $result = $sqli->query("SELECT * FROM tabela_$k ORDER BY $order ASC");
                // verificar se houve falha ao executar query:
                if ($sqli->error) {
                    // se houve alguma falha, mostre na tela:
                    echo '<p class="error">Falha ao executar query: ' . $sqli->error . '</p>';
                } elseif ($result->num_rows) { // se não houve falha e há algum resultado:
                    $select.="<option value=''>Selecione: $k</option>";
                    while ($linha = $result->fetch_assoc()) {
                        // adiciona options ao $select
                        $select.="<option value='{$linha['id_' . strtolower($k)]}'>$linha[$k]</option>";
                    }
                } else { // se não houve falha e não há resultado algum:
                    $select.="<option value=''>Nenhum registro para: $k</option>";
                }
                // mostra o select na tela:
                echo $select . '</select>';
            }
            ?>
            <br>
            <br>
            <input type="submit" value="buscar">
        </form>
        <hr>

        <?php
        if (sizeof($_POST)) {
            if ($seleciona_questao->num_rows) {
                echo "<ul>";
                while ($linhaquestao = $seleciona_questao->fetch_assoc()) {
                    echo '<li>' . $linhaquestao['Questao'] . '</li>';
                }
                echo "</ul>";
            } else {
                echo '<h1>Desculpe, mas sua busca, não retornou resultados</h1>';
            }
        }
        ?>
    </body>
</html>

 

Realmente é uma pena não pordermos mais editar os posts!

Gentileza considerar esse script para o  Arquivo que mostra os selects:

<?php
require 'connect.php';

// TRAZ AS QUESTÕES DE ACORDO COM O CRITÉRIO
if (sizeof($_POST)) {
    foreach ($_POST as $key => $value) {
        if ($value) {
            // guarda os critérios na variável $wheres 
            $wheres[] = 'id_' . strtolower($key) . ' = ' . $value;
        }
    }
    if (isset($wheres)) {
        // executa a busca:
        $seleciona_questao = $sqli->query('SELECT * FROM tabela_questao WHERE ' . implode(' AND ', $wheres));
        // verifica se houve falhas
        if ($sqli->error) {
            // se houve alguma falha, mostre na tela:
            echo '<p class="error">Falha ao executar query: ' . $sqli->error . '</p>';
        }
    }
}
?>

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Busca</title>
    </head>
    <body>
        <form method="post">
            <?php
            // define os nomes das tabelas e os campos de ordenação
            // se o campo a ser ordenado é igual ano nome da tabela, defina como null
            $selects = [
                'Disciplina' => null,
                'Banca' => null,
                'Instituicao' => null,
                'Cargo' => null,
                'Nivel' => 'id_nivel',
                'Ano' => null,
            ];
            // percorre os nomes das tabelas
            foreach ($selects as $k => $order) {
                $order = $order == null ? $k : $order;
                // inicia o select html:
                $select = "<label>$k</label><select name='$k'>";
                // executa a query de busca:
                $result = $sqli->query("SELECT * FROM tabela_$k ORDER BY $order ASC");
                // verificar se houve falha ao executar query:
                if ($sqli->error) {
                    // se houve alguma falha, mostre na tela:
                    echo '<p class="error">Falha ao executar query: ' . $sqli->error . '</p>';
                } elseif ($result->num_rows) { // se não houve falha e há algum resultado:
                    $select.="<option value=''>Selecione: $k</option>";
                    while ($linha = $result->fetch_assoc()) {
                        // adiciona options ao $select
                        $select.="<option value='{$linha['id_' . strtolower($k)]}'>$linha[$k]</option>";
                    }
                } else { // se não houve falha e não há resultado algum:
                    $select.="<option value=''>Nenhum registro para: $k</option>";
                }
                // mostra o select na tela:
                echo $select . '</select>';
            }
            ?>
            <br>
            <br>
            <input type="submit" value="buscar">
        </form>
        <hr>

        <?php
        if (isset($seleciona_questao)) {
            if ($seleciona_questao->num_rows) {
                echo "<ul>";
                while ($linhaquestao = $seleciona_questao->fetch_assoc()) {
                    echo '<li>' . $linhaquestao['Questao'] . '</li>';
                }
                echo "</ul>";
            } else {
                echo '<h1>Desculpe, mas sua busca, não retornou resultados</h1>';
            }
        }
        ?>
    </body>
</html>

Link to comment
Share on other sites

  • 0

Olá, obrigada pelas respostas.

lowys, está dando erro nesta parte:

            <?php
            // define os nomes das tabelas e os campos de ordenação
            // se o campo a ser ordenado é igual ano nome da tabela, defina como null
            $selects = [
                'Disciplina' => null,
                'Banca' => null,
                'Instituicao' => null,
                'Cargo' => null,
                'Nivel' => 'id_nivel', 
                'Ano' => null,
            ];

 

na linha do" $selects = [ "  o que será que pode ser?

Por que o 'Nivel' é diferente dos outros?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      149.9k
    • Total Posts
      646.8k
×
×
  • Create New...