Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jak pozbyc sie duplikatów z funkcji rand()
Forum PHP.pl > Forum > PHP
Wescik
Witam!!
Mam problemik, mianowicie nie mam pomysłu jak pozbyć sie duplikatów losowanych za pomoca funkcji rand () z bazy. Chcem wybierac losowo pytania z bazy i nawet to robi ale pytania czasami sie powtarzaja sad.gif. Czy ma ktoś pomysł jak to wykonać. Znajomy mi doradził zeby wylosowane puytanei jakoś trzymac w tablicy tymczasowej ale nie zabardzo wiem jak to zrobić.


[php:1:050845fe6a]<?php
//funkcja zwracajaca ilosc pytan w tabeli
function ile() {
{
$wynik = mysql_query ("SELECT id_pytanie FROM pytanie ;");
$ile = mysql_num_rows($wynik);
}
return $ile;
}
$max=ile();

$id_pytanie=rand(1,$max); // i tu sobie przedzial robie w ktorym losowane sa pytania i tu mam pytanie jak sie pozbyc duplikatów pytan
$zapytanie = 'SELECT tresc FROM pytanie WHERE id_pytanie="'.$id_pytanie.'" ';
$wynik = mysql_query($zapytanie);

if (mysql_num_rows($wynik) == 1)
{
$wiersz = mysql_fetch_array($wynik);
//formularz wyswietlajacy



// a tu sa pobierane odpowiedzi w postaci radio buttonow

$zapytanie = 'SELECT id_odpowiedz, tresc FROM odpowiedz WHERE id_pytanie="'.$id_pytanie.'"';
$wynik2 = mysql_query($zapytanie);

for($i=0; $i<mysql_num_rows($wynik2); $i++)
{
$wiersz2 = mysql_fetch_array($wynik2);
echo ' <tr>';
echo ' <td><input type="radio" name="odpowiedz" value="'.stripslashes($wiersz2['id_odpowiedz']).'"></td>';
echo ' <td>'.stripslashes($wiersz2['tresc']).'</td>';
echo ' </tr>';
}
//itd........
?>[/php:1:050845fe6a]

Dzieki za pomoc :]
rmn
mozesz to zroibć np. za pomocą sesji(tak będzie najprościej i najszybciej:)
a wiec:
:arrow: Poczytaj o sesjach [manual:529c937fef]session[/manual:529c937fef]
:arrow: Zastosuj je do przekazania między kolejnymi stronami z pytaniami tablicy zawierjącej numery pytań już wylosowanych.
Możesz to zrobić np tak:
[php:1:529c937fef]<?php

[php:529c937fef]<?php
<?php
//funkcja zwracajaca ilosc pytan w tabeli
function ile() {
{
$wynik = mysql_query ("SELECT id_pytanie FROM pytanie ;");
$ile = mysql_num_rows($wynik);
}
return $ile;
}
$max=ile();

session_start();//rozpocznij sesje

while(in_array ($id_pytanie=rand(1,$max),$_SESSION['used'])); //losuj tak dlugo az wylosujesz pytanie jeszcze nie uzywane
$_SESSION['used'][] = $id_pytanie; //zapisz pytanie jako uzyte.. koniec:)

$zapytanie = 'SELECT tresc FROM pytanie WHERE id_pytanie="'.$id_pytanie.'" ';
$wynik = mysql_query($zapytanie);

if (mysql_num_rows($wynik) == 1)
{
$wiersz = mysql_fetch_array($wynik);
//formularz wyswietlajacy



// a tu sa pobierane odpowiedzi w postaci radio buttonow

$zapytanie = 'SELECT id_odpowiedz, tresc FROM odpowiedz WHERE
id_pytanie="'.$id_pytanie.'"';
$wynik2 = mysql_query($zapytanie);

for($i=0; $i<mysql_num_rows($wynik2); $i++)
{
$wiersz2 = mysql_fetch_array($wynik2);
echo ' <tr>';
echo ' <td><input type="radio" name="odpowiedz"
value="'.stripslashes($wiersz2['id_odpowiedz']).'"></td>';
echo ' <td>'.stripslashes($wiersz2['tresc']).'</td>';
echo ' </tr>';
}
//itd........
?>
?>[/php:529c937fef]
?>[/php:1:529c937fef]

update musisz jeszcze dodac taka linie po session_start:
[php:1:529c937fef]<?php if(!isset($_SESSION['used'])) $_SESSION['used'] = array();

?>[/php:1:529c937fef] ta linia powoduje, że przy pierwszym pytaniu inicjowana jest tablica , która bedzie przechowywała info o użytych pytaniach.
Wescik
Jeszcze pytanko mam narazie tylko 15 pytan i losuje 5 to rozumiem ze to przez to ze jest duze prawdopodobienstwo wystapienia pytania tak sie muli na lokalhoscie i czasami wyskakuje aaevil.gif
Kod
Fatal error: Maximum execution time of 120 seconds exceeded in




UPDATE TAK dodalem i to wszystko super działa nie owtarzaja sie pytania ale nie moge testu do konca skonczyc bo juz przy 4 pytaniu laduje i jest timeout :x
rmn
hmm to raczej nie to;) bo powiinen losowac przynajmnie 1000razy na sekunde...
UPDATE a dopisałes ta linię która napisałem w updatcie poprzednigo posta?

a wstaw tam gdzies po losowaniu [php:1:97c3623f6f]<?php
print_r($_SESSION['used']);
?>[/php:1:97c3623f6f]i zobacz co dostaniesz z kazdym nastepnym pytaniem.
Wescik
Dodalem podglad i normalnie ladnie wybiera elementy z tablicy. a moze trzeba gdzies na koniec przy wychodzeniu dodac session_unset albo destroy. Bo moze jak wchodze jeszcze raz to sie pula zaciesnia?

UPDATE Dzięki rmn ;] ale na to mi tez moze doradzisz tongue.gif


UPDATE OK dodalem i dziala poprost dochodzi do konca test to sesja zostaje zniszczona
[php:1:7c70608f6a]<?php
session_unset();
session_destroy();
?>[/php:1:7c70608f6a]
rmn
no janse:)

pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.