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

sistema de busca com filtro


acscarolina

Pergunta

<?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 para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 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...