Problema com resuldados do MySql
Fala pessoal, eu to fazendo um sistema de buscas com palavras chave em PHP segue o código.
ele ta praticamente perfeito, o problema é que toda vês que ele faz uma busca no banco de dados ele me da um retorno sim ou não, e no caso se eu fizer uma busca.
Se calça nem quadrada não estiver presente no meu BD ele vai exibir o resultado equivalente a pesquisa Moto G e calça quadrada ele mostra a frase que não encontrou :/ tudo e eu só quero que essa frase existe se nenhuma das palavras pesquisadas estiver no meu banco de dados, caso Moto G calça quadrada não estiver presente no banco de dados exibe aviso que não encontrou caso alguma das palavras estiver me da um resultado :D alguma ideia de como fazer isso? :/
if(isset($_GET['envia_pesquisa'])){
$busca = $_GET['pesquisa'];
echo "
<div id='cem'>
<div class='form2'>
<form method='get' action='' id='form2'>
<input type='text' name='pesquisa' value='".$busca."'/>
<input type='submit' name='envia_pesquisa' value='Pesquisar'/>
</form>
</div>
</div>
";
$busca = explode(' ', $busca);
$quant = count($busca);
$id_mostrado = array("");
for($i=0;$i<$quant;$i++){
$pesquisa = $busca[$i];
$sql = mysql_query("SELECT * FROM mr_posts WHERE titulo LIKE '%$pesquisa%' ORDER BY visitas DESC");
$quant_campos = mysql_num_rows($sql);
if($quant_campos == 0 ){
echo "Ops... Não encontramos nada a sobre <font color='#000'>$sobre</font> mas você pode fazer uma solicitação de conteúdo<a href='http://www.hosteste.esy.es/contato' title='Solicitar Conteúdo'> aqui</a>.";
} else {
while($array = mysql_fetch_array($sql)) {
$id = $array['id'];
$titulo = $array['titulo'];
$descricao = $array['descricao_b'];
if(empty($descricao)){
$str = strip_tags( $array['conteudo'] );
$len = strlen( $str );
$max = 160;
$descricao = substr($str, 0, $max)."...";
}
$url = $root."/artigo/".$id."/".strtr($titulo, $trata_url).".html";
if(!array_search($id, $id_mostrado)){
echo "
<div id='resultado'>
<a href='".$url."'><h1>".$titulo."</h1></a>
<p>".$descricao."</p>
</div>
";
array_push($id_mostrado, "$id");
}
}
}
}ele ta praticamente perfeito, o problema é que toda vês que ele faz uma busca no banco de dados ele me da um retorno sim ou não, e no caso se eu fizer uma busca.
Moto G calça quadrada
Se calça nem quadrada não estiver presente no meu BD ele vai exibir o resultado equivalente a pesquisa Moto G e calça quadrada ele mostra a frase que não encontrou :/ tudo e eu só quero que essa frase existe se nenhuma das palavras pesquisadas estiver no meu banco de dados, caso Moto G calça quadrada não estiver presente no banco de dados exibe aviso que não encontrou caso alguma das palavras estiver me da um resultado :D alguma ideia de como fazer isso? :/
Cleyton Caetano
Curtidas 0
Respostas
Ronaldo Lanhellas
29/12/2014
Nesse caso você teria que fazer um "explode()" nas suas palavras, criando um array e pesquisando palavra a palavra no SQL. Algo como isso:
Óbvio que vocÊ terá que montar seu SQL em um laço FOR , mostrei acima apenas um exemplo de como deverá ficar.
SELECT * FROM mr_posts WHERE titulo LIKE '%$palavra[0]%' OR LIKE '%$palavra[1]%' OR LIKE '%$palavra[2]%' ORDER BY visitas DESC;
Óbvio que vocÊ terá que montar seu SQL em um laço FOR , mostrei acima apenas um exemplo de como deverá ficar.
GOSTEI 0
Cleyton Caetano
29/12/2014
Nesse caso você teria que fazer um "explode()" nas suas palavras, criando um array e pesquisando palavra a palavra no SQL. Algo como isso:
Óbvio que vocÊ terá que montar seu SQL em um laço FOR , mostrei acima apenas um exemplo de como deverá ficar.
SELECT * FROM mr_posts WHERE titulo LIKE '%$palavra[0]%' OR LIKE '%$palavra[1]%' OR LIKE '%$palavra[2]%' ORDER BY visitas DESC;
Óbvio que vocÊ terá que montar seu SQL em um laço FOR , mostrei acima apenas um exemplo de como deverá ficar.
não to conseguindo montar o SQL, pode me dar uma ajudinha :D
<?php
$produto = 'novo seguranca casa festa';
$produto = explode(' ', $produto);
$quant = count($produto);
$sql1 = "SELECT * FROM mr_posts WHERE titulo LIKE '%$produto[0]%' ";
for ($i = 0; $i < $quant; $i++) {
$sql2 = "OR LIKE '%$produto[$i]%' ";
}
$sql3 = "ORDER BY visitas DESC";
$sql = "(".$sql1.$sql2.$sql3.")";o problema é que o resultado eu eu tenho assim é só o primeiro e o último, como faço pra variável $sql2 pegar todos os valores?
GOSTEI 0
Ronaldo Lanhellas
29/12/2014
Nesse caso você teria que fazer um "explode()" nas suas palavras, criando um array e pesquisando palavra a palavra no SQL. Algo como isso:
Óbvio que vocÊ terá que montar seu SQL em um laço FOR , mostrei acima apenas um exemplo de como deverá ficar.
SELECT * FROM mr_posts WHERE titulo LIKE '%$palavra[0]%' OR LIKE '%$palavra[1]%' OR LIKE '%$palavra[2]%' ORDER BY visitas DESC;
Óbvio que vocÊ terá que montar seu SQL em um laço FOR , mostrei acima apenas um exemplo de como deverá ficar.
não to conseguindo montar o SQL, pode me dar uma ajudinha :D
<?php
$produto = 'novo seguranca casa festa';
$produto = explode(' ', $produto);
$quant = count($produto);
$sql1 = "SELECT * FROM mr_posts WHERE titulo LIKE '%$produto[0]%' ";
for ($i = 0; $i < $quant; $i++) {
$sql2 = "OR LIKE '%$produto[$i]%' ";
}
$sql3 = "ORDER BY visitas DESC";
$sql = "(".$sql1.$sql2.$sql3.")";o problema é que o resultado eu eu tenho assim é só o primeiro e o último, como faço pra variável $sql2 pegar todos os valores?
Vamos lá .. tente assim
$produto = 'novo seguranca casa festa';
$produto = explode(' ', $produto);
$quant = count($produto);
$sql1 = "SELECT * FROM mr_posts WHERE titulo ";
for ($i = 0; $i < $quant; $i++) {
if ($i == 0){
$sql2 += " LIKE '%$produto[$i]%'";
}else{
$sql2 += " OR LIKE '%$produto[$i]%' ";
}
$sql3 = "ORDER BY visitas DESC";
$sql = "(".$sql1.$sql2.$sql3.")";}
[/code]
GOSTEI 0
Cleyton Caetano
29/12/2014
Nesse caso você teria que fazer um "explode()" nas suas palavras, criando um array e pesquisando palavra a palavra no SQL. Algo como isso:
Óbvio que vocÊ terá que montar seu SQL em um laço FOR , mostrei acima apenas um exemplo de como deverá ficar.
SELECT * FROM mr_posts WHERE titulo LIKE '%$palavra[0]%' OR LIKE '%$palavra[1]%' OR LIKE '%$palavra[2]%' ORDER BY visitas DESC;
Óbvio que vocÊ terá que montar seu SQL em um laço FOR , mostrei acima apenas um exemplo de como deverá ficar.
não to conseguindo montar o SQL, pode me dar uma ajudinha :D
<?php
$produto = 'novo seguranca casa festa';
$produto = explode(' ', $produto);
$quant = count($produto);
$sql1 = "SELECT * FROM mr_posts WHERE titulo LIKE '%$produto[0]%' ";
for ($i = 0; $i < $quant; $i++) {
$sql2 = "OR LIKE '%$produto[$i]%' ";
}
$sql3 = "ORDER BY visitas DESC";
$sql = "(".$sql1.$sql2.$sql3.")";o problema é que o resultado eu eu tenho assim é só o primeiro e o último, como faço pra variável $sql2 pegar todos os valores?
Vamos lá .. tente assim
$produto = 'novo seguranca casa festa';
$produto = explode(' ', $produto);
$quant = count($produto);
$sql1 = "SELECT * FROM mr_posts WHERE titulo ";
for ($i = 0; $i < $quant; $i++) {
if ($i == 0){
$sql2 += " LIKE '%$produto[$i]%'";
}else{
$sql2 += " OR LIKE '%$produto[$i]%' ";
}
$sql3 = "ORDER BY visitas DESC";
$sql = "(".$sql1.$sql2.$sql3.")";}
[/code]
enfim consegui forma o sql!
$produto = 'novo seguranca casa festa';
$produto = explode(' ', $produto);
$quant = count($produto);
$sql1 = "SELECT * FROM mr_posts WHERE titulo ";
for ($i = 0; $i < $quant; $i++) {
if ($i == 0){
$sql2 = " LIKE '%$produto[$i]%'";
}else{
$sql2 .= " OR LIKE '%$produto[$i]%' ";
}
}
$sql3 = "ORDER BY visitas DESC";
$sql = "(".$sql1.$sql2.$sql3.")";fiz algumas alterações, tirei o + e coloquei . por estava mostrando o mesmo resultado da meu código anterior menos a parte do $produto[0], mas agora o meu Sql ta formado :D, vou tentar executar a busca agora!
GOSTEI 0
Cleyton Caetano
29/12/2014
Bom, depois de tentar executar a buscar ocorreu um erro :/
o erro que está presente agora é:
veja meu código atual pra ver como está!
já tentei trocar os seguentes códigos.
mas não tive o sucesso esperado...
o erro que está presente agora é:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\grajau-shopping\produtos.php on line 87
veja meu código atual pra ver como está!
$produto = explode(' ', $produto);
$quant = count($produto);
$sql1 = "SELECT * FROM produtos WHERE nome_produto";
for ($i = 0; $i < $quant; $i++) {
if ($i == 0){
$sql2 = " LIKE '%$produto[$i]%'";
}else{
$sql2 .= " OR LIKE '%$produto[$i]%' ";
}
}
$sql3 = "ORDER BY visitas DESC";
$sql = '"'.$sql1.$sql2.$sql3.'"';
$sql_query = mysql_query($sql);
while($array = mysql_fetch_array($sql_query)) {
$id = $array['id_produto'];
$imagem = $array['foto'];
$valor = $array['valor'];
$novo = $array['novo'];
$nome_produto = utf8_encode($array['nome_produto']);
echo "
<div class='lista_produtos'>
<div class='produto_exibe'>
<div id='imagem'>
<center>
<a href='".$root."/produto.php?id=".$id."' title='".$nome_produto."'><img src='".$imagem."' /></a>
</center>
</div>
<div id='titulo'>
<a href='".$root."/produto.php?id=".$id."' title='".$nome_produto."'><h2>".$nome_produto."</h2></a>
</div>
<div id='valor'>
";
if($novo != 1){
echo "<p>Produto Usado</p>";
} else {
echo "<p>Produto Novo</p>";
}
echo "
<h1><span class='cor_preco'>R$".$valor."</span></h1>
</div>
</div>
</div>
";
}já tentei trocar os seguentes códigos.
$sql2 .= " OR LIKE '%$produto[$i]%' "; // POR $sql2 .= " OR nome_produto LIKE '%$produto[$i]%' ";
mas não tive o sucesso esperado...
GOSTEI 0
Ronaldo Lanhellas
29/12/2014
De um var_dump no $sql_query e mostre seu conteúdo aqui.
GOSTEI 0
Cleyton Caetano
29/12/2014
De um var_dump no $sql_query e mostre seu conteúdo aqui.
o que o var_drumo me retornou foi.
bool(false)
GOSTEI 0
Ronaldo Lanhellas
29/12/2014
De um var_dump no $sql_query e mostre seu conteúdo aqui.
o que o var_drumo me retornou foi.
bool(false)
Então seu SQL foi não executado. Antes de enviá-lo use o var_dump() no $sql e poste aqui o SQL montado.
GOSTEI 0
Ronaldo Lanhellas
29/12/2014
De um var_dump no $sql_query e mostre seu conteúdo aqui.
o que o var_drumo me retornou foi.
bool(false)
Então seu SQL foi não executado. Antes de enviá-lo use o var_dump() no $sql e poste aqui o SQL montado.
GOSTEI 0
Cleyton Caetano
29/12/2014
enfim consegue resolver.. mudanças....
$sql = '"'.$sql1.$sql2.$sql3.'"'; // para $sql = $sql1.$sql2.$sql3; // e $sql3 = "ORDER BY visitas DESC"; //por $sql3 = " ORDER BY rand()";
GOSTEI 0
Ronaldo Lanhellas
29/12/2014
Então pelo que pude perceber o seu ORDER BY estava errado, possivelmente o campo VISITAS Não existe.
GOSTEI 0
Cleyton Caetano
29/12/2014
Então pelo que pude perceber o seu ORDER BY estava errado, possivelmente o campo VISITAS Não existe.
era justamente isso :D visitas é de outra tabela :D
agora outro probleminha :/ eu quero que ele procure por palavras inteiras, e não uma busca por letras, tipo se alguém procura por MOTO G ele vai entregar os resultados equivalentes mas também vai entregar todas os registros que tiver a letra G no meio, tem como resolver isso?
GOSTEI 0
Ronaldo Lanhellas
29/12/2014
Então pelo que pude perceber o seu ORDER BY estava errado, possivelmente o campo VISITAS Não existe.
era justamente isso :D visitas é de outra tabela :D
agora outro probleminha :/ eu quero que ele procure por palavras inteiras, e não uma busca por letras, tipo se alguém procura por MOTO G ele vai entregar os resultados equivalentes mas também vai entregar todas os registros que tiver a letra G no meio, tem como resolver isso?
Você pode fazer uma checagem, onde a palavra que tiver menos que 2 caracteres irá juntar-se com a anterior.
GOSTEI 0
Cleyton Caetano
29/12/2014
Então pelo que pude perceber o seu ORDER BY estava errado, possivelmente o campo VISITAS Não existe.
era justamente isso :D visitas é de outra tabela :D
agora outro probleminha :/ eu quero que ele procure por palavras inteiras, e não uma busca por letras, tipo se alguém procura por MOTO G ele vai entregar os resultados equivalentes mas também vai entregar todas os registros que tiver a letra G no meio, tem como resolver isso?
Você pode fazer uma checagem, onde a palavra que tiver menos que 2 caracteres irá juntar-se com a anterior.
e como faz isso?
GOSTEI 0
Ronaldo Lanhellas
29/12/2014
Pode fazer assim:
$produto = explode(' ', $produto);
$quant = count($produto);
$sql1 = "SELECT * FROM produtos WHERE nome_produto";
for ($i = 0; $i < $quant; $i++) {
$palavra_composta = $produto[$i];
if (count($produto[$i+1]) <= 2){
$palavra_composta .= $produto[$i+1];
$i++;
if (count($produto[$i+1]) <= 2){
$palavra_composta .= $produto[$i+1];
$i++;
}
}
if (empty($sql2)){
$sql2 = " LIKE '%$palavra_composta%'";
}else{
$sql2 .= " OR LIKE '%$palavra_composta%' ";
}
$palavra_composta = "";
}
$sql3 = "ORDER BY visitas DESC";
$sql = '"'.$sql1.$sql2.$sql3.'"';
$sql_query = mysql_query($sql);
while($array = mysql_fetch_array($sql_query)) {
$id = $array['id_produto'];
$imagem = $array['foto'];
$valor = $array['valor'];
$novo = $array['novo'];
$nome_produto = utf8_encode($array['nome_produto']);
echo "
<div class='lista_produtos'>
<div class='produto_exibe'>
<div id='imagem'>
<center>
<a href='".$root."/produto.php?id=".$id."' title='".$nome_produto."'><img src='".$imagem."' /></a>
</center>
</div>
<div id='titulo'>
<a href='".$root."/produto.php?id=".$id."' title='".$nome_produto."'><h2>".$nome_produto."</h2></a>
</div>
<div id='valor'>
";
if($novo != 1){
echo "<p>Produto Usado</p>";
} else {
echo "<p>Produto Novo</p>";
}
echo "
<h1><span class='cor_preco'>R$".$valor."</span></h1>
</div>
</div>
</div>
";
}
GOSTEI 0
Ronaldo Lanhellas
29/12/2014
Pode fazer assim:
$produto = explode(' ', $produto);
$quant = count($produto);
$sql1 = "SELECT * FROM produtos WHERE nome_produto";
for ($i = 0; $i < $quant; $i++) {
$palavra_composta = $produto[$i];
if (count($produto[$i+1]) <= 2){
$palavra_composta .= $produto[$i+1];
$i++;
if (count($produto[$i+1]) <= 2){
$palavra_composta .= $produto[$i+1];
$i++;
}
}
if (empty($sql2)){
$sql2 = " LIKE '%$palavra_composta%'";
}else{
$sql2 .= " OR LIKE '%$palavra_composta%' ";
}
$palavra_composta = "";
}
$sql3 = "ORDER BY visitas DESC";
$sql = '"'.$sql1.$sql2.$sql3.'"';
$sql_query = mysql_query($sql);
while($array = mysql_fetch_array($sql_query)) {
$id = $array['id_produto'];
$imagem = $array['foto'];
$valor = $array['valor'];
$novo = $array['novo'];
$nome_produto = utf8_encode($array['nome_produto']);
echo "
<div class='lista_produtos'>
<div class='produto_exibe'>
<div id='imagem'>
<center>
<a href='".$root."/produto.php?id=".$id."' title='".$nome_produto."'><img src='".$imagem."' /></a>
</center>
</div>
<div id='titulo'>
<a href='".$root."/produto.php?id=".$id."' title='".$nome_produto."'><h2>".$nome_produto."</h2></a>
</div>
<div id='valor'>
";
if($novo != 1){
echo "<p>Produto Usado</p>";
} else {
echo "<p>Produto Novo</p>";
}
echo "
<h1><span class='cor_preco'>R$".$valor."</span></h1>
</div>
</div>
</div>
";
}
GOSTEI 0
Cleyton Caetano
29/12/2014
meu sql ficou assim!
fazendo algumas alterações pra ficar moral.
string(83) ""SELECT * FROM produtos WHERE nome_produto LIKE '%MotoGnovo%'ORDER BY visitas DESC""
fazendo algumas alterações pra ficar moral.
GOSTEI 0
Ronaldo Lanhellas
29/12/2014
Só falta colocar um espaço na variável $palavra_composta
GOSTEI 0
Cleyton Caetano
29/12/2014
Só falta colocar um espaço na variável $palavra_composta
o resultado continua sendo o mesmo.
string(83) ""SELECT * FROM produtos WHERE nome_produto LIKE '%MotoGnovo%'ORDER BY visitas DESC""
GOSTEI 0
Cleyton Caetano
29/12/2014
Fiz de outro jeito :D
segue o código#
Resultado#
um problema :D queria que a palavra Moto sumisse, já que na próxima vem Moto G
segue o código#
<?php
$produto = 'Moto G novo';
$produto = explode(' ', $produto);
$quant = count($produto);
$sql = "SELECT * FROM produtos WHERE nome_produto ";
for ($i = 0; $i < $quant; $i++) {
if($i == 0){
$conta_letras = strlen($produto[$i]);
if($conta_letras <= 2){
$sql .= " LIKE '%".$produto[$i-1]." ".$produto[$i]."%'";
} else {
$sql .= " LIKE '%$produto[$i]%' ";
}
} else {
$conta_letras = strlen($produto[$i]);
if($conta_letras <= 2){
$sql .= "OR nome_produto LIKE ''%".$produto[$i-1]." ".$produto[$i]."%''";
} else {
$sql .= "OR nome_produto LIKE '%$produto[$i]%' ";
}
}
}
$sql .= "ORDER BY rand()";
var_dump($sql);Resultado#
string(135) "SELECT * FROM produtos WHERE nome_produto LIKE '%Moto%' OR nome_produto LIKE ''%Moto G%''OR nome_produto LIKE '%novo%' ORDER BY rand()"
um problema :D queria que a palavra Moto sumisse, já que na próxima vem Moto G
GOSTEI 0
Ronaldo Lanhellas
29/12/2014
Peço que releia a lógica que eu postei pra você, está bem diferente da sua.
GOSTEI 0