Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL]Rotacja wyników z bazy
mike-j
post
Post #1





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 18.11.2007

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


Witam. Mam taki problem.

Chcę zrobić coś takiego, żeby gdy użytkownik wchodzi na stronę to skrypt mieszał dane i je porcjował po 30 na stronę. Wiem jak się porcjuje, ale nie chciałbym czegoś takiego, że jak user da na kolejną stronę wyników, że pokaże mu się ten sam wynik co wcześniej. Konkret: Raz roatuje wyniki i na każdej stronie pokazuje inne. Problem jeszcze polega na tym, że by jak wróci do poprzednich stron to lista wyników była taka jak wcześniej.

REAKCJA PRAWIDŁOWA
strona 1: 5, 8, 30, 29, 78, 654, ...
następna strona
strona 2: 7, 11, 2, 364, 85, ...
poprzednia strona
strona 1: 5, 8, 30, 29, 78, 654, ...

Z góry dzięki za pomoc.
Go to the top of the page
+Quote Post
Ociu
post
Post #2





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Może zapisz dane do sesji ?
Go to the top of the page
+Quote Post
mike-j
post
Post #3





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 18.11.2007

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


W jaki sposób... nie rozumiem co masz na myśli
Go to the top of the page
+Quote Post
Shili
post
Post #4





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

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


Nie wiem co prawda jaki pomysł miał Ociu, ale ja zrobiłabym to w ten sposób, że po sprawdzeniu, czy sesja nie istnieje tworzyłabym ją i mieszała tablicę przyporządkowując kolejne 30 wylosowanych liczb poszczególnym zmiennym sesyjnym nazywając je strona1, strona2, strona3, ...

przyjmując:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
"mieszanie":
12, 1, 4, 5, 11, 15, 2, 9, 6, 13, 3, 7, 8, 10, 14

i teraz: strona1: 12, 1, 4, 5, 11
strona2: 15, 2, 9, 6, 13
strona3: 3, 7, 8, 10, 14
Go to the top of the page
+Quote Post
mike-j
post
Post #5





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 18.11.2007

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


Czyli w sesji ma zapisywać która strona ma przyporządkowane dane wyniki, tak?
Go to the top of the page
+Quote Post
Shili
post
Post #6





Grupa: Zarejestrowani
Postów: 1 085
Pomógł: 231
Dołączył: 12.05.2008

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


Ja bym to tak zrobiła. Podkreślam, że php sama się dopiero uczę i jest to moja wizja - czy optymalna nie wiem i śmiem twierdzić, że pewnie znajdą się lepsze tongue.gif

Ten post edytował Shili 11.07.2008, 12:13:16
Go to the top of the page
+Quote Post
Ociu
post
Post #7





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Cytat(mike-j @ 11.07.2008, 13:09:22 ) *
Czyli w sesji ma zapisywać która strona ma przyporządkowane dane wyniki, tak?


Dokładnie.
Go to the top of the page
+Quote Post
mike-j
post
Post #8





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 18.11.2007

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


Zrobiłem coś takiego:

Kod
<?

$strona = $_GET['s'];
         // Wynikow Na Strone
         $wns = 10;
settype($strona, "integer");
$tresc_zapytania_max = 'SELECT id FROM `nadmorzem`';
$zapytanie_max = mysql_query($tresc_zapytania_max);
// $r_max zawiera ilosc wszystkich rekordow w tabeli
$r_max = mysql_num_rows($zapytanie_max);



session_start();
        
         if(!isset($_SESSION['wyniki']))            // Sprawdza czy istnieje taka sesja
         {
                 $wyniki = array(1 =>
                                 $tresc_zapytania = 'SELECT id FROM `nadmorzem` WHERE id ORDER BY rand() LIMIT '.($strona*$wns).','.$wns;
                                 $zapytanie = mysql_query($tresc_zapytania);
                                 while ($w = mysql_fetch_row($zapytanie)) {
                                            array('id' => $w[0], 'strona' => $strona),
                                 }                                                        // Wypełnia tabelę danymi i przyporządkowuje każdemu id jego stronę
                 );
                
                 $_SESSION['wyniki'] = $wyniki;                                             // Zapisuje całą tabelę do sesji
         }
        
        
        
?>


Jak możecie to powiedzcie czy coś jest źle. Żeby było łatwiej to powiem co to miało zrobić. Miało przemieszczać wyniki w bazie tylko raz podczas pierwszego wejscia na stronę i poporcjować je po 10 na stronę a następnie przyporządkować w tablicy każdemu id z mysql stronę na której powinno się znajdować. A cała tablica miała zostać wysłana do sesji.

A teraz pytanie dodatkowe. Co musiałbym zrobić aby mając w adresie index.plp?page=1 pokazało mi wyniki przyporządkowane dla strony pierwszej?
Go to the top of the page
+Quote Post
Kicok
post
Post #9





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


A może by tak wykorzystać srand" title="Zobacz w manualu PHP" target="_manual? Wtedy w zmiennej sesji wystarczy zapisać tylko jedną liczbę - ziarno. Ziarno można zapisywać w pliku, żeby mieć pewność że się nie powtórzy, lub losować. Przykład zastosowania:

  1. <?php
  2.  
  3.  
  4. // Jeśli świeża sesja - pobierz nowe ziarno
  5.  
  6. if( empty( $_SESSION['rand_seed'] ) )
  7. {
  8. if( !file_exists( 'rand_seed.txt' ) ) {
  9. touch( 'rand_seed.txt' );
  10. }
  11.  
  12. $_SESSION['rand_seed'] = intval( file_get_contents( 'rand_seed.txt' ) );
  13. ++$_SESSION['rand_seed'];
  14. file_put_contents( 'rand_seed.txt', $_SESSION['rand_seed'] );
  15. }
  16.  
  17.  
  18. // Przykładowa tablica z danymi
  19. $data = range( 1, 100 );
  20.  
  21. // Mieszaj tablicę
  22. srand( $_SESSION['rand_seed'] );
  23. shuffle( $data );
  24.  
  25.  
  26. // Sprawdź poprawność numeru strony
  27. $page = 0;
  28. if( !empty( $_GET['page'] ) && ( $_GET['page'] = abs( intval( $_GET['page'] ) ) ) )
  29. {
  30. if( ( $_GET['page'] + 1 ) * 10 <= count( $data ) ) {
  31. $page = $_GET['page'];
  32. }
  33. }
  34.  
  35.  
  36. // Wyświetl linki i wyniki
  37. if( $page ) {
  38. echo '<a href="?page=' . ( $page - 1 ) . '">poprzednia</a> | ';
  39. }
  40.  
  41. $from = $page * 10;
  42. $to  = $from + 10;
  43. for( $i = $from; $i < $to; ++$i ) {
  44. echo $data[$i] . ' ';
  45. }
  46.  
  47. if( $to < count( $data ) ) {
  48. echo '| <a href="?page=' . ( $page + 1 ) . '">następna</a>';
  49. }
  50.  
  51.  
  52. ?>




[EDIT]
Nie doczytałem, że chodzi o wyniki z bazy danych. Ale to też żaden problem -> mysql.com -> dokumentacja -> RAND()

Użycie "ORDER BY RAND( $seed )" w zapytaniu będzie działało tak jak srand" title="Zobacz w manualu PHP" target="_manual i shuffle" title="Zobacz w manualu PHP" target="_manual w powyższym kodzie.
http://dev.mysql.com/doc/refman/5.1/en/mat...l#function_rand

Ten post edytował Kicok 12.07.2008, 15:18:17


--------------------
"Sumienie mam czyste, bo nieużywane."
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: 22.08.2025 - 07:16