Jump to content


Photo

[resolvido] Rand Sem Repetição


  • Faça o login para participar
14 replies to this topic

#1 knoxville

knoxville

    Backdoor Man

  • Usuários
  • 951 posts
  • Sexo:Masculino
  • Localidade:Itajaí - SC

Posted 16/09/2009, 09:37

fala galera, td certinho?
preciso de uma ajudinha no seguinte...

tenho uma função de select com rand que é pra exibir umas fotos em um site
ao recarregar a pagina, teoricamente ele seleciona outra foto para exibir
as vezes ele acabava selecionando a mesma foto, ai eu fiz uma condiçãozinha pra não repetir a mesma foto, mas ele só nao repete a última:
$y = mysql_query("SELECT * FROM fotos ORDER BY rand()") or die(mysql_error());
if (mysql_result($y,0,"id") == $_SESSION['ultima']): $selecionar = "1"; else: $selecionar = "0"; endif;
$arquivo = mysql_result($y,$selecionar,"arquivo");

o que quero fazer é o seguinte...
ao invés de gravar somente o ultimo id selecionado na session, quero gravar uma a uma, conforme vai abrindo
ao fazer o select na tabela, ele vai procurar por todos menos os que estao nessa session (como uma array) e somente quando já tiver exibido todas as fotos, ele vai poder repetir uma que já tenha mostrado!

talvez ajude a entender o que eu quero vendo a idéia do site: http://www.mamados.com.br/

alguém saberia me ajudar? pesquisei bastante sobre isso e nada! :(

muito obrigado!

----- editado

a idéia é mais ou menos essa, só não sei exatamente como por isso em códigos, já que sou iniciante em php e não conheço bem as funções:

select * from fotos order by rand() where id!=SESSION (????)
if mysql_num_rows != 0 {
session = session,nova_id
echo ...
} else {
session = ""
volta pro select
}


obrigado!

Edição feita por: maykel, 16/09/2009, 13:51.
Adição de [resolvido] no título :}


#2 MBA

MBA

    24 Horas

  • Usuários
  • 412 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte
  • Interesses:Desenvolvimento WEB

Posted 16/09/2009, 09:46

Bom dia amigo.
Tudo bom?

Não sei se vai dar certo mas uma coisa que pode tentar é gravar as id em forma de array.
Por exemplo :
[codebox]$_SESSION["lastId"][] = $id;[/codebox]

Assim você terá todas as fotos que já foram exibidas.
Outra dica é limitar essa exibição pela query.
[codebox]
$y = mysql_query("SELECT * FROM fotos WHERE id NOT IN ({lista de ids já selecionados}) ORDER BY rand()") or die(mysql_error());
[/codebox]

Para fazer uma lista com o array da SESSION você pode usar o implode. (Não sei se vai precisar)

Outra coisa, limitando pela query você deve testar se já foram exibidas todas as fotos porque se já foram exibidas todas as fotos o array deve ser resetado...
No contrário a query não vai encontrar nada e ai não será exibida nenhuma foto.

Espero ter ajudado e se não der certo ou ainda tiver alguma dúvida, volte a postar ai.

Abraços.
Mateus
Mateus Antunes
MBASistemas

#3 MarcoviZ

MarcoviZ

    ubuntu for human being

  • Usuários
  • 1137 posts
  • Sexo:Não informado

Posted 16/09/2009, 09:54

Tipo, fiquei atualizando o site varias vezes, e ele repete as imagens mesmo antes de chegar no final, n repetiu nenhuma vez a mesma seguida, mas acho que nesse site ele só da um rand mesmo.

bom, mas vamos para teu caso.

quando selecionar a imagem, salva a id dela em uma session.
pode fazer uma string simples, separando os valores por "," virgula, ex: 1,20,23,11,65,2

ai você na consulta faz assim:

SELECT * FROM fotos WHERE codigo not in ('.$codigos_passados.') ORDER BY RAND();

você também vai precisar fazer um count na tabela e ver qtos registros tem, se o total de registros for o total de ids salvas, limpa a sessão.

[]'s


----
Estou lendo seus pensamentos né Mateus!
hehe, a nossa lógica foi igual...

[]'s

Edição feita por: MarcoviZ, 16/09/2009, 09:56.

[]'s

#4 MBA

MBA

    24 Horas

  • Usuários
  • 412 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte
  • Interesses:Desenvolvimento WEB

Posted 16/09/2009, 10:05

Ficou até engraçado...
Pensamos bem igual!

=D

huauhauhauha

Abraços ai!
Mateus Antunes
MBASistemas

#5 knoxville

knoxville

    Backdoor Man

  • Usuários
  • 951 posts
  • Sexo:Masculino
  • Localidade:Itajaí - SC

Posted 16/09/2009, 10:20

grande, MBA e MarcoviZ!!! MTO OBRIGADO!

consegui...
$exibidas = substr($_SESSION['exibidas'], 0, -1);
 if ($exibidas != "") {
  $y = mysql_query("SELECT * FROM fotos WHERE id NOT IN ($exibidas) ORDER BY rand()") or die(mysql_error());
 } else {
  $y = mysql_query("SELECT * FROM fotos ORDER BY rand()") or die(mysql_error());
 }
 if (mysql_num_rows($y) == "0") {
  $_SESSION['exibidas'] = "";
  $y = mysql_query("SELECT * FROM fotos ORDER BY rand()") or die(mysql_error());
 }
}
$arquivo = mysql_result($y,0,"arquivo");
$id = mysql_result($y,0,"id");
$_SESSION['exibidas'] = $_SESSION['exibidas'].$id.",";
funcionou, mas eu achei q tá mto gambiarra e cheio de if, acredito que tenha alguma forma de deixar esse code mais enxuto, será q tem?

obrigado!

Edição feita por: knoxville, 16/09/2009, 10:24.


#6 MBA

MBA

    24 Horas

  • Usuários
  • 412 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte
  • Interesses:Desenvolvimento WEB

Posted 16/09/2009, 10:24

Que bom que deu certo.

Vamos lá:
[codebox] if ($exibidas != "") {
$y = mysql_query("SELECT * FROM fotos WHERE id NOT IN ($exibidas) ORDER BY rand()") or die(mysql_error());
} else {
$y = mysql_query("SELECT * FROM fotos ORDER BY rand()") or die(mysql_error());
}[/codebox]

Isso não precisa porque se não tiver nada no $exibidas, ele fará um NOT IN() e isso não tem problema.
Retirando esse pedaço já da uma limpada no código.

Abraços e até a próxima!
Mateus

--
Editando...

Tem problema sim!
Você tem que jogar um NOT IN ('')
Ai fica legal!

Edição feita por: MBA, 16/09/2009, 10:27.

Mateus Antunes
MBASistemas

#7 knoxville

knoxville

    Backdoor Man

  • Usuários
  • 951 posts
  • Sexo:Masculino
  • Localidade:Itajaí - SC

Posted 16/09/2009, 10:40

hmmm
é, eu fiz todo aquele if porque tinha dado problema! hehe...
mas agora colocando '' deu certinho
otimizou legal :D

esse é meu grande problema... codes mto grandes pq eu não conheço bem a linguagem! :/

MUITO OBRIGADO MBA E MarcoviZ!!
e que tal também se cadastrarem e mandarem umas fotos?!?! ;) hehe

abraços! obrigado mesmo!

Edição feita por: knoxville, 16/09/2009, 10:40.


#8 MarcoviZ

MarcoviZ

    ubuntu for human being

  • Usuários
  • 1137 posts
  • Sexo:Não informado

Posted 16/09/2009, 10:45

knoxville

De nada, sempre que precisar estamos ai...

obs: não bebo
srsrs

mas se eu achar algo mando sim ;-)

[]'s
[]'s

#9 knoxville

knoxville

    Backdoor Man

  • Usuários
  • 951 posts
  • Sexo:Masculino
  • Localidade:Itajaí - SC

Posted 16/09/2009, 10:52

problemas...
depois que coloquei os '' ele nao está mais funcionando o WHERE... entao continua repetindo! :(
preciso transformar o tipo de variavel ou alguma coisa assim?

#10 MBA

MBA

    24 Horas

  • Usuários
  • 412 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte
  • Interesses:Desenvolvimento WEB

Posted 16/09/2009, 11:00

Execute isso:
$exibidas = implode("','",$_SESSION["exibidas"]);$y = mysql_query("SELECT * FROM fotos WHERE id NOT IN ('$exibidas') ORDER BY rand()") or die(mysql_error());
Esse bloco vai deixar o seu $exibidas no padrão -> 1','2','3 por exemplo.
O que acontece é que na query já tem os aspas inicial e final deixando assim : '1','2','3'.
E se não tiver nada ficam só os aspas inicial e final fazendo o vazio ''.

Acho que vai dar certo mas para falar a verdade não tentei!

E outra coisa: Eu bebo!
=D

Vou postar umas fotos lá!

Abraços
Mateus Antunes
MBASistemas

#11 knoxville

knoxville

    Backdoor Man

  • Usuários
  • 951 posts
  • Sexo:Masculino
  • Localidade:Itajaí - SC

Posted 16/09/2009, 11:41

MBA, nao deu! :(
Warning: implode() [function.implode]: Invalid arguments passed in C:\xampp\htdocs\mamados\index.php on line 20
*antes a session tava só separando por virgula, ai coloquei as ' tb

#12 MBA

MBA

    24 Horas

  • Usuários
  • 412 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte
  • Interesses:Desenvolvimento WEB

Posted 16/09/2009, 11:45

Vish....
Então volta para o que estava antes =D

Feião mas estava dando certo!

Abraços
Mateus Antunes
MBASistemas

#13 knoxville

knoxville

    Backdoor Man

  • Usuários
  • 951 posts
  • Sexo:Masculino
  • Localidade:Itajaí - SC

Posted 16/09/2009, 11:51

hehe
consegui! \o/
as 3 linhas mais importantes:
$exibidas = substr($_SESSION['exibidas'], 1, -2);
$y = mysql_query("SELECT * FROM fotos WHERE id NOT IN ('$exibidas') ORDER BY rand()") or die(mysql_error());
$_SESSION['exibidas'] = $_SESSION['exibidas']."'".$id."',";
:D

#14 MBA

MBA

    24 Horas

  • Usuários
  • 412 posts
  • Sexo:Masculino
  • Localidade:Belo Horizonte
  • Interesses:Desenvolvimento WEB

Posted 16/09/2009, 12:00

Boa...
Já sei até o porque que o meu não deu certo!
O implode é para array...
Se você está fazendo com string vai dar errado mesmo!

=D

Adiciona o [resolvido] depois ai!

Abraços
Mateus Antunes
MBASistemas

#15 knoxville

knoxville

    Backdoor Man

  • Usuários
  • 951 posts
  • Sexo:Masculino
  • Localidade:Itajaí - SC

Posted 30/09/2009, 15:17

solução muito mais fácil...


<?
session_start();
include "config.php";

if(!isset($_GET["pagina"])) { $pagina = "1"; } else { $pagina = $_GET["pagina"]; }

$inicio = $pagina - 1;

$z = mysql_query("SELECT * FROM fotos") or die(mysql_error());
$total = mysql_num_rows($z);

if($total <= 0) {
	echo "<center>Nenhum registro encontrado.</center>";
} else {
	if (isset($_SESSION["seed"])) { $seed = $_SESSION["seed"]; } else { $seed = rand(); $_SESSION["seed"] = $seed; }
	$y = mysql_query("SELECT * FROM fotos ORDER BY RAND($seed) LIMIT $inicio,1") or die(mysql_error());
	echo "<img src=\"fotos/".mysql_result($y,0,"arquivo")."\"><BR>";
	$menos = $pagina - 1;
	if ($menos==0) { $menos = $total; }
	$mais = $pagina + 1;
	if ($mais>$total) { $mais = "1"; }
	echo "<a href=\"?pagina=$menos\">anterior</a>";
	echo " <a href=\"?pagina=$mais\">próxima</a>";
}
?>
feita em forma de paginação! ;)

também pode ser feito sem o LIMIT...

if (isset($_SESSION["seed"])) { $seed = $_SESSION["seed"]; } else { $seed = rand(); $_SESSION["seed"] = $seed; }
$y = mysql_query("SELECT * FROM fotos ORDER BY RAND($seed)") or die(mysql_error());
$total = mysql_num_rows($y);
$menos = $id - 1;
if ($menos==0) { $menos = $total; }
$mais = $id + 1;
if ($mais>$total) { $mais = "1"; }

$arquivo = mysql_result($y,[b]$row[/b],"arquivo");

:D




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq