Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Wyciąganie losowego rekordu z bazy
Forum PHP.pl > Forum > Przedszkole
Croos22
Witam.

Interesuje mnie czy jest możliwość aby wyciągnąć losowy rekord z bazy ale aby po odświeżeniu strony ciągle był ten sam? Myślałem aby wylosować a następnie dodać do bazy i z powrotem wyciągnąć .

Na razie mam takie zapytanie które wyciąga losowy rekord:
  1. $query="SELECT * FROM users ORDER BY RAND() LIMIT 1";
  2. $result=mysql_query($query);
  3. while($row=mysql_fetch_assoc($result)){
  4. echo $row['user_name'];
  5. }
lessi
Jak dasz do bazy to wtedy jak znów wejdziesz na stronę to będzie ten sam i na różnych komputerach też będzie ten sam. Możesz dodać do sesji, albo cookies.
Croos22
Właściwie o tym nie pomyślałem.

A była by możliwość wybrać losowy rekord a następnie przy pomocy sesji dodać go do osobnej tabeli?
lessi
A właściwie po co ci to potrzebne? Bo nie wiem do końca co chcesz zrobić. Po co chcesz dodawać to znowu do bazy danych.
Croos22
Chciałem aby wylosowało jeden rekord i ten wylosowany widniał na stronie.
lessi
No więc jeżeli chcesz aby ten rekord był cały czas przy odświeżeniu strony daj:
  1. <?php
  2. if(empty($_SESSION['username'])){
  3. $query="SELECT * FROM users ORDER BY RAND() LIMIT 1";
  4. $result=mysql_query($query);
  5. while($row=mysql_fetch_assoc($result)){
  6. $_SESSION['username']=$row['user_name'];
  7. }
  8. }
  9. echo $_SESSION['username'];
  10. ?>

Powinno działać, jeżeli się gdzieś nie pomyliłem.
Croos22
A czy jest możliwość aby każdy zobaczył ten sam wynik? Ponieważ mam to wrzucone w kod js i to odlicza czas po zakończeniu wykonuje się zapytanie.
lessi
to musisz to dodać do bazy danych lub do pliku
modern-web
Jeśli chodzi Ci o taki skrypt, który losowałby 1 rekord dla jednego id sesji (tak by 1 osoba widziała tylko jeden rekord) i aby po wciśnięciu F5 nie został wylosowany kolejny to chyba mogę Ci pomóc.
Kiedyś się z tym bawiłem i wyszło mi coś takiego:

  1. <?php
  2. include('config.php');
  3. $query1 = mysql_query( 'SELECT token FROM token WHERE used_by = "'.session_id().'"');
  4. if( $query1 AND mysql_num_rows( $query1 ) != 0 ) {
  5. echo "<b><center>Wygenerowany kod:</center></b><br><br>";
  6. $token = mysql_result($query1,"token");
  7. echo "<center>$token</center>";
  8. } else {
  9. $query2 = mysql_query( 'UPDATE token SET used_by = "'.session_id().'" WHERE used_by = 0 ORDER BY id ASC LIMIT 1' );
  10. if( $query2 AND mysql_affected_rows() != 0 ) {
  11. $query3 = mysql_query( 'SELECT token FROM token WHERE used_by = "'.session_id().'" ORDER BY id DESC LIMIT 1' );
  12. if( $query3 AND mysql_num_rows( $query3 ) != 0 ) {
  13. echo "<b><center>Wygenerowany kod:</center></b><br><br>";
  14. $token = mysql_result($query3,"token");
  15. echo "<center>$token</center>";
  16. } else {
  17. echo 'Wystąpił krytyczny błąd';
  18. }
  19. } else {
  20. echo 'Twój kod został już wygenerowany.';
  21. }
  22. }
  23. ?>


Nie gwarantuję, że jest on w 100% poprawny. Właściwie to nie jest, ale sądzę, że może być dobrą podporą smile.gif
Siedziałem nad nim tydzień, aż zrezygnowałem, bo losowanie kodów (rekordów) nie było w 100% bezpieczne. Zdarzały się przypadki kiedy użytkownik mógł wygenerować sobie 2 kody bez ponownego przejścia przez krok "płatności".

Pozdrawiam.


P.S.
W razie czego pisz. Pomogę go udoskonalić smile.gif
Croos22
A nie ma prostszego sposobu na wyciągnięcie oraz utrzymanie tego pierwszego wylosowanego rekordu?
modern-web
Jak widzisz mój skrypt zawiera także polecenie UPDATE, które w twoim wypadku będzie chyba niezbędne...
System ten opierał się na tym, że po wygenerowaniu kodu przypisywał rekordowi wartość "session_id()", tak by użytkownik otrzymywał ciągle ten sam kod.
Opiszę to inaczej...

$query1 wyciągał z bazy ten rekord, który ma id sesji == session_id() użytkownika. Jeśli nie było -> patrz $query2
$query2 jeśli w bazie nie było rekordu, który miałby przydzielony taki sam session_id() jak id sesji użytkownika to szukał takiego, który ma = 0 i przydzielał mu session_id() == użytkownika. Po co? Patrz $query3
$query3 wyciągał z bazy ten rekord, który ma id sesji == session_id() użytkownika (po to by F5 nie było rozwiązaniem na uzyskanie nowego kodu).

Ważna jest kolejność wykonywania zapytań. Jest to zabezpieczenie smile.gif

Opisz mi dokładniej co musisz zrobić itp.
Jeśli będzie Ci wygodniej to zapraszam do rozmowy przez GG: 25628835

Pozdrawiam. winksmiley.jpg
Croos22
Takie losowanie chciałem zrobić z nagrodami. Chciałem być rzetelny wobec swoich użytkowników dlatego potrzebuje zrobić aby to samo losowało.

  1. <script language="JavaScript">
  2. TargetDate = "10/23/2010 02:11 PM";
  3. BackColor = "palegreen";
  4. ForeColor = "nablackvy";
  5. CountActive = true;
  6. CountStepper = -1;
  7. LeadingZero = true;
  8. DisplayFormat = "%%D%% Dni, %%H%% Godzin, %%M%% Minut, %%S%% Sekund.";
  9. FinishMessage = "<?php
  10.  
  11. include ('includes/config_includes.php');
  12.  
  13. if(empty($_SESSION['username'])){
  14. $query="SELECT * FROM users ORDER BY RAND() LIMIT 1";
  15. $result=mysql_query($query);
  16. while($row=mysql_fetch_assoc($result)){
  17. $_SESSION['username']=$row['user_name'];
  18. }
  19. }
  20. echo $_SESSION['username'];
  21. ?>"
modern-web
Mógłbyś opisać to jeszcze bardziej szczegółowo smile.gif?
Co ma być losowane? Ile razy? Co ma się dziać itp...
Jak sobie wyobrażasz działanie takiego skryptu winksmiley.jpg?

Muszę znać Twoją koncepcję biggrin.gif
Croos22
Po prostu... Zegar odlicza a gdy skończy w linii 9-22 wykonuje się zapytanie które losuje zwycięzce. Losowanie będzie raz na jakiś czas.
modern-web
Ja to rozumiem tak:

1. zegar odlicza
2. kończy odliczanie
3. wykonuje skrypt php
4. skrypt zawiera zapytanie do bazy danych
5. skrypt losuje jednego z np. 10000 użytkowników
6. wyświetla go

Jeśli tak to jest jak ja myślę to znam świetne rozwiązanie smile.gif
Croos22
Dokładnie o to chodzi.
modern-web
A powiedz mi jeszcze;
Dość istotna sprawa.
Czy użytkownicy mogą być losowani 2 razy?

Wiesz, że np. 10 listopada wypadnie użytkownik x, 10 grudnia użytkownik y ale 10 stycznia ponownie użytkownik x...

Czy może tylko raz na całą serię losowań?
Croos22
Tak lecz przy dużej liczbie użytkowników szansa na wylosowanie dwa razy to jak szóstka w lotku.
modern-web
Dobra, to po prostu daj taki skrypt:

  1. <?php
  2.  
  3. include('includes/config_includes.php');
  4. $losowanie = mysql_query( 'SELECT user FROM uzytkownicy WHERE id > 0 ORDER BY id ASC LIMIT 0,1');
  5. if( $losowanie AND mysql_num_rows( $losowanie ) != 0 )
  6. {
  7. echo "LOSOWANIE WYGRYWA ...";
  8. $wylosowany = mysql_result($losowanie,"user");
  9. echo "$wylosowany";
  10. }
  11.  
  12. ?>


Pisałem z głowy i dodatkowo jest godzina 00:55 ;D
Mam nadzieję, że jest dobrze - jeśli nie to rano poprawię smile.gif

Dobrej nocy życzę,

Pozdrawiam biggrin.gif
Croos22
Coś niestety poszło nie tak :<
Parse error: syntax error, unexpected $end in /index.php on line 187
W całym index.php mam 186 linii kodu.

  1. <script language="JavaScript">
  2. TargetDate = "10/23/2010 02:11 PM";
  3. BackColor = "palegreen";
  4. ForeColor = "nablackvy";
  5. CountActive = true;
  6. CountStepper = -1;
  7. LeadingZero = true;
  8. DisplayFormat = "%%D%% Dni, %%H%% Godzin, %%M%% Minut, %%S%% Sekund.";
  9. FinishMessage = "<?php
  10.  
  11. include ('includes/config_includes.php');
  12.  
  13. $losowanie = mysql_query( 'SELECT users FROM user_name WHERE id > 0 ORDER BY id ASC LIMIT 0,1');
  14. if( $losowanie AND mysql_num_rows( $losowanie ) != 0 ) {
  15. $wylosowany = mysql_result($losowanie,"user_name");
  16. echo "$wylosowany";
  17.  
  18. ?>";
  19. </script>
  20. <script language="JavaScript" src="http://scripts.hashemian.com/js/countdown.js"></script>
Ulysess
jest zegar.. w momencie gdy czas odliczania osiagnie wartosc 0 wtedy pobierany jest czas ost losowania , jesli ten czas jest dluzszy niz xx wtedy losowany i dodawany jest nowy questionmark.gif
modern-web
Bo zapomniałeś o } winksmiley.jpg

  1. <script language="JavaScript">
  2. TargetDate = "10/23/2010 02:11 PM";
  3. BackColor = "palegreen";
  4. ForeColor = "nablackvy";
  5. CountActive = true;
  6. CountStepper = -1;
  7. LeadingZero = true;
  8. DisplayFormat = "%%D%% Dni, %%H%% Godzin, %%M%% Minut, %%S%% Sekund.";
  9. FinishMessage = "<?php
  10.  
  11. include ('includes/config_includes.php');
  12.  
  13. $losowanie = mysql_query( 'SELECT users FROM user_name WHERE id > 0 ORDER BY id ASC LIMIT 0,1');
  14. if( $losowanie AND mysql_num_rows( $losowanie ) != 0 )
  15. {
  16. $wylosowany = mysql_result($losowanie,"user_name");
  17. echo "$wylosowany";
  18. }
  19.  
  20. ?>";
  21. </script>
  22. <script language="JavaScript" src="http://scripts.hashemian.com/js/countdown.js"></script>
Ulysess
eee questionmark.gif.. a co to za losowanie skoro pobierze 1 rekord w kolejnosci od najmniejszego questionmark.gif :|..
modern-web
Aaaaaa!!! Faktycznie, mój błąd - powinno być tak:


  1. <script language="JavaScript">
  2. TargetDate = "10/23/2010 02:11 PM";
  3. BackColor = "palegreen";
  4. ForeColor = "nablackvy";
  5. CountActive = true;
  6. CountStepper = -1;
  7. LeadingZero = true;
  8. DisplayFormat = "%%D%% Dni, %%H%% Godzin, %%M%% Minut, %%S%% Sekund.";
  9. FinishMessage = "<?php
  10.  
  11. include ('includes/config_includes.php');
  12.  
  13. $losowanie = mysql_query( 'SELECT users FROM user_name WHERE id > 0 ORDER BY RAND() LIMIT 0,1');
  14. if( $losowanie AND mysql_num_rows( $losowanie ) != 0 )
  15. {
  16. $wylosowany = mysql_result($losowanie,"user_name");
  17. echo "$wylosowany";
  18. }
  19.  
  20. ?>";
  21. </script>
  22. <script language="JavaScript" src="http://scripts.hashemian.com/js/countdown.js"></script>
Croos22
No działa z początku miałem wrażenie, że się zmienia. Nie bardzo wiem na czym to polega mógłby ktoś mi trochę objaśnić?
modern-web
Rozumiem, ze działania zegara tłumaczyć nie muszę winksmiley.jpg
Natomiast skrypt PHP wykonuje zapytanie do bazy danych, szuka usera w tabeli user_name z tym, ze tylko tych, którzy mają id>0. ORDER BY to nic innego jak kolejność wyszukiwania rekordów w tabeli. Można przeszukiwać według id (wylosuje tylko 1 rekord bo LIMIT ustawiony jest na 0,1 - zero lub max. jeden, natomiast jeśli ustawilbys LIMIT na np. 0,5 to wylosuje kolejno id od 1 do 5), według daty, nazwy użytkownika... praktycznie wszystkiego. ORDER BY RAND() to wyszukiwanie losowe... niezależnie od id, nazwy użytkownika itp... LIMIT 0,1 oznacza, ze wyników będzie od 0 do 1 (zero bo może zdarzyć się ze zabraknie użytkowników i wtedy nie wyświetli się błąd). Gdybyś ustawił na 0,7 to wyników by było od 0 do 7 (minimum 0, maximum 7).

To co masz dalej przy if oznacza, ze jeśli rozwiazanie jest != 0 (tzn. jest jakiekolwiek) to przechodzi do wyświetlenia wylosowanego użytkownika.

Ten fragment wyświetla wylosowanego użytkownika:
$wylosowany = mysql_result($losowanie,"user_name");

A i... Popraw mysql_result($losowanie,"user_name") na to: mysql_result($losowanie,"users") bo mam wrażenie ze było źle...
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.