Rosye 0 Denunciar post Postado Julho 8, 2004 Oi, pessoal! Estou tentando criar uma busca dentro de um banco de dados que me retorne os usuários dentro de uma certa faixa de idade (de 20 a 30 anos, por exemplo). As idades estão armazenadas no banco na forma da data de nascimento da pessoa (dd/mm/aaaa). O select ficou assim: $busca = "SELECT Data_nascimento FROM membros WHERE idade LIKE '%$pidade%'"; A variável pidade vem do formulário de busca (input name="pidade"). Dessa forma, a idade nem é calculada por faixa, e sim, por um único número inserido no formulário, mas eu só fiz isso pra testar, por enquanto. Para calcular a idade em número a partir da data de nascimento, usei o seguinte script no WHILE: while ($linha = mysql_fetch_array($resultado)) { $idade = $linha ["Data_nascimento"]; if ($idade!="") { function calculaDia($iMes, $iDia, $iAno) { $iTimeStamp = (mktime(0,0,0) - 86400) - mktime(0, 0, 0, $iMes, $iDia, $iAno); $iDias = $iTimeStamp / 86400; $iAnos = floor($iDias); $iAnos = $iAnos / 365; return intval($iAnos); } $data=$idade; $ndata=explode("/",$data); $idade2 = calculaDia($ndata[1],$ndata[0],$ndata[2]); } } Aí a busca funcionou, mas o problema é que ela me retorna somente um membro com a idade buscada, e não todos. Quando há mais de um, retorna a seguinte mensagem: Fatal error: Cannot redeclare calculadia() (previously declared in E:\Home Pages\membros\pesquisa.php:197) in E:\Home Pages\membros\pesquisa.php on line 197 Pensei em uma solução, que seria criar no banco de dados uma coluna "idade", que calculasse a idade em números a partir da data de nascimento no momento da inserção dos dados, depois puxasse diretamente esse número na consulta. Mas aí, essa idade ficaria gravada estática no banco, e não mudaria de acordo com a passagem dos anos, certo?? :blink: Alguém tem uma idéia do que eu posso fazer para que essa busca funcione? Ou algum tutorial específico para esse tipo de dúvida (busca por informações de usuários em um banco de dados, no estilo de um site de encontros)? Agradeço qualquer ajuda! Compartilhar este post Link para o post Compartilhar em outros sites
michelsp 0 Denunciar post Postado Julho 8, 2004 Estou tentando criar uma busca dentro de um banco de dados que me retorne os usuários dentro de uma certa faixa de idade (de 20 a 30 anos, por exemplo).Na query: PHP [/tr][tr]where idade>20 And idade<30[/tr] Só adaptar ao seu caso, se for ano usa ano. Bjão, t+ Compartilhar este post Link para o post Compartilhar em outros sites
Rosye 0 Denunciar post Postado Julho 8, 2004 Não é isso, não quero especificar o valor na query, e sim, que o usuário entre com o valor no formulário! Mas não é esse o problema, e sim, a conversão dos valores que eu tenho (em datas de nascimento) para números (x anos). É esse erro do final que eu quero tirar, mas não sei como... :( Compartilhar este post Link para o post Compartilhar em outros sites
Alisson Rodrigues 3 Denunciar post Postado Julho 8, 2004 Precisei disso um tempo atrás e não sabia fazer, daí agora que tu pediu, me matei, mas terminei uma query, olha: SELECT data,IF((substring(data,4,2)>date_format(now(),'%m')) OR ((substring(data,4,2)=date_format(now(),'%m')) AND (substring(data,1,2)>date_format(now(),'%d'))),date_format(now(),'%Y')-substring(data,7,4)-1,date_format(now(),'%Y')-substring(data,7,4)) as idade FROM idade HAVING idade>'20' AND idade<'30'O campo data contém a data no formato dd/mm/aaaa ;) Compartilhar este post Link para o post Compartilhar em outros sites
Rosye 0 Denunciar post Postado Julho 8, 2004 Mudando um pouco seu código para o que estou tentando fazer, que é pegar a idade que o usuário digitar no formulário, a query ficou assim:$busca = "SELECT Data_nascimento, IF((substring(Data_nascimento,4,2)>date_format(now(),'%m')) OR ((substring(Data_nascimento,4,2)=date_format(now(),'%m')) AND (substring(Data_nascimento,1,2)>date_format(now(),'%d'))),date_format(now(),'%Y')-substring(Data_nascimento,7,4)-1,date_format(now(),'%Y')-substring(Data_nascimento,7,4)) as idade LIKE '%$pidade1%'";Não funcionou. Tem alguma coisa errada no código?? :( Agradeço a ajuda! Compartilhar este post Link para o post Compartilhar em outros sites
Alisson Rodrigues 3 Denunciar post Postado Julho 8, 2004 você quer buscar os que tiverem uma determinada idade? Se for,é só mudar o final: SELECT data,IF((substring(data,4,2)>date_format(now(),'%m')) OR ((substring(data,4,2)=date_format(now(),'%m')) AND (substring(data,1,2)>date_format(now(),'%d'))),date_format(now(),'%Y')-substring(data,7,4)-1,date_format(now(),'%Y')-substring(data,7,4)) as idade FROM idade HAVING idade='25'o 25 do final é a idade que você quer buscar. ;) Compartilhar este post Link para o post Compartilhar em outros sites
Rosye 0 Denunciar post Postado Julho 8, 2004 Não, eu não quero especificar a idade na query, eu quero pegar um número digitado em um formulário de busca!Exemplo - no banco de dados temos 3 cadastros:Usuário 1 - data de nascimento 07/03/1978Usuário 2 - data de nascimento: 03/04/1918Usuário 3 - data de nascimento: 12/12/1990No formulário de busca, o usuário vai digitar 2 valores: - 20 e 30 (pesquisando todos os usuários entre 20 e 30 anos): o resultado será o Usuário 1- 62 e 90: o resultado será o Usuário 2- 05 e 23: o resultado será o Usuário 3É isso, na query eu pretendia usar algo como BETWEEN os 2 valores digitados. Mas não é essa a dúvida, e sim, como fazer essa conversão de data de nascimento para número da idade, sacou? Usei o código que você sugeriu, mas infelizmente não funcionou... Compartilhar este post Link para o post Compartilhar em outros sites
Alisson Rodrigues 3 Denunciar post Postado Julho 8, 2004 Ué, então é só pegar aquele primeiro code que passei e substituir o 20 e o 30 do final pelas variaveis digitadas: PHP [/tr][tr]$age1 = $_GET['age1'];$age2 = $_GET['age2']; $busca = mysql_query("SELECT data,IF((substring(data,4,2)>date_format(now(),'%m')) OR ((substring(data,4,2)=date_format(now(),'%m')) AND (substring(data,1,2)>date_format(now(),'%d'))),date_format(now(),'%Y')-substring(data,7,4)-1,date_format(now(),'%Y')-substring(data,7,4)) as idade FROM idade HAVING idade>'".$age1."' AND idade<'".$age2."'");[/tr] ;) Compartilhar este post Link para o post Compartilhar em outros sites
Rosye 0 Denunciar post Postado Julho 8, 2004 Não adianta, ele não encontra os registros. :( Obrigada por tentar. Compartilhar este post Link para o post Compartilhar em outros sites
ualex 0 Denunciar post Postado Julho 8, 2004 seria legal você informa o banco de dados. tipo o mysql trabalha com data de um jeito o oracle de outro jeito. mas vou adotar que você esta utilizando o nosso querido mysql vamos la. O SQL tem um operador que ja lhe fornece a possibilidade de procurar por faixas... sem precisar inventar a roda :) ele é ? o between o seu select ficaria +- assim : select * from tabela where campo between $idadeInicial and $idadeFinal Nesse link você encontrara um artigo de manipulação basica de datas no Mysql. http://www.linuxhard.org/publicacoes.php?id=10 boa sorte. Compartilhar este post Link para o post Compartilhar em outros sites
Rosye 0 Denunciar post Postado Julho 8, 2004 Exatamente, Ualex! Eu pretendia usar between desde o início. Tanto que agora funcionou, veja como ficou a query inteira, de jeito que eu queria: PHP [/tr][tr]$busca = "SELECT Nome, Sexo, Cidade, Data_nascimento, IF((substring(Data_nascimento,4,2)>date_format(now(),'%m')) OR ((substring(Data_nascimento,4,2)=date_format(now(),'%m')) AND (substring(Data_nascimento,1,2)>date_format(now(),'%d'))),date_format(now(),'%Y')-substring(Data_nascimento,7,4)-1,date_format(now(),'%Y')-substring(Data_nascimento,7,4)) as idade FROM membros WHERE nome LIKE '%$pnome%' AND cidade LIKE '%$pcidade%' AND sexo LIKE '%$psexo%' AND idade BETWEEN '$pidade1' AND '$pidade2' ORDER BY $ordem";[/tr] Assim, ele pesquisa o nome, cidade, idade e sexo dos membros cadastrados ao mesmo tempo! :) Mutante, o que você usaria no lugar do LIKE nessa query?? Agradeço a todos que colaboraram!! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif Compartilhar este post Link para o post Compartilhar em outros sites
Rosye 0 Denunciar post Postado Julho 8, 2004 Acho que o = dá pra usar no campo sexo, que é definido por 2 botões radio (Masc ou Fem). No Cidade e Nome prefiro deixar o LIKE para que sejam retornados os dados a partir da digitação de parte do nome ou da cidade no form... Data_nascimento eu coloquei como varchar=10 embora o correto fosse date, certo? É porque o date registra no formato yyyy/mm/dd e eu queria dd/mm/yyyy. Compartilhar este post Link para o post Compartilhar em outros sites
covered 0 Denunciar post Postado Julho 9, 2004 aproveitando o post sobre buscaestou desenvolvendo uma usando o Like só que com o like tem que tar igualzinhonao tem uma funcao do mysql que verifica se o valor do campo tem alguma palavra? Compartilhar este post Link para o post Compartilhar em outros sites
covered 0 Denunciar post Postado Julho 9, 2004 tipow...por exemplo tu digita ´pra buscah "cat" com o Like vai axah cateu quero um comnando que se botar "cat" vai aparecer "categoria"pq o like nao faz isso Compartilhar este post Link para o post Compartilhar em outros sites
Alisson Rodrigues 3 Denunciar post Postado Julho 9, 2004 É só você usar o "%" antes e depois da palavra: PHP [/tr][tr]campo like '%palavra%'[/tr] ;) Compartilhar este post Link para o post Compartilhar em outros sites
covered 0 Denunciar post Postado Julho 9, 2004 vlwakbei meu sisteminha de busca simples Compartilhar este post Link para o post Compartilhar em outros sites
Rosye 0 Denunciar post Postado Julho 14, 2004 Oi, pessoal! Resolvi seguir a dica do Mutante e mudei o campo Data_nascimento do banco de dados de VARCHAR para DATE. Assim, as datas que antes eram guardadas como dd/mm/YYYY agora estão no formato YYYY-mm-dd Agora a minha query de busca por idade não funciona mais. Como faço para fazê-la funcionar com esse novo formato? :( Lembrando a query: PHP [/tr][tr]$busca = "SELECT Nome, Sexo, Cidade, Data_nascimento, IF((substring(Data_nascimento,4,2)>date_format(now(),'%m')) OR ((substring(Data_nascimento,4,2)=date_format(now(),'%m')) AND (substring(Data_nascimento,1,2)>date_format(now(),'%d'))),date_format(now(),'%Y')-substring(Data_nascimento,7,4)-1,date_format(now(),'%Y')-substring(Data_nascimento,7,4)) as idade FROM membros WHERE nome LIKE '%$pnome%' AND cidade LIKE '%$pcidade%' AND sexo LIKE '%$psexo%' AND idade BETWEEN '$pidade1' AND '$pidade2' ORDER BY $ordem";[/tr] Valeu pela ajuda! Compartilhar este post Link para o post Compartilhar em outros sites
Alisson Rodrigues 3 Denunciar post Postado Julho 14, 2004 Troca por: PHP [/tr][tr]$busca = "SELECT Nome, Sexo, Cidade, Data_nascimento, IF((date_format(Data_nascimento,'%m')>date_format(now(),'%m')) OR ((date_format(Data_nascimento,'%m')=date_format(now(),'%m')) AND (date_format(Data_nascimento,'%d')>date_format(now(),'%d'))),date_format(now(),'%Y')-date_format(Data_nascimento,'%Y')-1,date_format(now(),'%Y')-date_format(Data_nascimento,'%Y')) as idade FROM membros WHERE nome LIKE '%$pnome%' AND cidade LIKE '%$pcidade%' AND sexo LIKE '%$psexo%' AND idade BETWEEN '$pidade1' AND '$pidade2' ORDER BY $ordem";[/tr] ;) Compartilhar este post Link para o post Compartilhar em outros sites
Rosye 0 Denunciar post Postado Julho 14, 2004 Não tá funcionando... :( Compartilhar este post Link para o post Compartilhar em outros sites
Rosye 0 Denunciar post Postado Julho 14, 2004 Alguém sabe por que não está funcionando?? Agradeço qualquer ajuda!!! []s!Rosana Compartilhar este post Link para o post Compartilhar em outros sites