Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Losowanie dwóch obrazków
Watt
post
Post #1





Grupa: Zarejestrowani
Postów: 372
Pomógł: 1
Dołączył: 13.06.2008

Ostrzeżenie: (0%)
-----


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?

Ten post edytował Watt 30.10.2012, 19:42:02
Go to the top of the page
+Quote Post
punoljoe
post
Post #2





Grupa: Zarejestrowani
Postów: 52
Pomógł: 2
Dołączył: 4.07.2008

Ostrzeżenie: (30%)
XX---


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

Ten post edytował punoljoe 30.10.2012, 19:48:42
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #3





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


  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";


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
Watt
post
Post #4





Grupa: Zarejestrowani
Postów: 372
Pomógł: 1
Dołączył: 13.06.2008

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Watt 30.10.2012, 20:49:30
Go to the top of the page
+Quote Post
punoljoe
post
Post #5





Grupa: Zarejestrowani
Postów: 52
Pomógł: 2
Dołączył: 4.07.2008

Ostrzeżenie: (30%)
XX---


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...

Ten post edytował punoljoe 30.10.2012, 21:00:00
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #6





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 18:25