Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Wyciąganie losowego rekordu z bazy
Croos22
post
Post #1





Grupa: Zarejestrowani
Postów: 316
Pomógł: 4
Dołączył: 22.03.2010

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


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. }
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
lessi
post
Post #2





Grupa: Zarejestrowani
Postów: 89
Pomógł: 12
Dołączył: 1.12.2009

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


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.

Ten post edytował lessi 23.10.2010, 12:35:16
Go to the top of the page
+Quote Post
Croos22
post
Post #3





Grupa: Zarejestrowani
Postów: 316
Pomógł: 4
Dołączył: 22.03.2010

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


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?
Go to the top of the page
+Quote Post
lessi
post
Post #4





Grupa: Zarejestrowani
Postów: 89
Pomógł: 12
Dołączył: 1.12.2009

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


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.
Go to the top of the page
+Quote Post
Croos22
post
Post #5





Grupa: Zarejestrowani
Postów: 316
Pomógł: 4
Dołączył: 22.03.2010

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


Chciałem aby wylosowało jeden rekord i ten wylosowany widniał na stronie.
Go to the top of the page
+Quote Post
lessi
post
Post #6





Grupa: Zarejestrowani
Postów: 89
Pomógł: 12
Dołączył: 1.12.2009

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


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.

Ten post edytował lessi 23.10.2010, 13:00:28
Go to the top of the page
+Quote Post
Croos22
post
Post #7





Grupa: Zarejestrowani
Postów: 316
Pomógł: 4
Dołączył: 22.03.2010

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


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.
Go to the top of the page
+Quote Post
lessi
post
Post #8





Grupa: Zarejestrowani
Postów: 89
Pomógł: 12
Dołączył: 1.12.2009

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


to musisz to dodać do bazy danych lub do pliku
Go to the top of the page
+Quote Post
modern-web
post
Post #9





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

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


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ą (IMG:style_emoticons/default/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ć (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Croos22
post
Post #10





Grupa: Zarejestrowani
Postów: 316
Pomógł: 4
Dołączył: 22.03.2010

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


A nie ma prostszego sposobu na wyciągnięcie oraz utrzymanie tego pierwszego wylosowanego rekordu?
Go to the top of the page
+Quote Post
modern-web
post
Post #11





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

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


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 (IMG:style_emoticons/default/smile.gif)

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

Pozdrawiam. (IMG:style_emoticons/default/winksmiley.jpg)

Ten post edytował modern-web 23.10.2010, 21:07:30
Go to the top of the page
+Quote Post
Croos22
post
Post #12





Grupa: Zarejestrowani
Postów: 316
Pomógł: 4
Dołączył: 22.03.2010

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


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. ?>"
Go to the top of the page
+Quote Post
modern-web
post
Post #13





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

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


Mógłbyś opisać to jeszcze bardziej szczegółowo (IMG:style_emoticons/default/smile.gif) ?
Co ma być losowane? Ile razy? Co ma się dziać itp...
Jak sobie wyobrażasz działanie takiego skryptu (IMG:style_emoticons/default/winksmiley.jpg) ?

Muszę znać Twoją koncepcję (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
Croos22
post
Post #14





Grupa: Zarejestrowani
Postów: 316
Pomógł: 4
Dołączył: 22.03.2010

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


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.

Ten post edytował Croos22 23.10.2010, 23:08:27
Go to the top of the page
+Quote Post
modern-web
post
Post #15





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

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


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Croos22
post
Post #16





Grupa: Zarejestrowani
Postów: 316
Pomógł: 4
Dołączył: 22.03.2010

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


Dokładnie o to chodzi.
Go to the top of the page
+Quote Post
modern-web
post
Post #17





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

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


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ń?
Go to the top of the page
+Quote Post
Croos22
post
Post #18





Grupa: Zarejestrowani
Postów: 316
Pomógł: 4
Dołączył: 22.03.2010

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


Tak lecz przy dużej liczbie użytkowników szansa na wylosowanie dwa razy to jak szóstka w lotku.
Go to the top of the page
+Quote Post
modern-web
post
Post #19





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

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


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ę (IMG:style_emoticons/default/smile.gif)

Dobrej nocy życzę,

Pozdrawiam (IMG:style_emoticons/default/biggrin.gif)

Ten post edytował modern-web 24.10.2010, 12:02:08
Go to the top of the page
+Quote Post
Croos22
post
Post #20





Grupa: Zarejestrowani
Postów: 316
Pomógł: 4
Dołączył: 22.03.2010

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


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>
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 22:18