Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Losowanie dwóch obrazków
Forum PHP.pl > Forum > Przedszkole
Watt
Witam,

Jednym z modułów na mojej stronie jest losowanie dwóch randomowych obrazów, po odświeżeniu strony losują sie kolejne 2 obrazki na mysql RAND() - pytanie jak zrobić, aby to nie były te same obrazki. (Wiadomo, jak jst mało obrazów to zaczną sie powtarzać) Myślałem żeby zapisać już wylosowane w formie ciasteczka i zapisywać tam ID dwóch obrazków np:
Kod
43 - 32
65 - 89
.
.
.

itd. Pytanie jak zrobić sensowny warunek w mysql, żeby coś takiego zadziałało majac takie zapytanie:
Kod
SELECT * FROM obrazki ORDER BY RAND() LIMIT 2
Musiałbym zrobić coś takiego
Kod
SELECT * FROM obrazki WHILE (id != 43 AND id != 32) OR (id != 65 AND id != 89) [itd..] ORDER BY RAND() LIMIT 2

Jest na to jakaś lepsza metoda?
punoljoe
ja bym pobrał z tabeli info ile jest elementów, potem uruchomił pętlę w php z wyborem dwóch liczb z danego zakresu(od 1 do maks ilości elementów) oczywiście sprawdzając warunek czy się nie powtórzyły i potem pobrał dwa zdjęcia o wylosowanych indeksach. ... napiszę Ci to... momento...


<?php

$sql="SELECT max(id_zdjec) FROM zdjecia";
$wynik=@mysql_query($sql);
if (!$wynik) {
exit (' blad podczas pobierania informacji z bazy danych a');
}
while ($row=mysql_fetch_array($wynik) ) {
$ilosc_zdjec=$row['max(id_zdjec)'];
}
$i=0;
$foto1=rand($ilosc_zdjec);
do {
$foto2=rand($ilosc_zdjec);
if ($foto1!=$foto2) { $i=99; }
} while ($i !=99);

// jesli wiecej zdjeć to zrób zmienną tablicową



i teraz pobierz zdjęcia o indeksie $foto1 i $foto2

?>


do zastosowania jeśli zdjęcia dodawane są do kolumny gdzie indeksujesz auto_increment , bez dziur w numeracji
b4rt3kk
  1. SELECT * FROM obrazki WHERE id NOT IN ('1','2','3','4','5') ORDER BY RAND() LIMIT 2


w wersji php:

  1. $tablica_wylosowanych_juz_id = array(1,2,3,4,5);
  2. $query = "SELECT * FROM obrazki WHERE id NOT IN (".implode(',', $$tablica_wylosowanych_juz_id).") ORDER BY RAND() LIMIT 2";
Watt
Super!
Tylko jedno pytanie czy można tak zrobić, żeby obrazek nie mógł się powtarzać z obrazkiem, który był już wyświtelony? Czyli mamy obrazki A, B, C, D
Pojawiła sie kombinacja:
A - B,
więc nie chce aby pojawiła się już A - B i B - A, za to mogą pojawić się kombinacje np. A - C, B - D, D - A itd.
punoljoe
moim sposobem możesz wprowadzić numery, które były do bazy (nowej tabeli) bądź pliku i potem sprawdzać... inaczej raczej tego nie zrobisz... musisz zapisać gdzieś kombinacje jakie były (numery id zdjęć) i potem nie dopuścić do powtórki.

np. tabela (id_kombinacji int(10) not null unsigned primary_key auto_inc ;
id_one int (10) not null unsigned;
id_two int(10) not null unsignek)

wpisujesz rekord do tej tabeli, gdy wyświetlasz zdjęcia a następnie przed wyświetleniem kolejnej kombinacji sprawdzasz numer z jedną kolumną (np. id_one) jeśli jest zgodność to potem z id_two dla danych rekordów... i już wiesz, wyświetlasz lub losujesz ponownie i znów sprawdzasz...
b4rt3kk
To już niestety w takim wypadku trzeba by pary zapisać.

  1. // na początek wylosowanie dowolnego obrazka, nie ważne czy już był
  2. $query = "SELECT * FROM obrazki ORDER BY RAND() LIMIT 1";
  3. // teraz trzeba dolosować mu parę
  4. $query = "SELECT * FROM obrazki WHERE id NOT IN ('id_z_poprzedniego_zapytania', 'id_sparowanych_z_poprzednim_id') ORDER BY RAND() LIMIT 1";
  5. // takie kombinacje mogą się skończyć także najlepiej opakować dwa powyższe zapytania w funkcję i losować do skutku
  6. // można to zrobić jednym zapytaniem również, ale to już więcej kombinowania
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.