Ir para conteúdo
Fórum Script Brasil
  • 0

ajuda com rand()


buh

Pergunta

galera preciso selecionar usuarios que contem blog e imprimir apenas 5 so que entre esses 5 ele vai ficar alternando.

tem uns 15 usuarios com blog so quero que imprima 5 na tela e que fica alternando entre os 15 ou seja vai aparecer 5 quando atualizar vai aparecer outros 5 entre os 15 aleatoriamente

fiz o seguinte

$sql = "SELECT * FROM usuarios WHERE blog='sim' order by rand() LIMIT 5";

tem hora que ele imprime 2 usuarios somente tem hora que imprime 1 eu quero que sempre imprima 5 isso é possivel ??

e por que ele faz isso?? não deveria imprimir exatamente 5 sempre???

vlww

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

deu erro

parece que mesmo tirando o rand() ele faz isso nunca imprime exatamente 5

ta muto estranhu

olha so tirando o rand() ele mostra so 1

tenho 2 tabelas..

1 de usuarios e a outra com informações do blog

eu conhectei nas duas tabelas uma pra pegar a foto do usuario e o nome e a outra pra pegar o titulo da ultima postagem

$sql = "SELECT * FROM usuarios WHERE blog='sim' ORDER BY RAND() LIMIT 5"; 

$result = mysql_query($sql) or die ("erro");

while(){
dados do usuario

$sql1 = "SELECT * FROM blog_posts WHERE ver='sim' AND autor='$id_autor' ORDER BY data DESC LIMIT 1";

    $result1 = mysql_query($sql1) or die ("erro blog");

dados do blog referente ao usuario

inprime tudo mostrando so 5 mais ai que é problema

}

sera que da pra entender melhor e ajudar a achar uma solução??

Link para o comentário
Compartilhar em outros sites

  • 0

intão vamos ser forçados a enjambrar um esqueminha ai...

suponho que cada usuario desse tenha um campo id no banco de dados, não é??

então você poderia primeiro gerar o numero das ids e depois pegar seu resectivo usuario...

$ids = array(rand(valor_minimo,valor_maximo),rand(min,max),rand(min,max),rand(min,max),rand(min,max));

/* os valores gerados serão a id dos usuarios no BD, se você não sabe o valor_maximo, eu aconselho a criar um campo no BD, que é incrementado cada vez que um usuario é cadastrado, e então usar aquele valor como valor maximo... */

depois pegue cada um e liste...

for($i=0;$i>=5;$i++) {

$sql = "SELECT FROM usuarios WHERE blog='sim' AND id = $ids[$i]";

$dados = mysql_query($sql);

//lista...

}//depois repete, com a próxima id

porém, haveria o problema de repetição de ids... que pode ser resolvido se criarmos uma função que checa isso e se há algum valor repetido um desses valores é setado a valor+1, caso valor+1 seja maior que o valor_maximo, o valor fica sendo 1, alguma hora haveria de não ter numeros repetidos...

é claro, apenas uma engenhoca doida, se você tiver afim de usa-la diz ai que dai agente ve essa função...

Editado por Scripter
Link para o comentário
Compartilhar em outros sites

  • 0

ex:

supondo que em alguma tabela do seu banco de dados, dizendo quantos usuarios com blog você tem, vamos supor, 17 usuarios, eu posso supor então que na tabela dos usuarios com blog cada um enha uma id, entre 1 e 15... você pega esse valor, e com ele nós geramos uma array com 5 elementos (index 0 ao 4), cada 1 contendo 1 numero entre 1 (ou 0, você escolhe) e o o total de usuarios com blog, que é a ID do usuario...

e dai com essa id nós pegamos cada usuario...

porém pensando melhor... eu já desaprovo minha própria ideia, pois haveriam muitas possibilidades de furos... ex, na tabela, existem 17 linhas, linha 1, com id 2 (pois por algum motivo, a linha que havia antes dessa, a linha 1 original, foi deletada...), então se pegarmos a id 1, já daria erro...

vou pensar um pouco mais e depois dou uma resposta...

Editado por Scripter
Link para o comentário
Compartilhar em outros sites

  • 0

isso ai, pesquisei um pouco mais e arranjei a solução (não enjambrada =D)

mantenho aqui a idéia que cada um desses usuarios tenha uma id própria no BD...

o campo dizendo quantos usuarios você tem não é mais necessário...

você faria assim..

$ids = array(); //nossa array com as ids...

$i = 0; //você já vai entender

$sql = "SELECT * FROM usuarios WHERE blog='sim'";

$dados = mysql_query($sql);

while($row = mysql_fetch_array($dados, MYSQL_ASSOC)) {

$ids[$i] = $row[id];

$i++;

}

assim teremos TODAS as ids nessa array...

agora é que vem a parte legal...

shuffle($ids); //simplesmente embaralha ALEATORIAMENTE a array...

agora é simples:

for($j=0;$j>=5;$j++) {

$sql2 = "SELECT * FROM usuarios WHERE id='$ids[$j]'";

$dados2 = mysql_query($sql2);

while($row = mysql_fetch_array($dados2,MYSQL_ASSOC)) {

//mostra o que você quer a respeito do usuario...

}

} /*repete o for novamente até completar 5 saidas de dados, usando as 5 primeiras ids da array ids, que serão sempre aleatorias... */

e sem possibilidade de erro, pois as ids usadas são pegas diretamente da tabela, e só depois ordenadas...

qlqr coisa posta ai ^^ fiquei até orgulhoso de mim mesmo *-*

Editado por Scripter
Link para o comentário
Compartilhar em outros sites

  • 0

so por desencargo de conciencia hahaha da uma olhada ve se o que eu fiz esta certo.. o codigo todo na integra..

é porque tipo não deu erro algumm mais não imprimiu nada o que eu errei dessa vez?

$ids = array(); //nossa array com as ids...
$i = 0; //você já vai entender
$sql = "SELECT * FROM usuarios WHERE blog='sim'";

$dados = mysql_query($sql);

while($row = mysql_fetch_array($dados, MYSQL_ASSOC)) {
$ids[$i] = $row[$id];
$i++;
}
shuffle($ids); //simplesmente embaralha ALEATORIAMENTE a array...
for($j=0;$j>=5;$j++) {
$sql2 = "SELECT * FROM usuarios WHERE id='$ids[$j]'";
$dados2 = mysql_query($sql2);
while($row1 = mysql_fetch_array($dados2,MYSQL_ASSOC)) {
//mostra o que você quer a respeito do usuario...
$id_autor = $row1["id"];
    $cargo = $row1["cargo"];
    $nome = $row1["nome"];
    $foto = $row1["foto"];
    

$sql1 = "SELECT * FROM blog_posts WHERE ver='sim' AND autor='$id_autor' ORDER BY data DESC LIMIT 1";

    $result1 = mysql_query($sql1) or die ("Não foi possível realizar a consulta ao banco de dados");

$linha1=mysql_fetch_array($result1);

        $var_id = $linha1["id"];
        $titulo = $linha1["titulo"];
        $data = $linha1["data"];
        
        $titulo_abreviado=$titulo;
        for ($txt=0;$txt<=30;$txt++){
        $titulo_abreviado.=$titulo[$txt];
        };
        
        if($titulo!=""){

        echo "<div class='quadro_blog'><a href='blog.php?submenu=3&indiv=$var_id'><img  class='foto_prof' src='foto_usuarios/$foto' alt='$cargo $nome' width='42' border='0'><span class='tit_quadro'>$cargo $nome</span></a><br>$titulo <a href='blog.php?submenu=3&indiv=$id_autor' style='font-size:2px'><strong>(...)</strong></a></div>";
    
        }
    
} /*repete o for novamente até completar 5 saidas de dados, usando as 5 primeiras ids da array ids, que serão sempre aleatorias... */

}

Link para o comentário
Compartilhar em outros sites

  • 0

você colocou coisa aonde não devia:

while($row = mysql_fetch_array($dados, MYSQL_ASSOC)) {

$ids[$i] = $row[$id];

$i++;

}

na parte de incrementar a array com as ids, você colocou $row[$id], quando é apenas $row[id]...

Link para o comentário
Compartilhar em outros sites

  • 0

agora deu certo mais por incrivel que pareçaa ta ACONTECENDO A MESMA coisa hahahaha as vezes imprime nada.. ai você atualiza as vezes aparece 1 atualiza as vezes aprece 2 ou 3 mudo o codigo mais ta tendo o mesmo efeito ..

caracaa sera que num tem concerto?

skopskspo

Link para o comentário
Compartilhar em outros sites

  • 0

seu cod funfo certinho.. mesmo não usando o rand() ele ta fazendo o randon mais ainda não ta mostrando 5 resultados parece que faz randon tanto nas informações quanto no numero de informações igual tava antes

Link para o comentário
Compartilhar em outros sites

  • 0

não temuma outra maneira que eu force a mostra exatamente cinco

eu nunca vi isso serio mesmo nem sem o rand() ele me mostra sim se limitei o numero de resultados para 5 por que ele vai ficar me mostrando 1 ou 3 ou 2 mudando esse numero de acordo com a atualização todas as outras vezes que limitei me retornou exatamente o que pedi.. e a logica não deveria ser essa?? hahaha to ficando de saco cheio com esse php hahahaahaaha mais é eu gosto de trampa com isso

queria uma outra maneira tipo

<div>primeiro resultado</div>

<div>segundo resultado</div>

<div>terceiro resultado</div>

<div>quarto resultado</div>

<div>quinto resultado</div>

pronto não tem como ele mi mostrar menos ou mais que cinco ..... mais como eu faço isso??

vlw

Link para o comentário
Compartilhar em outros sites

  • 0

bem, dentro da parte lógica do assunto, você coloca o <div> dentro do while que pega os dados do banco... maneiras de se fazer aparecer primeiro, segundo, terceiro tem muitas, você pode criar umas variavel e coloca-la valor 1, depois dentro do while você da um if e verifica o valor da variavel... ou até mesmo um switch... depois sóh faiz o correspondendente a cada um... ex:

$k = 1;

while($row=mysql_fetch_array($resultados,MYSQL_ASSOC)) {

switch($k) {

case 1 :

echo "<div>Primeiro";

$k++;

break;

case 2:

echo "<div>Segundo";

$k++;

break;

case 3:

echo "<div>Terceiro";

$k++;

break;

case 4:

echo "<div>Quarto";

$k++;

break;

case 5:

$k++;

echo "<div>Quinto";

break;

default:

echo "algo errado...";

$k = 1; //corrige o erro se tem algum

}

//segue mostrando o que precisa dentro de cada div...

echo "</div>" fecha a div atual e repete o while para começar uma nova

}

Editado por Scripter
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...