Problema com resuldados do MySql

29/12/2014

Fala pessoal, eu to fazendo um sistema de buscas com palavras chave em PHP segue o código.

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

Respostas

29/12/2014

Ronaldo Lanhellas

Nesse caso você teria que fazer um "explode()" nas suas palavras, criando um array e pesquisando palavra a palavra no SQL. Algo como isso:

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.
Responder Citar

29/12/2014

Cleyton Caetano

Nesse caso você teria que fazer um "explode()" nas suas palavras, criando um array e pesquisando palavra a palavra no SQL. Algo como isso:
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?
Responder Citar

29/12/2014

Ronaldo Lanhellas

[quote]Nesse caso você teria que fazer um "explode()" nas suas palavras, criando um array e pesquisando palavra a palavra no SQL. Algo como isso:
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?[/quote]

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]
Responder Citar

29/12/2014

Cleyton Caetano

[quote][quote]Nesse caso você teria que fazer um "explode()" nas suas palavras, criando um array e pesquisando palavra a palavra no SQL. Algo como isso:
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?[/quote]

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][/quote]

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!
Responder Citar

29/12/2014

Cleyton Caetano

Bom, depois de tentar executar a buscar ocorreu um erro :/

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...
Responder Citar

29/12/2014

Ronaldo Lanhellas

De um var_dump no $sql_query e mostre seu conteúdo aqui.
Responder Citar

29/12/2014

Cleyton Caetano

De um var_dump no $sql_query e mostre seu conteúdo aqui.


o que o var_drumo me retornou foi.

bool(false) 
Responder Citar

29/12/2014

Ronaldo Lanhellas

[quote]De um var_dump no $sql_query e mostre seu conteúdo aqui.


o que o var_drumo me retornou foi.

bool(false) 
[/quote]

Então seu SQL foi não executado. Antes de enviá-lo use o var_dump() no $sql e poste aqui o SQL montado.
Responder Citar

29/12/2014

Ronaldo Lanhellas

[quote]De um var_dump no $sql_query e mostre seu conteúdo aqui.


o que o var_drumo me retornou foi.

bool(false) 
[/quote]

Então seu SQL foi não executado. Antes de enviá-lo use o var_dump() no $sql e poste aqui o SQL montado.
Responder Citar

29/12/2014

Cleyton Caetano

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()";
Responder Citar

29/12/2014

Ronaldo Lanhellas

Então pelo que pude perceber o seu ORDER BY estava errado, possivelmente o campo VISITAS Não existe.
Responder Citar

29/12/2014

Cleyton Caetano

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?
Responder Citar

29/12/2014

Ronaldo Lanhellas

[quote]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?[/quote]

Você pode fazer uma checagem, onde a palavra que tiver menos que 2 caracteres irá juntar-se com a anterior.
Responder Citar

29/12/2014

Cleyton Caetano

[quote][quote]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?[/quote]

Você pode fazer uma checagem, onde a palavra que tiver menos que 2 caracteres irá juntar-se com a anterior.[/quote]

e como faz isso?
Responder Citar

29/12/2014

Ronaldo Lanhellas

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>
                                    ";
                        }
Responder Citar