mike-j
11.07.2008, 09:10:54
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.
Ociu
11.07.2008, 09:14:01
Może zapisz dane do sesji ?
mike-j
11.07.2008, 11:14:05
W jaki sposób... nie rozumiem co masz na myśli
Shili
11.07.2008, 11:20:43
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
mike-j
11.07.2008, 12:09:22
Czyli w sesji ma zapisywać która strona ma przyporządkowane dane wyniki, tak?
Shili
11.07.2008, 12:12:22
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
Ociu
11.07.2008, 13:08:46
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.
mike-j
12.07.2008, 14:34:59
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?
Kicok
12.07.2008, 15:11:29
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:
<?php
// Jeśli świeża sesja - pobierz nowe ziarno
if( empty( $_SESSION['rand_seed'] ) ) {
touch( 'rand_seed.txt' ); }
++$_SESSION['rand_seed'];
file_put_contents( 'rand_seed.txt', $_SESSION['rand_seed'] );
}
// Przykładowa tablica z danymi
// Mieszaj tablicę
srand( $_SESSION['rand_seed'] );
// Sprawdź poprawność numeru strony
$page = 0;
if( !empty( $_GET['page'] ) && ( $_GET['page'] = abs( intval( $_GET['page'] ) ) ) ) {
if( ( $_GET['page'] + 1
) * 10
<= count( $data ) ) { $page = $_GET['page'];
}
}
// Wyświetl linki i wyniki
if( $page ) {
echo '<a href="?page=' . ( $page - 1 ) . '">poprzednia</a> | '; }
$from = $page * 10;
$to = $from + 10;
for( $i = $from; $i < $to; ++$i ) {
}
if( $to < count( $data ) ) { echo '| <a href="?page=' . ( $page + 1 ) . '">następna</a>'; }
?>
[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