Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] otwieranie obrazka
Forum PHP.pl > Forum > PHP
miszcz
Wygląda to tak: mam plik php, w którym losowany jest obrazek z bazy, jaki powinien być kod by po kliknięciu w dany obrazek, który się pojawi, ten sam obrazek został otworzony na drugiej podstronie (ew. jaki też kod do "odebrania" tego obrazka powinien być na podstronie)?

Obecnie wyświetlanie losowego obrazka mam tak napisane:

  1. $query="SELECT * FROM images ORDER BY RAND() LIMIT 0,2";
  2. $result = @mysql_query($query);
  3.  
  4. while($row = mysql_fetch_object($result)) {
  5. $images[] = (object) $row;
  6. }
  7. mysql_close();
  8.  
  9. <a href = "/index.php"><img src="/include/<?=$images[0]->filename?>" "width="400" /></a>


mi się wydaje, że trzeba to jakoś na zmiennej GET zrobić lub zmodyfikować jeszcze zapytanie do bazy, ale nie wiem jak...
prowseed
Mozesz sobie wynik losowania zapisac w sesji, chyba wystarczy.
alegorn
uuuuuuuuuuf...

NIGDY ale to NIGDY nie uzywaj
ORDER BY RAND()

zapomnij ze taka opcja istnieje. jest kilka lepszych sposobow by zarżnąć bazę, ale naprawde nie wiele.
w kazdym mozliwym kursie mysql'a odnosnie optymalizacji - jest to pietnowane na pierwszym miejscu...


j.

ps owe 'nigdy' oczywiscie sie odnosi do zawodowego pisania programow, hobbistycznie, lub na uczelnie - ujdzie..
miszcz
a więc co polecasz? snitch.gif
alegorn
zalezy od tego jak masz zbudowana baze danych

jesli masz index ciagly - pobierz wszesniej najwieksza wartosc ( np max(id) ) i wylosuj sobie numerek po stronie php

jesli potrzebujesz wiecej, i w dodatku masz nieciagly index - mozesz sprobowac nastepujaca nastepujaca sciezke :

* pobierz max id
* wygeneruj wieksza liczbe unikatow
* wklej je do zapytania z IN
* daj limit.

co w twoim konkretnym przypadku dawalo by np. rezultat:

  1. SELECT * FROM images WHERE image_id IN(7,77,66,54,52) LIMIT 2


daje ci to gwarancje, ze nawet jesli trafisz na nieistniejacy index - bedziesz mial prawidlowy wynik.

tak naprawde sposob zalezy od tego jaka masz strukture - ale naprawde, order by rand to zło w czystej postaci
absflg
Skoro już narzekasz, że nieoptymalne, to nie polecaj przetwarzania czegoś w PHP i drugiego zapytania...
  1. SELECT * FROM images
  2. WHERE id <= FLOOR( RAND()*(SELECT max(id) FROM images) )+1
  3. LIMIT 1

Nawet jak nie trafi, to przez znak <= wybierze pierwszy mniejszy. Oczywiście przy dziurach w numeracji nie ma równej szansy na każdy obrazek. Im więcej dziur w numeracji po danym obrazku, tym większa na niego szansa.

Jak to wielki problem, przez jego znaczenie w aplikacji, to może coś takiego:
  1. LIMIT FLOOR(RAND()*(SELECT count(id) FROM images) ) , 1
alegorn
Cytat
Skoro już narzekasz, że nieoptymalne, to nie polecaj przetwarzania czegoś w PHP i drugiego zapytania...

hmm..

przy tym zapytaniu
Cytat
SELECT * FROM images
WHERE id <= FLOOR( RAND()*(SELECT max(id) FROM images) )+1
LIMIT 1


zawsze bedzie zwracany pierwszy rekord. (tutaj na poczatek wybierasz x rekordow, <nawet cala tabele>, i obcinasz wszystko do pierwszego rekordu)
druga częśc z : limit x,1 zadziała prawidłowo, ale jest nieoptymalne.
(zmuszasz mysql'a do selecta x+1 rekordow, nastepnie do obciecia puli x - co przy większej ilości danych jest bardzo kosztowne << choc tutaj nie pamietam w 100% dokladnie tego, musialbym doczytac)

moim zdaniem ograniczenie do 5 rekordow, jakie ja zastosowalem, jest mniej kosztowne.
to po pierwsze.

edit: jesli nie wierzysz - sprawdz explainem ilosc rekordow

po drugie, nie jest prawdą że jedno wielkie zapytanie wykona sie szybciej niz kilka mniejszych (nawet z koniecznoscia obrobki po stronie php)
przynajmniej, nie na wydajnym serwerze.

dzięki temu, ze rozbijasz zapytanie na kilka wątków, możesz je wykonać na kilku procesorach.
jesli wysyłasz jedno wielkie zapytanie - wykorzystywany jest tylko jeden procesor...
ot, kwestia skalowania aplikacji. na nieobciążonej maszynie, - tak, pojedyncze zapytanie będzie szybsze, ale na stress testach - wyniki calej aplikacji będą diametralnie różne..

j.
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.