Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Gelson Design

Como criar um Rand que nao repita os Ids

Recommended Posts

Galera eu fiz um OFFSET na hora de selecionar o banco de dados para que o usuario não retorne mais a pergunta anterior fiz um $SESSION[num_pergunta] = 0;

 

entao no select eu fiz um select * from pergunta limit 1 OFFSET $_SESSION['num_pergunta']" e gostaria de colocar um Rand() porem que nao repita os ids

 

alguem pode me ajudar????

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom cara... tem um estilo meio gambiarroso de fazer ...

 

bom.. vamo fazer assim...

a logica eh o seguinte...

o resutlado da consulta vai tar num while.. intao vamos setar uma variavel fora do while.. e a cada vez q o while for executado.. ele vai inserir a id nessa variavel.. mas isso so vai acontece... se a id ja nao existir...

eh meio dificil de intendei assim.. mas com o codigo fica facil...

 

$usados ='';

 

$conexao = mysql_query("SUA_QUERY'");

while( $list = mysql_fetch_array($conexao))

{

$var = explode(',', $usados);

 

if (in_array($list['id'], $var) == false)

{

$usados .= "{$list[id]}, ";

 

// resto do codigo q vai dentro do while

}

}

esse eh um modo de fazer.. nao o unico.. mas eh um bem facil ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

precisa tomar cuidado com uso disso porque afeta a performance do script

 

ha outras solucoes que podem ser viaveis dependendo do que se pretende fazer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu estou fazendo um questionario de perguntas e resposta que ele apresenta no final da 10 perguntas respondidas quantas errou quantas acertou e os Id's para a pessoa ver qual acertou e qual errou, isso esta pronto.

 

Entao a minha dificuldade esta cendo em fazer o select buscar aleatoriamente do banco de dados pq no inicio do meu questionario eu criei um $SESSION_['num_pergunta'] = 0 ; que vai conferir quantas perguntas o cara ja respondeu que ja foi criado mais abaixo entao no meu select * from perguntas limit 1 OFFSET $_SESSION['num_pergunta']";

 

Fiz isso que como a cada POST que o usuario faz ele acrecenta $_SESSION['num_pergunta'] +=1; entao ele nao consegue mais retornar a pergunta anterior.

 

 

Entao eu preciso de um script ou uma dica de como criar uma funcao e usar junto com o select ou outro lugar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode criar uma array com as ids de perguntas e retirar as ids de perguntas já respondidas, então você sorteia um dos ids do array.

<?php
//Esta função remove itens dum array, pode ser útil
//Os argumentos $alvo e $chaves devem ser arrays com o conteúdo e as caves a serem removidas
function removeItens($alvo, $chaves) {
	  $final = array();
	  foreach($alvo as $chave => $item) {
			if(in_array($chave, $chaves)) contunue;
			$final[] = $item;
	  }
	  return $item;
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

dependendo de como está estruturado isso poderá ser extremamente simples ou extremamente complicado.

 

primeiramente, esses usuários precisam de login pra poder responder as questões ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao cara vou fazer sem login so vou salvar o nome e email no em um banco de dados

isso já é o suficiente.

 

na tabela onde salva nome e email crie um campo ID que será usado como referencia em outra tabela

 

então crie uma nova tabela para armazenar questões já respondidas.

 

tabela questoes_respondidas

- id questao

- id usuario

 

 

sempre que Fulano responder uma questão usando email funalo@foo.com faça uma busca na tabela de usuarios onde o email seja igual a fulano@foo.com. Obtenha o ID e com esse ID você obterá as questões que foram respondidas.

 

é mais seguro do que armazenar em cookies no servidor ou no cliente.

 

quando fizer a busca por questões você poderá criar uma subquery relacionada para filtrar as questões já respondidas

 

exemplo

 

 

execute essas querys.

serão criadas 3 tabelas: questoes, questoes_respondidas e usuarios

logo depois serão incluidos dados de teste

CREATE TABLE questoes (
  id int(3) NOT NULL auto_increment,
  description varchar(200) default NULL,
  PRIMARY KEY  (id),
  UNIQUE KEY id (id),
  KEY id_2 (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO questoes VALUES("1", "questao 1");
INSERT INTO questoes VALUES("2", "questao 2 teste");
INSERT INTO questoes VALUES("3", "questao 3 tes");
INSERT INTO questoes VALUES("4", "questao 4 dsdd");
INSERT INTO questoes VALUES("5", "questao 5 ov klll");

CREATE TABLE questoes_respondidas (
  id int(10) NOT NULL auto_increment,
  questoes_id int(3) NOT NULL default '0',
  usuarios_id int(8) NOT NULL default '0',
  PRIMARY KEY  (id),
  UNIQUE KEY id (id),
  KEY id_2 (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO questoes_respondidas VALUES("1", "1", "1");
INSERT INTO questoes_respondidas VALUES("2", "2", "1");
INSERT INTO questoes_respondidas VALUES("3", "1", "2");
INSERT INTO questoes_respondidas VALUES("4", "4", "1");
INSERT INTO questoes_respondidas VALUES("5", "4", "3");

CREATE TABLE usuarios (
  id int(6) NOT NULL auto_increment,
  usuario_name varchar(50) NOT NULL default '',
  email varchar(100) NOT NULL default '',
  PRIMARY KEY  (id),
  UNIQUE KEY id (id),
  KEY id_2 (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO usuarios VALUES("1", "login1", "a@a.com");
INSERT INTO usuarios VALUES("2", "log2", "b@b.com");
INSERT INTO usuarios VALUES("3", "log3", "c@c.com");

 

 

para testar utilize essa query.

O resultado mostrará apenas as questões não respondidas pelo usuario cujo ID é 1

SELECT * FROM questoes 
WHERE NOT EXISTS(
				SELECT * FROM questoes_respondidas 
					WHERE 
					usuarios_id = 1
					AND 
					questoes.id = questoes_respondidas.questoes_id
				)

 

entendeu ?

 

a otimização depende de como é estruturado o banco de dados e o sistema.

 

 

referência bibliográfica: http://dev.mysql.com

 

dica para pesquisa: "mysql where not in select"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ta mas assim nao vai ser feito a selecao aleatoria das perguntas pq mostrar as perguntas respondidas e nao respondidas, e certas e erradas eu ja fiz

 

so falta fazer a busca aleatoria

Compartilhar este post


Link para o post
Compartilhar em outros sites

so falta fazer a busca aleatoria

se fizer uma estrutura baseada nisso que mostrei basta colocar a instrução

ORDER BY RAND

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim é possível.

 

mas como você pretende fazer ?

 

antecipadamente aconselho a utilizar a forma mais prática.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim so que eu fiz em dois arquivos um que busca do banco e adiciona nas sessions as certas e erradas e ja confere e mostra para o usuario em vermelho a errada e verde a certa.

E se eu for colocar um order by rand() ele busca aleatoria mas nas hora de conferir ele vai conferir pelas 10 primeiras perguntas entende.

 

entao meu problema é buscar aleatorio e conferir por Id da pergunta e eu estou buscando por session e 0 e nao por id

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.