1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[Ajuda]Pesquisar em php.

Discussão em 'Web Development' iniciada por malta231, 11 de Setembro de 2012. (Respostas: 18; Visualizações: 1315)

  1. malta231

    malta231 Power Member

    Boas,

    Fiz um pesquisa para o meu site (loja de artigos informáticos) e meti um pesquisa para procurar os artigos.

    Só que, se a palavra inserida no $pesquisa não for igual aos Registos da BD ele apresenta a mensagem: Nenhum artigo foi encontrado com a palavra ".$pesquisa."";
    Mas se eu inserir uma palavra que seja igual a BD ele mostra na mesma a mensagem e os artigos. Mas não devia, deveria só mostrar os artigos.

    Alguem me pode ajudar?

    Deixo aqui o Código completo em baixo. O código que está a vermelhor é o que esté acontecer isto.


    Código:
    <?php
    // Recuperamos a ação enviada pelo formulário
    $a = $_GET['menu'];
    
    // Verificamos se a ação é de busca
    if ($a == "inserepesquisa") {
    
    // Pegamos a palavra
    $pesquisa = trim($_POST['pesquisa']);
    
    // Verificamos no banco de dados produtos equivalente a palavra digitada
    $sql = mysql_query("SELECT * FROM artigos WHERE NomeArtigo LIKE '%".$palavra."%' ORDER BY NomeArtigo");
    
    // Descobrimos o total de registos encontrados
    $numRegistos = mysql_num_rows($sql);
    
    // Se houver pelo menos um registo, exibe-o
    if (empty($pesquisa)) {
    //header('Location: '.$_SERVER['HTTP_REFERER']);
         echo "Por favor inserira uma palavra para efectuar uma pesquisa de artigos";
    }else {
    
    
    [COLOR=#b22222][B]// Se não houver registos
    if ($pesquisa != $numRegistos) {
    echo "Nenhum artigo foi encontrado com a palavra ".$pesquisa."";
    //echo $numRegistros;
    }[/B][/COLOR]
    
    
    // Exibe os produtos e seus respectivos preços
    $sql=mysql_query("SELECT  a.idArtigos, a.NomeArtigo, a.Descricao, a.ValorUnit, f.Imagem FROM  artigos a INNER JOIN fotosartigos f ON a.idArtigos = f.ID_Artigos WHERE  f.tipo=1 and a.NomeArtigo like '%$pesquisa%'");
    while ($reg=mysql_fetch_row($sql)){
    echo '<div style="margin-top:-15px;">';
    echo '<table class="sample" CELLPADDING=2 >';
    echo '<tr>';
    echo '<td align="left" colspan=4 class="ert">';
    echo "<a href='index.php?menu=produto&prod=".$reg[0]."' style='text-decoration:none'>";
    echo $reg[1];
    echo '</a>';
    echo '</td>';
    echo '<td align="right" class="ert"> ';
    echo $reg[3].'&nbsp;€';
    echo '</tr>';
    echo '<tr>';
    echo '<td rowspan="4" width="100">';
    echo "<img src='img/$reg[4]' style='min-width:136px; max-width:136px; max-height:130px; -moz-border-radius:1px'>";
    echo '</td>';
    echo '</tr>';
    echo '<tr>';
    echo '<td align="justify" colspan=3 rowspan="3" class="errt" width="280">';
    echo $reg[2];
    echo '</td>';
    echo '</tr>';
    echo '<tr>';
    echo  "<td align='center'><a  href='index.php?menu=artigos&subcat=".$_GET['subcat']."&flag=1&id_pro=".$reg[0]."'><img  src='images/comprar.jpg'></a></td>";
    echo '</tr>';
    echo '<tr>';
    echo  "<td align='center'><a  href='index.php?menu=produto&prod=".$reg[0]."'  style='text-decoration:none'><img  src='images/ver_mais.jpg'></a></td>";
    echo '</tr>';
    echo '</table>';
    echo '</div>';
    }
    }
    }
    ?>
    
     
    Última edição: 11 de Setembro de 2012
  2. maxperformance

    maxperformance Power Member

    Atenção ao SQLInject.

    Num estante recebo uma GTX690 em casa sem pagar :P
     
  3. malta231

    malta231 Power Member

    Nao tenho nenhum SQLInject.
     
  4. Loppersy

    Loppersy Power Member

    Atenção que ele tem razão, estás vulnerável a SQL Injection

    Tenta isto:
     
  5. barricas

    barricas Power Member

    Tenta mudar

    if ($pesquisa != $numRegistos)

    para

    if ($numRegistos == '0')

    Que neste caso mostra a mensagem caso não encontre matches.

    Podes colocar um else para a parte a vermelho caso encontre mais do que 0 registos ou em vez de um else no
    if (empty($pesquisa))
    podes fazer

    if (empty($pesquisa)) {
    // campo de pesquisa vazio
    }
    elseif ($numRegistos = '0') {
    // mensagem que não encontrou
    }
    elseif ($numRegistos > '0') {
    // codigo para mostrar resultados
    }

    E sim, tens de filtrar o GET porque senão é fácil de fazer SQL Injection

    Penso que não me enganei/esqueci de alguma coisa.
     
    Última edição: 12 de Setembro de 2012
  6. malta231

    malta231 Power Member

    Não funciona.
     
    Última edição: 11 de Setembro de 2012
  7. barricas

    barricas Power Member

    Qual é o problema que estás a ter?

    edit: nem tinha visto que havia mas coisas abaixo do cod. vermelho :P

    Hmmm revendo isso em princípio mudando para
    if ($numRegistos == '0')
    devia dar
     
    Última edição: 12 de Setembro de 2012
  8. malta231

    malta231 Power Member

    Assim ja tinha experimentado.
     
  9. barricas

    barricas Power Member

    Já fizeste echo ao $numRegistos para ver qual é o valor dele (quando encontra qualquer coisa com a pesquisa)? Assim à primeira não estou a ver qual seja o problema :\
     
  10. malta231

    malta231 Power Member

    Sim tambem já tinha feito. Dá-me 331 que é o numero de artigos que tenho.
     
  11. maxperformance

    maxperformance Power Member

    o ereg ja não funciona foi substituído pelo preg_match.

    if ($pesquisa != $numRegistos)

    estas a comprar a palavra de pesquisa, com o numero de registos.
    isso vai dar sempre false.


    att. que a função like não é optimizada para fazer o que pretendes, e quando tiveres uma quantidade de artigos considerável, isso vai encravar o SQL, e tu estas a usar duas vezes para fazer a mesma coisa.

    entre a falta de protecção básica para SQLinject, uso de GET´s (dois erros graves apenas numa pag. de pesquisa), não te aconselho a usar esse site em ambiente de produção e procurar ajuda de quem saiba o que esta a fazer..
     
  12. barricas

    barricas Power Member

    Quanto ao anterior concordo mas porquê não usar GET nas pesquisas?
    O próprio google o faz tal como muitos sites... A não ser que nessa pesquisa sejam usados dados sensíveis não vejo porque não usar GET
     
  13. maxperformance

    maxperformance Power Member

    Sabes quantas pessoas se suicidam por ano.. secalhar devíamos nos suicidar também..

    o mal que tem neste caso, www.abc. ....... SELECT * / DROP TABLE / ETC ..........

    o uso do GET não tem mal nenhum, se o souberem usar..
     
  14. Confusion

    Confusion Power Member

    if (!$numRegistos) {
    echo "Nenhum artigo foi encontrado com a palavra ".$pesquisa."";
    }

    ou então

    if ($numRegistos==0) {
    echo "Nenhum artigo foi encontrado com a palavra ".$pesquisa."";
    }
     
  15. barricas

    barricas Power Member

    Ok mas daí dizer que não se deve usar em ambiente de produção vai muito
     
  16. maxperformance

    maxperformance Power Member

    "não te aconselho a usar esse site em ambiente de produção e procurar ajuda de quem saiba o que esta a fazer.."

    vai a diferença entre saber onde se pode usar e onde não se deve usar.
     
  17. barricas

    barricas Power Member

    k, passou-me ao lado
     
  18. fel

    fel Power Member

Partilhar esta Página