::Porto 0 Denunciar post Postado Dezembro 3, 2006 Pessoal, criei uma busca no banco de dados através de um formulário. Vamos supor que a TABELA contenha os seguintes campos: nome-------|---sobrenome ------------- | --------------- Ronaldinho-|---Gaucho Gilberto-----|---Silva Raul---------|---Seixas Maria Rita---|---Silva A instrução utilizada para consulta foi esta:$consulta = "SELECT * FROM tabela WHERE (nome LIKE '%$busca%') OR (sobrenome LIKE '%$busca%')"; onde a variável $busca refere-se ao name="busca" type="text" do form. A busca está funcionando da seguinte forma: 1a) Situação: I) Se o usuário digita por Ronaldinho a busca funciona perfeitamente; II) Se o usuário digita por Gaucho a busca funciona perfeitamente; III) Agora se o usuário digita por Ronaldinho Gaucho a busca não está encontrando nada. 2a) Situação: I) Se o usuário digita por Maria Rita a busca funciona perfeitamente; II) Agora se o usuário digita invertido por Rita Maria a busca não está encontrando nada. Conto com a ajuda de vocês para a solução do problema. Agradeço desde já a colaboração de todos. Abraços. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
walace 1 Denunciar post Postado Dezembro 4, 2006 O "erro" três da primeira situação está correto, você não tem ninguem igual " Ronaldinho Gaucho", ou você tem "Ronaldinho" ou você tem "Gaucho". O mesmo vale para o item II da segunda situação. E se o cara tiver três ou quatro nomes ? Talvez fosse interessante você "dividir" tua variável $busca, jogar em um array, daí usar o IN para fazer a busca dentro deste array. Se você digitar "Maria Rita", teu array vai ficar com dois itens, "Maria" e "Rita", faz um loop para montar o IN, daí tua consulta ficaria assim. SELECT * FROM tabela WHERE nome IN ('$busca[0]','$busca[1]')OR sobrenome IN ('$busca[0]','$busca[1]') Isso para o exemplo acima ficaria assim: SELECT * FROM tabela WHERE nome IN ('Maria','Rita')OR sobrenome IN ('Maria','Rita') Pensa aí... qualquer coisa manda. Compartilhar este post Link para o post Compartilhar em outros sites
::Porto 0 Denunciar post Postado Dezembro 6, 2006 Olá Walace! Primeiramente, obrigado pela cooperação na solução do meu problema. Bom, transformei a minha variável de $busca em array, quebrei cada palavra do array e fiz o looping para inserir na variável que contém o SELECT. No entanto, me compliquei na hora de inserir o resultado do looping na variável SELECT. Tentei concatenando, criando uma nova função, .... enfim, não obtive exito neste procedimento. Daí, pra conferir, resolvi fazer aquele "TIRA-TEIMA" sobre a sua solução, utilizando IN no select... incorporando exatamente como no exemplo da Maria Rita abaixo: SELECT * FROM tabela WHERE nome IN ('Maria','Rita') OR sobrenome IN ('Maria','Rita')Desta forma, não encontrei nenhum resultado. Daí, realizando outros testes, constatei que só obteria resultado satisfatório se escrevesse o nome exatamente como se encontra no CAMPO da tabela, que no caso seria 'Maria Rita'.... ou seja, o IN não considerou a quebra da busca em 'Maria' e 'Rita'. Com isso, depois de sofrer entre tentativas e erros, encontrei uma forma de fazer o processo bem "feia"... porém funcional... que seria gerando um loop com um resultado enorme desta forma: SELECT * FROM tabela WHERE nome LIKE ('%$busca[0]%') OR sobrenome LIKE ('%$busca[0]%') OR ... OR nome LIKE ('%$busca[n]%') OR sobrenome LIKE ('%$busca[n]%')Agora, o meu problema tá em incorporar o resultado do loop no SELECT e peço ajuda. O código que criei foi este: /* varbusca recebe a variavel $buscar do formulário */$varbusca = "$buscar";$divisao = " ";$busca = split($divisao, $varbusca);$elementos = count($busca);$i=1;if ($elementos>0){ echo " nome LIKE ('%$busca[0]%') OR sobrenome LIKE ('%$busca[0]%')"; while ($i<$elementos){ echo " OR nome LIKE ('%$busca[$i]%') OR sobrenome LIKE ('%$busca[$i]%')"; ++$i; }}Agradeço antecipadamente, Um abraço. :wacko: Compartilhar este post Link para o post Compartilhar em outros sites
walace 1 Denunciar post Postado Dezembro 6, 2006 Testei teu codigo e aparentemente deve estar correto. Copiei isso: echo "SELECT * FROM tabela WHERE ";$varbusca = "Maria Rita";$divisao = " ";$busca = split($divisao, $varbusca);$elementos = count($busca);$i=1;if ($elementos>0){ echo " nome LIKE ('%$busca[0]%') OR sobrenome LIKE ('%$busca[0]%')"; while ($i<$elementos){ echo " OR nome LIKE ('%$busca[$i]%') OR sobrenome LIKE ('%$busca[$i]%')"; ++$i; }} E o resultado foi este: SELECT * FROM tabela WHERE nome LIKE ('%Maria%') OR sobrenome LIKE ('%Maria%') OR nome LIKE ('%Rita%') OR sobrenome LIKE ('%Rita%') Não está certo ? Compartilhar este post Link para o post Compartilhar em outros sites
::Porto 0 Denunciar post Postado Dezembro 6, 2006 O resultado que quero é este mesmo... mas estou me complicando pra armazenar todo este código que gera o SELECT dentro de uma variavel. Que faça isso no select da Maria Rita: $VARIAVEL = "SELECT * FROM tabela WHERE nome LIKE ('%Maria%') OR sobrenome LIKE ('%Maria%') OR nome LIKE ('%Rita%') OR sobrenome LIKE ('%Rita%')"; Compartilhar este post Link para o post Compartilhar em outros sites
walace 1 Denunciar post Postado Dezembro 6, 2006 Acho que entendi, então faz o seguinte: (potz, tá virando mais php do que mysql, mas tudo bem, vamos lá...) http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif $query = "SELECT * FROM tabela WHERE ";$varbusca = "Maria Rita";$divisao = " ";$busca = split($divisao, $varbusca);$elementos = count($busca);$i=1;if ($elementos>0){ $query.=" nome LIKE ('%$busca[0]%') OR sobrenome LIKE ('%$busca[0]%')"; while ($i<$elementos){ $query.=" OR nome LIKE ('%$busca[$i]%') OR sobrenome LIKE ('%$busca[$i]%')"; ++$i; }}echo $query; Vê o conteúdo de query no final, deve ser isso que você quer. Compartilhar este post Link para o post Compartilhar em outros sites
::Porto 0 Denunciar post Postado Dezembro 6, 2006 Muito legal mesmo... vivendo e aprendendo. Valeu Walace, ficou perfeito! Desculpa ter desviado um pouco do foco do MySQL.Um grande abraço. Compartilhar este post Link para o post Compartilhar em outros sites
walace 1 Denunciar post Postado Dezembro 7, 2006 Sem problemas cara, o legal é que está resolvido.Abraço. Compartilhar este post Link para o post Compartilhar em outros sites