Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Rand bez częstych powtórzeń
miccom
post 26.04.2020, 17:24:10
Post #1





Grupa: Zarejestrowani
Postów: 493
Pomógł: 8
Dołączył: 7.07.2007
Skąd: Tychy

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


Cześć.
Chce zrobić rotator banerów na mojej stronie, ale mam jedną zagwozdkę.

RAND() rozwiązałoby problem, ale jeśli mam np. 3 rekordy w bazie to może rand losować mi cały czas jeden rekord lub "częściej" a ja chciałbym aby mi losował wszystkie banery w miarę po równo.

Kombinuję aby losował mi ORDER BY RAND(), wylosowany rekord otrzyma np. rekord do bazy `rander`=1, zapytanie losuje rekordy where `rander`=0 wiec każdy baner w bazie zostanie wyświetlony raz, ale jak zapełnię we wszystkich rekordach `rander` na 1... to jak potem odwrócić aby z kolei szukał po `rander` = 1 i po wyciągnięciu rekordu zmieniał `rander`= 0 i tak w kółko ?
Da się tak to zaprogramować?

Nie wiem czy dobrze wytłumaczyłem o co mi chodzi:)


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
nospor
post 26.04.2020, 17:47:01
Post #2





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Cytat
Da się tak to zaprogramować?

Dodajesz pole w bazie, ustawiasz na 1 gdy sie wylosuje a losujesz tylko z rekordow co maja to pole 0. W czym problem?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
miccom
post 26.04.2020, 18:24:38
Post #3





Grupa: Zarejestrowani
Postów: 493
Pomógł: 8
Dołączył: 7.07.2007
Skąd: Tychy

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


No ale jak dam pole na 1 to kiedyś się skończą pola 0 smile.gif

Jak zrobić inteligentne zapytanie aby wybierało pola 0 a jak te się skończą to przeszło do pola 1? smile.gif

Na razie mam taka funkcję, pośrednio działa, niestety nalicza mi co dwa disp- i nie wiem dlaczego smile.gif

  1. public function shuffleBaner( $blockID ){
  2. // sprawdzam, ile jest z rek 0, jesli nie ma- to liczę rekord 1 ;)
  3. $dispNum0 = $this -> db -> query('SELECT count(*) as `counted` FROM `banerData` WHERE `dataEnd`>'. $this -> init -> time .' AND `placeID`='.$blockID.' AND`dispNum`=0')->fetch();
  4. if( $dispNum0['counted'] == 0 ){
  5. $this -> db -> exec('UPDATE `banerData` SET `dispNum`=0 ');
  6. $rows = $this -> db -> query('SELECT * FROM `banerData` WHERE `dataEnd`>'. $this -> init -> time .' AND `placeID`='.$blockID.' AND `dispNum`= 0 AND ( `dispEnd` > `disp` ) LIMIT 1')->fetch();
  7. $this -> db -> exec('UPDATE `banerData` SET `dispNum`=1, `disp`=( `disp`+1 ) WHERE `id`='.$rows['id'].' ');
  8. $bg = '<a href="'. $rows['destAddress'] .'"><img src="'. $rows['bannerPath'] .'" alt="Chcesz mieć tutaj swoją reklamę? Dodaj swój baner! '. $rows['disp'] .' "/></a>';
  9. }else{
  10. $rows = $this -> db -> query('SELECT * FROM `banerData` WHERE `dataEnd`>'. $this -> init -> time .' AND `placeID`='.$blockID.' AND `dispNum`= 0 AND ( `dispEnd` > `disp` ) LIMIT 1')->fetch();
  11. $this -> db -> exec('UPDATE `banerData` SET `dispNum`=1, `disp`=( `disp`+1 ) WHERE `id`='.$rows['id'].' ');
  12. $bg = '<a href="'. $rows['destAddress'] .'"><img src="'. $rows['bannerPath'] .'" alt="Chcesz mieć tutaj swoją reklamę? Dodaj swój baner! '. $rows['disp'] .' "/></a>';
  13. }
  14. return $bg;
  15. }


Ten post edytował miccom 26.04.2020, 18:30:49


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
trueblue
post 26.04.2020, 18:31:38
Post #4





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Kiedy skończą się pola "0", to wiesz, że masz ustawić ponownie wszystkie na "0".

Jeśli nie zależy Ci na takiej samej losowości u każdego użytkownika, to:
1. Wybierz wszystkie bannery, przetasuj je i zapisz w sesji.
2. Podczas wyświetlania wybierz pierwszy z tablicy i usuń.
3. Kiedy tablica będzie pusta, to wracasz do 1.


--------------------
Go to the top of the page
+Quote Post
miccom
post 4.06.2020, 19:34:37
Post #5





Grupa: Zarejestrowani
Postów: 493
Pomógł: 8
Dołączył: 7.07.2007
Skąd: Tychy

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


No dureń jestem smile.gif

Niepotrzebnie zajmuję się pierdołami:)
Przecież mogę wybierać rekord ORDER BY disp ASC i będzie mi wybierał zawsze rekord z najmniejszym disp smile.gif czyli nawet jak będą dwa banery- to będą się wyświetlać raz jeden a raz drugi:)

Czyż nie tak?


Ale mimo to, nadal dodaje mi po dwa disp... choć w kodzie jest
  1. $rows = $this -> db -> query('SELECT * FROM `banerData` WHERE `dataEnd`>'. $this -> init -> time .' AND `placeID`='.$blockID.' AND ( `dispEnd` > `disp` ) ORDER BY disp ASC LIMIT 1')->fetch();
  2. $this -> db -> exec('UPDATE `banerData` SET `disp`=( `disp`+1 ) WHERE `id`='.$rows['id'].' LIMIT 1');


Choć jednak nie jest to takie piękne ;/

Jak zaplanować zapytanie, aby losowało mi z bazy danych banery które mają ustawiony rekord np. display = 0, każdemu wyświetlonemu zapisujemy display=1, a jak te z display=0 się skończą to zapytanie wyszuka display = 1 a po wyświetleniu zapisze display=0, i dopiero jak wszystkie zostaną wyświetlone z display=1 to znowu wracamy do display=0 ?

Najprościej myślę, żeby sprawdzić ile jest rekordów z wartością display = 0, i jeśli są większe niż 0 to losować baner WHERE display = 0, jeśli nie będzie już tych z display=0- to losować z display=1

Ale wtedy z kolei jak raz zmienimy na display=1... to w kółko będą się wyświetlać dwa banery sad.gif

Macie jakieś propozycje jak nie powtarzać banerów?

Ten post edytował miccom 26.04.2020, 18:44:41


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
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 Wersja Lo-Fi Aktualny czas: 28.03.2024 - 10:09