Chp 0 Denunciar post Postado Setembro 20, 2010 Olá amigos, bom dia. Estou iniciando no php e estou tentando desenvolver um sistema de cadastro de links. Criei o Banco de dados e tenho 3 tabelas, uma chamada Links, Categorias e outra chamada Visitas Em links tenho: id_link cat_id data publicado em Categorias tenho: id nome em Visitas tenho: idLink ip Então, funciona da seguinte forma: Sempre que a pessoa acessa o link cadastrado a pagina executa: if(mysql_num_rows($sql) <= '0'){ mysql_query("INSERT INTO visitas (idLink,ip) VALUES ('$id_select','$ip')")or die(mysql_error()); } Até ai tudo bem, se o ip da pessoa ainda nao tiver sido registrado no banco, ele registra. Eu estou apanhando aqui é para saber quando o link foi mais acessado, já tentei bolar alguma forma de pegar os dados e listar o que tiver mais ips cadastrados, no caso seria o campo idLink que tiver mais vezes repetido. Ex: idLink ip 2 10.0.116.5 52 10.0.116.6 55 10.0.116.2 55 10.0.116.7 55 10.0.116.11 55 10.0.116.12 55 10.0.116.13 43 10.0.116.8 6 10.0.116.9 29 10.0.116.10 Neste caso, o link de id 55 seria o mais visitado. Mas como ficaria isso em <?php ?> ?? Agradeço desde já a ajuda e o tempo de vocês. Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Setembro 20, 2010 SELECT * FROM `visitas` ORDER BY COUNT(`idLink`) DESC Até mais Compartilhar este post Link para o post Compartilhar em outros sites
Daniloinf 3 Denunciar post Postado Setembro 20, 2010 Se você quiser saber a quantidade de visitas, use essa query: select idLink, COUNT(idLink) as nVisitas from visitas group by idLink order by nVisitas DESC; o order by estava errado =( Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Setembro 20, 2010 Se você quiser saber a quantidade de visitas, use essa query: select idLink, COUNT(idLink) as nVisitas from visitas group by idLink order by qt DESC; Essa não vai funcionar. Você está contando um agrupamento. ;) Compartilhar este post Link para o post Compartilhar em outros sites
Chp 0 Denunciar post Postado Setembro 20, 2010 SELECT * FROM `visitas` ORDER BY COUNT(`idLink`) DESC Até mais Olá H4x0R, Obrigado pela rápida resposta. Vou postar aqui, como esta exatamente a minha tabela e a query e o que esta retornando: tabela idLink ip Editar Remover 2 ::1 Editar Remover 52 ::1 Editar Remover 55 10.0.116.2 Editar Remover 55 ::1 Editar Remover 43 ::1 Editar Remover 6 ::1 Editar Remover 29 ::1 Editar Remover 27 ::1 Editar Remover 26 ::1 query <?php $sql_visitas_clicado = "SELECT * FROM `visitas` ORDER BY COUNT(`idLink`) DESC " or die(mysql_error()); $query_visitas_clicado = mysql_query($sql_visitas_clicado) or die(mysql_error()); while ($linha=mysql_fetch_array($query_visitas_clicado)) { $visitas_clicado = $linha["idLink"]; $ip_clicado = $linha["ip"]; echo $visitas_clicado; } ?> o echo está retornando "2", não era pra retornar "55" ?? Compartilhar este post Link para o post Compartilhar em outros sites
Daniloinf 3 Denunciar post Postado Setembro 20, 2010 Se você quiser saber a quantidade de visitas, use essa query: select idLink, COUNT(idLink) as nVisitas from visitas group by idLink order by qt DESC; Essa não vai funcionar. Você está contando um agrupamento. ;) Mas foi o que ele pediu... Eu estou apanhando aqui é para saber quando o link foi mais acessado, já tentei bolar alguma forma de pegar os dados e listar o que tiver mais ips cadastrados, no caso seria o campo idLink que tiver mais vezes repetido. xD Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Setembro 20, 2010 Ah sim, pode usar o GROUP, mas acredito que a cláusula WHERE teria de ser alterada. Quanto ao resultado "2", é por que ele agrupou o número de vezes que o registro é encontrado. Tente usar como o colega de cima falou, e se não funcionar, apenas altere a cláusula WHERE. Até mais. Compartilhar este post Link para o post Compartilhar em outros sites
Chp 0 Denunciar post Postado Setembro 20, 2010 Olá Amigos, Obrigado pelas respostas UltraFastMega Rapidas hehe; Tentei o que o Daniloinf falou, ficou assim: <?php $sql_visitas_clicado = "select idLink, COUNT(idLink) as nVisitas from visitas group by idLink order by idLink DESC LIMIT 0,1; " or die(mysql_error()); $query_visitas_clicado = mysql_query($sql_visitas_clicado) or die(mysql_error()); while ($linha=mysql_fetch_array($query_visitas_clicado)) { $visitas_clicado = $linha["idLink"]; echo $visitas_clicado ; } ?> Retorna o 55. Perfeito! =) Agora uma outra dúvida. Se possivel, claro. Teria como implementar esta query, pra ela mostrar o link mais clicado de uma certa data, por exemplo: O link mais clicado da tabela visitas etá sendo o 55, porem, porem, se eu quiser saber o mais clicado apenas da data de hoje, como ficaria esta query? eu teria que adicionar algo mais na tabela? é complicado? seria possível? Obrigado mais uma vez pelas respostas; Compartilhar este post Link para o post Compartilhar em outros sites
Daniloinf 3 Denunciar post Postado Setembro 20, 2010 ... Teria como implementar esta query, pra ela mostrar o link mais clicado de uma certa data, por exemplo: O link mais clicado da tabela visitas etá sendo o 55, porem, porem, se eu quiser saber o mais clicado apenas da data de hoje, como ficaria esta query? eu teria que adicionar algo mais na tabela? é complicado? seria possível? Sim, basta adicionar um campo que marca a data da visita na tabela Visitas, ai você poderia buscar pela data com uma query mais ou menos assim: select idLink, COUNT(idLink) as nVisitas from visitas where data = '$var_data' group by idLink order by idLink DESC LIMIT 0,1; Tenta fazer ai, qualquer coisa agente te ajuda Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Setembro 20, 2010 Sim, para isso você precisará utilizar Sub-Querys, ou HAVING, ou melhorar essa cláusula WHERE. Por exemplo: ... GROUP BY `idLink` HAVING DATEDIFF(`data`,DATE_FORMAT(NOW(), '%Y-%m-%d')) <= 30 Mas esse exemplo vai agrupar, porém não estará ordenado por data. Caso queira isso, utilize SubQuerys. Compartilhar este post Link para o post Compartilhar em outros sites
Chp 0 Denunciar post Postado Setembro 20, 2010 ... Teria como implementar esta query, pra ela mostrar o link mais clicado de uma certa data, por exemplo: O link mais clicado da tabela visitas etá sendo o 55, porem, porem, se eu quiser saber o mais clicado apenas da data de hoje, como ficaria esta query? eu teria que adicionar algo mais na tabela? é complicado? seria possível? Sim, basta adicionar um campo que marca a data da visita na tabela Visitas, ai você poderia buscar pela data com uma query mais ou menos assim: select idLink, COUNT(idLink) as nVisitas from visitas where data = '$var_data' group by idLink order by idLink DESC LIMIT 0,1; Tenta fazer ai, qualquer coisa agente te ajuda Ok, criei o campo, e mudei o INSERT do link.php, apaguei os registros da tabela visitas para zerar os clicks. cliquei nos links 52 a 57 com um ip e no 56 com outro ip, entao a query mostraria o 56 pois tem 2 ips registrado, porem, esta mostando o 57, é como se a query estivesse mostrando sempre o ultimo registro da tabela visitas; vou postar o codigo inteiro; ao acessar o link.php?id=55 <?php if(is_numeric($_GET['id'])){ $id_select = $_GET['id']; }else{ $id_select = "2"; } $data_visita = date('d/m/Y'); $ip = $_SERVER['REMOTE_ADDR']; $sql = mysql_query("SELECT idLink, ip FROM visitas WHERE idLink='$id_select' AND ip='$ip'") or die(mysql_error()); if(mysql_num_rows($sql) <= '0'){ mysql_query("INSERT INTO visitas (idLink,ip,data_visita) VALUES ('$id_select','$ip', '$data_visita')")or die(mysql_error()); } ?> Mostrando o mais clicado da data 20/10/2010 <?php $var_data = "20/09/2010"; $sql_visitas_clicado = "select idLink, COUNT(idLink) as nVisitas from visitas where data_visita = '$var_data' group by idLink order by idLink DESC LIMIT 0,1;" or die(mysql_error()); $query_visitas_clicado = mysql_query($sql_visitas_clicado) or die(mysql_error()); while ($linha=mysql_fetch_array($query_visitas_clicado)) { $visitas_clicado = $linha["idLink"]; $ip_clicado = $linha["ip"]; $mais_clicado = $visitas_clicado ; } $sql_clicado = "SELECT * FROM links WHERE nm_publicar='sim' AND id_link = '$mais_clicado'" or die(mysql_error()); $query_clicado = mysql_query($sql_clicado) or die(mysql_error()); while ($linha=mysql_fetch_array($query_clicado)) { $id_link_clicado = $linha["id_link"]; $nm_titulo_clicado = $linha["nm_titulo"]; $texto_clicado = $linha["nm_texto"]; $caminho_clicado = $linha['caminho']; $data_clicado = $linha['nm_data']; //data que foi cadastrado e nao que foi clicado $cat_id_clicado = $linha['cat_id']; $link_clicado = $linha['nm_link']; $publicado_clicado = $linha['nm_publicar']; $titulo_clicado = utf8_encode($nm_titulo_clicado); echo" <!--mais clicado --> <div class='mais-clicado-txt-color'>do dia $data_clicado</div> <div class='mais-clicado-img'><a href='link.php?id=$id_link_clicado'><img src='$caminho_clicado' alt='img-mais-clicado' width='207' heigth='102' /></a></div> <div class='mais-clicado-txt'>$nm_titulo_clicado</div> <!---mais clicado--> "; } ?> Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Setembro 20, 2010 Claro amigo, veja bem esse ORDER. Eu disse que estaria incorreto. Você está ordenando pelo MAIOR número idLink, até o menor. Além disso esse where com uma data estipulada por uma função do PHP está meio fajuto. GROUP BY `idLink` HAVING DATEDIFF(`data_visita`,DATE_FORMAT(NOW(), '%Y-%m-%d')) <= 30 Dessa forma ele adiciona ao agrupamento todos os idLink, onde a diferença da data_visita e a data atual seja menor ou igual a 30 (dias). Pode-se mudar para 1, e fica o dia atual. Ou ainda pode-se fazer de forma mais simples: GROUP BY `idLink` HAVING DAYOFMONTH(`data_visita`) = DATE_FORMAT(NOW(), '%d') Dica: if(is_numeric($_GET['id'])){ $id_select = $_GET['id']; }else{ $id_select = "2"; } Troque por isso: $id_select = ((int)$_GET['id']>0) ? (int)$_GET['id'] : 2; Inté! Compartilhar este post Link para o post Compartilhar em outros sites
Chp 0 Denunciar post Postado Setembro 20, 2010 Ok Amigos, Consegui aqui! agora ficou tudo certo, ainda estou fazendo algums testes, mas por enquanto esta tudo ok. Muito obrigado pelo tempo e pela ajuda de voces. Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Setembro 20, 2010 Se possível poste a solução. Outros usuários podem precisar. Até mais. Compartilhar este post Link para o post Compartilhar em outros sites
Chp 0 Denunciar post Postado Setembro 22, 2010 Ahh sim, claro, me desculpem; A solução foi: $sql_visitas_clicado = "SELECT idLink, COUNT(idLink) AS nVisitas FROM visitas WHERE data_visita = '$var_data' GROUP BY idLink ORDER BY nVisitas DESC LIMIT 0,1" or die(mysql_error()); Mudei somente o ORDER BY Compartilhar este post Link para o post Compartilhar em outros sites