Ir ao conteúdo
  • Cadastre-se

PHP Busca com vários campos


Ir à solução Resolvido por GabrielSennaMs,

Posts recomendados

Capturar.PNG.5871ab5586ed53cc7d63221f2335ec46.PNG

 

Pessoal, sou nova aqui no Fórum e estou começando a estudar PHP. Estou com dúvidas quanto a pesquisa com vários campos, consegui fazer para um campo só, porém quando tento para vários campos não funciona. Fiz algumas pesquisas e só consegui achar buscas com 'selects e options' e eu queria que ele pegasse o que foi digitado no input e fizesse a busca, mas o usuário não precisaria informar todos os campos (se não quisesse). Se alguém tiver como me ajudar, ficarei grata!  

Link para o comentário
Compartilhar em outros sites

Bom dia @JenneferBarbosa,

 

Para realizar essa consulta você precisa utilizar o OR na sua sintaxe de SELECT.

 

Um exemplo:

SELECT * FROM tabela WHERE nome_livro OR nome_autor OR paginas ORDER BY nome_livro ASC

Basta modificar a sintaxe acima do jeito que você precisa, adicionando as variáveis e a ordem de pesquisa (%), lembre-se de filtrar/validar as variáveis antes de fazer a consulta.

 

Grande abraço.

Link para o comentário
Compartilhar em outros sites

@ArThDsL

<form method="POST" id="form-pesquisa" action="busca.php">
            Livro: <input type="text" name="nome" id="nome" placeholder="Fulano de Tal">
            Autor: <input type="text" name="autor" id="autor" placeholder="Fulano de Tal">
            Edicao:  <input type="text" name="edicao" id="edicao" placeholder="Fulano de Tal">
            <input type="submit" name="enviar" value="Pesquisar">
 </form>
<ul class="resultado"></ul>


$nome = $_POST['nome'];
$autor = $_POST['autor'];
$edicao = $_POST['edicao'];

//Pesquisar no banco de dados nome do curso referente a palavra digitada pelo usuário
$livros = "SELECT * FROM livro WHERE nome OR autor OR edicao ORDER BY nome ASC";
$resultado_livros = mysqli_query($conn, $livros);

if (mysqli_num_rows($resultado_livros) <= 0) {
    echo "Nenhum livro encontrado...";
} else {
    while ($rows = mysqli_fetch_assoc($resultado_livros)) {
        echo "<li>" . $rows['codigo'] . "</li>";
        echo "<li>" . $rows['nome'] . "</li>";
        echo "<li>" . $rows['autor'] . "</li>";
        echo "<li>" . $rows['edicao'] . "</li>";
    }
}

Quando clico em 'Pesquisar' aparece todos os dados do banco. Pode me ajudar a resolver? E uma outra dúvida, como faz para que os dados pesquisados sejam exibidos na mesma tela. Como se ele fizesse a busca internamente e mostrasse ao usuário o que ele pesquisou sem ele sair da tela em que está o form. 

 

Desde já agradeço a ajuda!! 

Link para o comentário
Compartilhar em outros sites

Boa tarde @JenneferBarbosa,

 

• Quando você diz todos os dados do banco, ele exibe todos os dados literalmente? Ou somente os dados da tabela livros? (caso seja sobre limite da dados na consulta eu respondi la embaixo kkkk, achei que poderia ser isso tmb)

 

• Segue abaixo o código corrigido:

<?php
if(isset($erro)){ //verifica se há alguma mensagem de erro.
	echo '<center><b style="color: red;">'.$erro.'</b><br></center>'; //exibe a mensagem de erro.
}
?>
<form method="POST" id="form-pesquisa" action="busca.php">
            Livro: <input type="text" name="nome" id="nome" placeholder="Fulano de Tal">
            Autor: <input type="text" name="autor" id="autor" placeholder="Fulano de Tal">
            Edicao:  <input type="number" name="edicao" id="edicao" placeholder="Fulano de Tal">
            <input type="submit" name="enviar" value="Pesquisar">
 </form>
<ul class="resultado"></ul>
<?php
$nome = strip_tags(trim(filter_var($_POST['nome'], FILTER_SANITIZE_STRING))); //recebe e filtra a variavel NOME.
$autor = strip_tags(trim(filter_var($_POST['autor'], FILTER_SANITIZE_STRING))); //recebe e filtra a variavel AUTOR.
$edicao = strip_tags(trim(filter_var($_POST['edicao'], FILTER_SANITIZE_NUMBER_INT))); //recebe e filtra a variavel EDICAO.

if(!is_numeric($edicao)){ //verifica se a variavel EDICAO é numerica.
	$erro = 'A EDIÇÃO DO LIVRO DEVE POSSUIR SOMENTE NÚMEROS'; //Caso não seja retorna o erro.
}

//Pesquisar no banco de dados nome do curso referente a palavra digitada pelo usuário
$livros = "SELECT * FROM livro WHERE nome LIKE '".addslashes($nome)."%' OR autor LIKE '".addslashes($autor)."%' OR edicao LIKE '%".addslashes($edicao)."%' ORDER BY nome ASC";

$resultado_livros = mysqli_query($conn, $livros);

if (mysqli_num_rows($resultado_livros) <= 0) {
    echo '<b style="color: red;">Nenhum livro encontrado...</b>';
} else {
    while ($rows = mysqli_fetch_assoc($resultado_livros)) {
        echo "<li>" . $rows['codigo'] . "</li>";
        echo "<li>" . $rows['nome'] . "</li>";
        echo "<li>" . $rows['autor'] . "</li>";
        echo "<li>" . $rows['edicao'] . "</li>";
    }
}

Deixei alguns comentários nas linhas, adicionei algumas coisas, tal como filtro para as variáveis e algumas validações que deixam o sistema um pouco mais protegido contra invasões!

Sobre a sintaxe do SELECT você deve adicionar as variáveis que deseja na frente da referencia para poder realizar a busca! Os símbolos de % e o LIKE que utilizei permitem que você busque um livro pelo inicio do nome ou uma palavra chave, sem precisar digitar algo idêntico como esta no banco para retornar um resultado.

 

Para limitar os resultados que aparecem na pesquisa você teria de no final da sintaxe adicionar LIMIT e o numero de resultados que você deseja exibir

ex.

LIMIT 10 //aqui serão exibidos 10 resultados.

 

• Sobre a sua pergunta de como fazer a pesquisa sem sair da tela, você teria de utilizar Ajax ou jQuery.

 

Espero ter ajudado, qualquer coisa só postar!

 

Grande abraço.

Link para o comentário
Compartilhar em outros sites

Boa tarde, @ArThDsL

Já agradeço muito pela ajuda, porém quando clico no botão de pesquisar ele exibi os 10 primeiros registros e não o livro que foi buscado. Ele não ta fazendo o filtro do que está sendo digitado, apenas exibindo o banco, coloquei o LIMIT 10, daí então ele mostra os 10 primeiros em ordem pelo nome. 

1.PNG

2.PNG

Link para o comentário
Compartilhar em outros sites

Boa tarde @JenneferBarbosa,

 

Tente esse aqui:

<?php
if(isset($erro)){ //verifica se há alguma mensagem de erro.
	echo '<center><b style="color: red;">'.$erro.'</b><br></center>'; //exibe a mensagem de erro.
}
?>
<form method="POST" id="form-pesquisa" action="busca.php">
            Livro: <input type="text" name="nome" id="nome" placeholder="Fulano de Tal">
            Autor: <input type="text" name="autor" id="autor" placeholder="Fulano de Tal">
            Edicao:  <input type="number" name="edicao" id="edicao" placeholder="Fulano de Tal">
            <input type="submit" name="enviar" value="Pesquisar">
 </form>
<ul class="resultado"></ul>
<?php
$nome = strip_tags(trim(filter_var($_POST['nome'], FILTER_SANITIZE_STRING))); //recebe e filtra a variavel NOME.
$autor = strip_tags(trim(filter_var($_POST['autor'], FILTER_SANITIZE_STRING))); //recebe e filtra a variavel AUTOR.
$edicao = strip_tags(trim(filter_var($_POST['edicao'], FILTER_SANITIZE_NUMBER_INT))); //recebe e filtra a variavel EDICAO.

if(!is_numeric($edicao)){ //verifica se a variavel EDICAO é numerica.
	$erro = 'A EDIÇÃO DO LIVRO DEVE POSSUIR SOMENTE NÚMEROS'; //Caso não seja retorna o erro.
}

//Pesquisar no banco de dados nome do curso referente a palavra digitada pelo usuário
if($autor === null and  $edicao === null and $nome === null){
$erro = 'VOCÊ DEVE DIGITAR ALGO PARA SER BUSCADO.'; //caso seja feita uma busca em branco.
}

if($nome === null){//caso NOME seja nulo
$nome_Livro = '';	
}

if($autor === null){//caso AUTOR seja nulo
$autor_Livro = '';	
}

if($edicao === null){//caso EDICAO seja nulo
$edicao_Livro = '';
}

if($nome !== null and $autor !== null or $edicao !== null){
$nome_Livro = "nome LIKE '".addslashes($nome)."%' AND"; 
}

if($nome !== null and $autor === null and $edicao === null){
  $nome_Livro = "nome LIKE '".addslashes($nome)."%";
}

if($autor !== null and $edicao !== null){
$autor_Livro = "autor LIKE '".addslashes($autor)."%' AND";
}

if($autor !== null and $edicao === null){
  $autor_Livro = "autor LIKE '".addslashes($autor)."%";
}

if($edicao !== null){
$edicao_Livro = "edicao LIKE '".addslashes($autor)."%";
}

$livros = "SELECT * FROM livro WHERE ".$nome_Livro." ".$autor_Livro." ".$edicao_Livro." ORDER BY nome ASC LIMIT 10";

$resultado_livros = mysqli_query($conn, $livros);

if (mysqli_num_rows($resultado_livros) <= 0) {
    echo '<b style="color: red;">Nenhum livro encontrado...</b>';
} else {
    while ($rows = mysqli_fetch_assoc($resultado_livros)) {
        echo "<li>" . $rows['codigo'] . "</li>";
        echo "<li>" . $rows['nome'] . "</li>";
        echo "<li>" . $rows['autor'] . "</li>";
        echo "<li>" . $rows['edicao'] . "</li>";
    }
}
?>

Qualquer coisa estou por aqui!

 

Grande abraço.

Link para o comentário
Compartilhar em outros sites

@JenneferBarbosa

 

Nesse caso é melhor utilizar o AND a o em vez de utilizar o OR.

 

O que ocorre é que o ultimo campo "edicao" está com o valor vazio é como você adiciona um % sem nenhum valor e o sinal de porcentagem representa zero, um ou vários caracteres, ele acaba retornando todos os campos.

 

Utilizando o AND, vai fazer com que ele não ignore os dois campos anteriores

 

Para fazer isso bastar trocar o valor OR para AND;

de:

$livros = "SELECT * FROM livro WHERE nome LIKE '".addslashes($nome)."%' OR autor LIKE '".addslashes($autor)."%' OR edicao LIKE '%".addslashes($edicao)."%' ORDER BY nome ASC";

para:

$livros = "SELECT * FROM `livro` WHERE `nome` LIKE '".addslashes($nome)."%' AND `autor` LIKE '".addslashes($autor)."%' AND `edicao` LIKE '%".addslashes($edicao)."%' ORDER BY `nome` ASC";

 

Link para o comentário
Compartilhar em outros sites

@JenneferBarbosa O que ocorre é que a consulta utilizando o método mysqli_query, está falhando por algum motivo e ele está retornando o valor false para a função mysqli_num_rows, a função mysqli_num_rows não está esperando um valor falso é sim um mysqli_result objeto.

Link para o comentário
Compartilhar em outros sites

Achei o erro, quando você utilizou o código do nosso amigo @ArThDsL ele acabo comendo algumas aspa simples no texto que vai para consulta do SQL.

 

Procura esses três if e adiciona uma aspa simples(') do lado do % 

o código está assim

if($nome !== null and $autor === null and $edicao === null){
  $nome_Livro = "nome LIKE '".addslashes($nome)."%";
}

if($autor !== null and $edicao === null){
  $autor_Livro = "autor LIKE '".addslashes($autor)."%";
}

if($edicao !== null){
$edicao_Livro = "edicao LIKE '".addslashes($autor)."%";

troca para

if($autor !== null and $edicao === null){
  $autor_Livro = "autor LIKE '".addslashes($autor)."%'";
}

if($edicao !== null){
$edicao_Livro = "edicao LIKE '".addslashes($autor)."%'";
}

if($nome !== null and $autor === null and $edicao === null){
  $nome_Livro = "nome LIKE '".addslashes($nome)."%'";
}

 

Link para o comentário
Compartilhar em outros sites

Boaa @GabrielSennaMs O código não mostra erros, os valores são passados, porém é exibido para o usuário que nada foi encontrado  

Capturar.PNG

adicionado 5 minutos depois

@GabrielSennaMs E quando eu passo apenas o parâmetro do nome ele encontra o livro, porém quando uso os outros inputs diz que o livro não foi encontrado. aaa.PNG.19f861311d13d10406bacffeeb3f94a4.PNG

Link para o comentário
Compartilhar em outros sites

  • Solução

@JenneferBarbosa Isso é por que o SQL não encontrou nenhum resultado possível, o por que? tem outro erro no código do nosso amigo.

 

no if

if($edicao !== null){
$edicao_Livro = "edicao LIKE '".addslashes($autor)."%'";
}

ele troco o $edicao para $autor a consulta está saindo errado.

para corrigir isso basta trocar o $autor para $edicao

if($edicao !== null){
$edicao_Livro = "edicao LIKE '".addslashes($edicao)."%'";
}

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...