Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

andersonb8

Autocomplete buscar em 2 colunas diferentes na mesma tabela

Recommended Posts

Como buscar em 2 colunas diferentes na mesma tabela?

Tentei adicionar um WHERE produto AND cod_prod no código abaixo porém não funcionou.

if($acao == 'autocomplete'):
	$where = (!empty($parametro)) ? 'WHERE produto LIKE ?' : '';
	$sql = "SELECT * FROM tbl_produtos " . $where;

	$stm = $conexao->prepare($sql);
	$stm->bindValue(1, '%'.$parametro.'%');
	$stm->execute();
	$dados = $stm->fetchAll(PDO::FETCH_OBJ);

	$json = json_encode($dados);
	echo $json;
endif;

Atualmente meu projeto usa dois inputs, um pra buscar pelo nome do produto e outro pra buscar pelo código do produto, o que eu quero é deixar um input só que eu possa digitar o código ou nome do produto.

Upei ele aqui para um melhor entendimento http://www.booleto.com/vendas/

Se digitar a letra "a" em produtos, vai aparecer uma lista com alguns produtos e se digitar o número "7" em código produto vai aparecer uma lista com alguns códigos.

Como faço pra um input só fazer essa busca tanto pelo código como pelo nome?

Compartilhar este post


Link para o post
Compartilhar em outros sites

na verdade você precisa de um OR

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verdade Willian acabei escrevendo errado, porém quando coloco OR, ("WHERE cod_prod OR produto") se digito algum número na pesquisa ele retorna todos os produtos da lista por nome, e não retorna nenhum código (sequência de números), porque isso acontece?

Compartilhar este post


Link para o post
Compartilhar em outros sites
$stmt = $pdo->prepare("SELECT * FROM tbl_produtos WHERE produto LIKE ? OR codigo LIKE ?");
$stmt->bindValue(1, "%{$produto}%", PDO::PARAM_STR);
$stmt->bindValue(2, "%{$codigo}%", PDO::PARAM_INT);
$stmt->execute();

Acho que isso resolve seu problema

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Anderson,

Penso que no caso do código você deve fazer uma busca absoluta e nunca um LIKE.

Por que razão? Se você digita 1 e utiliza um LIKE, todos os produtos que possuem 1 no seu código serão retornados.

Exemplo: Códigos 1, todas dezenas de 10, 21, 31, 41, ..., todos códigos 100 e por aí vai.

Utilize LIKE sempre para nomes, para código, faça sempre a busca exata.

if($acao == 'autocomplete'):
	$where = (!empty($parametro)) ? 'WHERE produto LIKE :produto OR codigo=:codigo' : '';
	$sql = "SELECT * FROM tbl_produtos $where";

	$stm = $conexao->prepare($sql);
	$stm->bindValue(':produto', "%$parametro%");
	$stm->bindValue(':codigo', $parametro);
	$stm->execute();
	$dados = $stm->fetchAll(PDO::FETCH_OBJ);

	$json = json_encode($dados);
	echo $json;
endif;

PS 1: Recomenda-se o uso de aspas duplas ao invés da concatenação (me parece que a performance é melhor)

PS 2: No caso de uso de variável dentro de aspas, caso a variável não seja matriz, não há necessidade de usar {} (chaves)

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mesmo com a ajuda o código ainda não funciona.

Se eu acrescento um OR alguma coisa, ele não mostra nem produto nem código.

Se eu acrescento um segundo bindValue, ele também não mostra nem produto e nem código,

Agora se eu trocar WHERE produto LIKE ?" por WHERE codigo LIKE ?", ele mostra os códigos buscados exatamente do jeito que eu quero e se eu deixar WHERE produto LIKE ?", ele mostra os produtos do jeito que eu quero também, agora se juntar os dois o código para de funcionar.

Confesso que estou um tempão tentando de tudo e num consigo encontrar uma solução " já pesquisei até em fóruns em Inglês, já tentei mudar igual os amigos me disseram ai em cima, mais nada da certo.

Eu reduzi o código ao máximo pra ficar fácil a interpretação.

Segue:

index mais script.

<html>
<head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <link rel="stylesheet" type="text/css" href="css/jquery-ui.min.css">   
      <script type="text/javascript" src="js/jquery.js"></script>
      <script type="text/javascript" src="js/jquery-ui.min.js"></script>
<script>
      $(function() {
    $( "#busca" ).autocomplete({
	    minLength: 1,
	    source: function( request, response ) {
	        $.ajax({
	            url: "busca.php",
	            dataType: "json",
	            data: {
	            	acao: 'autocomplete',
	                busca: $('#busca').val()
	            },
	            success: function(data) {
	               response(data);
	            }
	        });
	    },
    })
    .autocomplete( "instance" )._renderItem = function( ul, item ) {
      return $( "<li>" )
        .append( item.codigo + item.produto )
        .appendTo( ul );
    };
  
});
</script>
</head>
<style>
td{padding-left:10px}
input{height:30px; border:none; font-size:18px}
input:focus{ outline:none}
li{background-color:#fff; padding:5px}
</style>

<body style="max-width:800px; margin:5%">
<form method="get" />
<table width="100%" border="1" cellspacing="3">
  <tr>
    <td width="40%">BUSCA:</td>
    <td width="60%">
      <input id="busca" type="text" size="55%" onClick="this.value=''" /></td>
  </tr>  
</table>
</form>
</body>
</html>

busca.php

<?php 
define('SERVER', 'localhost');
define('DBNAME', 'buscando');
define('USER', 'root');
define('PASSWORD', '');

$acao = (isset($_GET['acao'])) ? $_GET['acao'] : '';

$opcoes = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8');
$conexao = new PDO("mysql:host=".SERVER."; dbname=".DBNAME, USER, PASSWORD, $opcoes);

if($acao == 'autocomplete'):

	$stm = $conexao->prepare("SELECT * FROM tbl_produtos WHERE produto LIKE ?");
	$stm->bindValue(1, '%'.$_GET['busca'].'%');
	$stm->execute();
	$dados = $stm->fetchAll(PDO::FETCH_OBJ);

	$json = json_encode($dados);
	echo $json;
endif;
?>

Do jeito que esta ele funciona só com um tipo de pesquisa ou seja: WHERE produto LIKE ? ou então WHERE codigo LIKE ?

Agradeço a quem poder ajudar ou me disser logo que não da pra fazer esse tipo de consulta, pra eu poder para de quebrar a cabeça logo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
O código indicado pelo ociceromartins, que utiliza placeholder ao invés de "?" (:produto e :codigo), é para funcionar. Já testou o código dele? Esse último código que você postou está bem semelhante ao primeiro que você postou... não tem as alterações sugeridas (não tem o OR, não tem a verificação com empty, não está usando placeholders na consulta, etc)... aí não dá para saber como que você fez, pois talvez tenha alterado algo errado e por isso não funciona.


De qualquer forma, habilite as mensagens de erro para ter certeza de que não há nada de errado nas instruções (principalmente se a consulta não retornar resultado):



<?php
// adiciona estas duas linhas no início do arquivo:
ini_set("display_errors", 1);
error_reporting(E_ALL|E_STRICT);

// restante do seu código

// adicione estas após a linha do $stm->execute();
var_dump($conexao->errorInfo());
var_dump($sth->errorInfo());

// restante do seu código

Compartilhar este post


Link para o post
Compartilhar em outros sites

Anderson,

É bem provável que você tenha feito algo errado durante a alteração do código, pois a semântica do mesmo está totalmente correta.

Faça as alterações corretamente e caso o problema persista, siga as sugestões do AndersonMamede para exibir todos os erros.

Dessa forma fica mais fácil te ajudarmos!

Um abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente o código do amigo ociceromartins está correto.

No meu caso não funcionava porque a variável "$parametro" do php estava dando conflito com a linha "parametro: $('#busca').val()" do script.

Eu troquei "parametro: $('#busca').val()" por "busca: $('#busca').val()" e o código funcionou perfeitamente.

Muito obrigado aos amigos que me ajudaram!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.