Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]losowy rekord
Forum PHP.pl > Forum > Przedszkole
kleszczoscisk
Proszę o podpowiedź, jak ugryźć problem: wyświetlanie losowego rekordu z bazy, raz dziennie, czyli od północy do północy przez 24h (albo raz w tygodniu,miesiącu,itp).
Dzięki z góry
Maxik
W nocy odpalasz crona, losuje Ci randem liczbę, zapisujesz ją do bazy i wyświetlasz rekord WHERE liczba=$liczbazbazy
-Pitter-
Od razu mówie że nie wiem czy to będzie działać.

  1. <?
  2. $time = date("H:i");
  3.  
  4. if($time=='23:00')
  5. {
  6. $ile = mysql_num_rows(mysql_query(SELECT * FROM tabela));
  7.  
  8. $rekord = rand(1,$ile);
  9.  
  10. $query = "SELECT * FROM $tbl WHERE id='$rekord'";
  11. $result = mysql_query($query);
  12. $r = mysql_fetch_array($result);
  13. }
  14. ?>
kleszczoscisk
Cytat(Maxik @ 17.10.2008, 15:23:06 ) *
W nocy odpalasz crona, losuje Ci randem liczbę, zapisujesz ją do bazy i wyświetlasz rekord WHERE liczba=$liczbazbazy

Dzięki za odpowiedź, a może tak:
1. w czasie pierwszej po północy odsłony strony skrypt losuje rekord i zapisuje wynik(z datą) do innej bazy czy gdziekolwiek,
2. przez następną dobę , do północy, skrypt sprawdza czy aktualna data = data z rekordu, i jesli tak to wyswietlany jest rekord
3. po północy pkt.1
Co o tym sądzicie?
Bo z Cronem będzie cieżko... :-/
A może w MySQL są jakieś dedykowane rozwiązania?
Maxik
Z Cronem jest prosto, są strony które oferują crona za darmo, wykonują Ci skrypt co określony czas(np. http://www.cronjobs.org/ )

Ustawiasz oddzielne zadanie dla crona i sprawdzasz IP, żeby nikt nie zrobił Ci psikusa. Zrobienie czegoś takiego jest bardzo proste
JarCzeS
tez bym byl za cronem a zapytanie bym tak napisal:
Kod
SELECT * FROM przykladowa_tabela ORDER BY RAND() LIMIT 1


ah i zapytanie te nie bedzie wydajne dla duzych baz danych (kilkanascie tys. rekordow)
kleszczoscisk
Cytat(Maxik @ 17.10.2008, 15:36:34 ) *
Z Cronem jest prosto, są strony które oferują crona za darmo, wykonują Ci skrypt co określony czas(np. http://www.cronjobs.org/ )
Ustawiasz oddzielne zadanie dla crona i sprawdzasz IP, żeby nikt nie zrobił Ci psikusa. Zrobienie czegoś takiego jest bardzo proste

Próbowałem już z cronem, hosting mam taki, ze wszystko musi przechodzic przez administratora. Nie lubię tak :-)
Maxik
JarCzes, ale to wylosuje Ci inny rekord za każdym wywołaniem zapytania, a tu chodzi o wylosowanie raz na dobę.
webasek
Twoje rozwiązanie bez crona wydaje się sensowne smile.gif myślę, że tak można
JarCzeS
z cronem mozesz zrobic tak(nie gwarantuje ze bedzie dzialalo nie sprawdzalem kodu pisze z pamieci):
  1. <?
  2.  $time = date("H:i");
  3.  $data= date("Y-m-d");
  4.  
  5.  $query = "SELECT wartosc FROM cron WHERE data='".$data."'";
  6.  $cron = mysql_fetch_result($query);
  7.  
  8.  if($time>'23:00' and !$cron)
  9.  {
  10.  $query = "INSERT INTO cron VALUES('".$data."',1)";
  11.  $result = mysql_query($query);
  12.  
  13.  $query = "SELECT * FROM przykladowa_tabela ORDER BY RAND() LIMIT 1";
  14.  $result = mysql_query($query);
  15.  $random = mysql_fetch_array($result);
  16.  //i tutaj sobie zapisujesz gdzies ten random nie wiem co z nim chcesz zrobic, nastepnego dnia jest nadpisywany itd
  17.  }
  18.  ?>

warunkiem jest oczywiscie ze ktos wejdzie na strone po 23 kazdego dnia
kleszczoscisk
Takie coś napisałem, wieczorem będę sprawdzał, jak myślicie zadziała ?
  1. <?
  2.    //dzisiejsza data
  3.    $today = date("Y-m-d");
  4.    //zapytanie do bazy dzieła dnia
  5.    $zapytanie=("SELECT * FROM `dzielodnia` WHERE `data`='$today' ");
  6.    $wykonaj=mysql_query($zapytanie);
  7.    //jeśli są wyniki
  8.        if(mysql_num_rows($wykonaj) > 0){
  9.        //wyswietlanie wyników
  10.        }
  11.        else{
  12.        //pobieranie losowego dzieła z bazy, takiego którego nie ma jeszcze w bazie dzieła dnia
  13.        //$zapytanie=("SELECT * FROM `dziela` ORDER BY RAND() LIMIT 1");
  14.        $zapytanie = mysql_query("SELECT * FROM `dziela`  LEFT  JOIN `dzielodnia` ON dziela.id = dzielodnia.dd_id  WHERE dziela.id<>dzielodnia.dd_id ORDER BY RAND() LIMIT 1") or die ('błąd');
  15.        $wykonaj=mysql_query($zapytanie);
  16.        $w = mysql_fetch_array($wykonaj);
  17.            //jeśli jest wynik
  18.            if(mysql_num_rows($wykonaj) > 0){
  19.                $dd_id = $w['id'];
  20.                //dodanie do bazy dzieła dnia rekordu
  21.                $zapytanie2 =  mysql_query("INSERT INTO `dzielodnia` VALUES ('','$dd_id','$today',''$itd'')");
  22.                    if($zapytanie2) { echo 'łokiej';}
  23.                    else { echo 'błąd';}
  24.            }
  25.        
  26.       $zapytanie3=("SELECT * FROM `dzielodnia` WHERE `data`='$today' ");
  27.       $wykonaj3=mysql_query($zapytanie3);
  28.           //jeśli są wyniki
  29.           if(mysql_num_rows($wykonaj3) > 0){
  30.           //wyswietlanie wyników
  31.          }
  32.    }
  33. ?>
JarCzeS
troche to chaotyczne ale mam nadzieje ze zadziala smile.gif gl
kleszczoscisk
Tak zrobiłem i sprawdzałem - działa. Pewnie rozwiązanie z cronem jest normalniejsze, ale jak sądzicie, tak też można? Czy to w złym stylu? (uczę się php i mysql :-))
Pozdrawiam

  1. <?php
  2. //dzisiejsza data
  3.    $today = date(&#092;"Y-m-d\");
  4.    //zapytanie do bazy dzieladnia
  5.    $zapytanie=(&#092;"SELECT * FROM `dzielodnia` LEFT  JOIN `dziela`  ON dzielodnia.dd_id = dziela.id WHERE dzielodnia.dd_data='$today' \");
  6.    $wykonaj=mysql_query($zapytanie);
  7.  
  8.    //jeśli są wyniki pokazuje
  9.        if(mysql_num_rows($wykonaj) > 0){
  10.        //wyswietlanie wyników
  11.        $wn = mysql_fetch_array($wykonaj);
  12.        echo 'OK. Jest dzieło dnia nr '.$wn['id'].'
  13. ';
  14.        }
  15.    //jeśli nie ma    
  16.        else{
  17.                
  18.        //pobieranie losowego dzieła z bazy, takiego którego nie ma jeszcze w bazie dzieła dnia
  19.        $zapytanie2 = (&#092;"SELECT * FROM `dziela`  LEFT JOIN `dzielodnia` ON dziela.id = dzielodnia.dd_id  WHERE dziela.id<>dzielodnia.dzielo_id ORDER BY RAND() LIMIT 1\");
  20.  
  21.        $wykonaj2=mysql_query($zapytanie2);
  22.        $w2 = mysql_fetch_array($wykonaj2);
  23.            //jeśli jest wynik
  24.            if(mysql_num_rows($wykonaj2) > 0){
  25.                //zmienne            
  26.                $did = $w2['id'];
  27.                //dodanie rekordu do bazy dzielodnia
  28.                $zapytanie3 =  mysql_query(&#092;"INSERT INTO `dzielodnia` VALUES ('','$did','$today')\") or die('blad 3');
  29.            }
  30.            // jednorazowy komunikat
  31.            $wn = mysql_fetch_array($wykonaj);
  32.            echo 'OK. Wlasnie wybrałem dzieło dnia. Odśwież tę stronę aby je zobaczyć
  33. ';
  34. }
  35. ?>


edit: źle działa - problem z duplikatami ($zapytanie2) :-|

poprawiam, teraz chyba jest OK:
  1. <?php
  2. $zapytanie2 = (&#092;"SELECT * FROM `dziela`  LEFT JOIN `dzielodnia` ON dziela.id <> dzielodnia.dzielo_id ORDER BY RAND() LIMIT 1\");
  3. ?>

Nie działa :-|

tak też nie działa...
  1. <?php
  2. $zapytanie2 = ("SELECT dziela.id, dzielodnia.dd_dzielo FROM dziela, dzielodnia WHERE dziela.id <> dzielodnia.dd_dzielo ORDER BY RAND() LIMIT 1");
  3. ?>

help!
Jak pobrać z jednej tabeli 'id' taki aby nie było go w drugiej tabeli, po to by go do niej wprowadzić ?
JarCzeS
za linijka
  1. <?php
  2. $wykonaj2=mysql_query($zapytanie2);
  3. ?>

dodaj
  1. <?php
  2. ?>

zobaczy co mu nie pasuje
kleszczoscisk
Cytat(JarCzeS @ 17.10.2008, 21:07:17 ) *
za linijka
  1. <?php
  2. $wykonaj2=mysql_query($zapytanie2);
  3. ?>

dodaj
  1. <?php
  2. ?>

zobaczy co mu nie pasuje

Robiłem :-) Błędów nie ma , zapytanie chyba jest OK ale nie wyklucza dodawania duplikatów.
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.