[PHP]Anti-refresh, jak powstrzymać array_rand?

Cześć.

Jakie są możliwości jednorazowego wykonania array_rand(). Mam skrypt który pobiera id z MySQL, następnie losuje 10 rożnych id i przypisuje je do następnych zapytań. Zależy mi na tym, by po jednorazowym wylosowaniu, czyli uruchomieniu się skryptu(wejściu na stronę) nie odświeżeniu wylosowane id było niezmienne. I teraz wiem, że mam do wyboru przenoszenia już wylosowanych id za pomocą funkcji header(), tylko zastanawiam się czy istnieje jeszcze jakiś ładny mniej zasobożerny sposób?.

oto mój skrypt:

 $query_id_question = "SELECT id_question FROM questions WHERE number='".$return['number']."'";        = $db-query($query_id_question);            ($return_id_q = $result_id_q-fetch_row()) {        $id_question[] = $return_id_q[0];        }

Nie wiem, czy dobrze Cię zrozumiałem, bo Twoja interpunkcja jest tragiczna (trzecie zdanie), ale może rozwiązaniem jest użycie sesji (session_start) i trzymanie wartości w tablicy $_SESSION?

P.S. Uważaj z funkcją array_rand, bo zwraca ona tablicę z wylosowanymi indeksami do tablicy z której losuje, a nie wartości elementów z tej tablicy!

http://php.net/manual/pl/function.array-rand.php

Ok, wcześniejszą kwestię rozwiązałem, mam tylko takie techniczne pytanie dotyczące zapisywania wyniku mysql_fetch do zmiennej sesyjnej. Dlaczego poniższy skrypt po wykonaniu pętli aktualizuje wartość zapisaną w zmiennej sesyjnej :?: ?

($return_id_q = $result_id_q-fetch_row()) {  $_SESSION['id_question'] = array($return_id_q[0]);  }[/code]



Domyślam się, że po każdym wykonaniu pętli zmienna sesyjna tworzy się na nowo i zapisuję ostatni wynik wykonanej pętli, dobrze myślę :?:.



Poradziłem sobie z powyższym mankamentem w ten sosób:




[code=php]($return_id_q = $result_id_q-fetch_row()) {  $r_i_q[] = $return_id_q[0];  }

Dokładnie. Oczywiście wcześniej inicjujesz zmienną $r_i_q jako tablicę:

$r_i_q = array();

I jeszcze jedna uwaga: gdzieś kiedyś wyczytałem, że nie wolno trzymać tablic w zmiennych sesyjnych (oraz innych złożonych obiektów) i aby to robić, trzeba używać funkcji serialize() do zakodowania tablicy jako string, a potem funkcji unserialize() do jego rozkodowania. Ale ta uwaga mogła dotyczyć jakiejś starej wersji PHP - obecnie chyba tym nie trzeba się przejmować (poza obiektami, ale to inna sprawa).

$r_i_q**[]** nie jest równoznaczne z ww. inicjalizacją?

//BTW

Jeszcze mam pytanie, jest jakaś funkcja konwertująca tablice wielowymiarowe do jednowymiarowej?.

$r_i_q[] = to nie jest inicjalizacja, tylko dodanie do tablicy kolejnej pozycji (indeks automatycznie się zwiększa). Warto zadbać o to, by zmienna taka była tablicą (pustą).

Inicjalizacja dzieje się automatycznie po dodaniu pierwszej wartości. W każdym razie var_dump() odczytuję ją jako tablicę.

Tak się dzieje, ponieważ zmienna nie jest niezainicjowana (przy pierwszym przypisaniu), wiec interpreter przyjmuje, że jest ona zmienną tablicową. Ale takie podejście może kiedyś doprowadzić do błędu, który będzie trudno zlokalizować - warto w programowaniu trzymać się dobrych, sprawdzonych zasad/praktyk.

A co z konwersją tablicy wielo do jednowymiarowej, czy tylko za pomocą pętli mogę ją przepisać do zwykłej tablicy?.

array (size=2)  0 = (size=1)      0 = string '8' (length=1)  1 = (size=1)      0 = string '9' (length=1)[/code]



Mój sposób opiera się na pętli for i przepisaniu tablicy wielowymiarowej do jednowymiarowej. 




[code=php]for ($i = 0; $i = 1; $i++) {         [] = $_SESSION['id_question'][$i][0];  }



Istnieją jakieś funkcję do konwersji tablic :?: ?

Z tego co się orientuję, to nie ma takiej uniwersalnej funkcji, to co napisałeś się nadaje (ale tylko do Twojego przykładu, gdzie wewnętrzna tablica - 2. rzędu - ma tylko jeden element).

Inne, bardziej uniwersalne rozwiązanie: http://www.experts-exchange.com/blogs/Derokorian/B_5945-Multidimensional-Array-to-Flat-Array.html

P.S. Pamiętaj, że przy takim “spłaszczeniu” tablicy wielowymiarowej do jednowymiarowej trzeba uważać na powtarzające się elementy - należy odpowiednio napisać kod tak, by otrzymać to co się oczekuje (np. u Ciebie w powyższym przykładzie, jakbyś miał drugą liczbę 8 - zamiast tej 9, to otrzymasz tablicę 2-elementową z dwiema ósemkami).

Wyżej wymienione liczby, to primary key z bazy danych także się nie powtórzą :).

Dzięki Pablo_Wawa , jak zwykle pomogłeś :slight_smile: .