Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> konkretne zapytanie - zapytanie mysql, znajdowanie poprzedniego i nastepnego rekordu
hrehor
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 13.02.2007

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


pewnie post powinien byc w "przedszkolu", niemniej potrzebuje pomocy.

tworze galerie fotograficzna, i mam problem z zapytaniem mysql.
adres strony to: http://www.photography.kw.pl/

mam takie cos:
$query = "SELECT * FROM `photos` WHERE `".$nav."` = '".$value."'";
//gdzie $nav to np "category" lub "date", a value to np "arch" lub "people" lub np "2007-02-12"
$result = mysql_query($query);
$ilosc_fotek = mysql_num_rows($result); //to wiem ze nr ostatniego rekordu :-)

przy przegladaniu zdjec chcialbym zeby byly opcja ogladania zdjec nastepnego i poprzedniego wzgledem daty i kategorii. jak to najprosciej zrobic ?
jako zmienne mam na stronie wyciagniete pole z bazy danych [id] biezacego zdjecia. jak znalezc zdjecie poprzednie i nastepne ?
nie moge zrobic +1 i -1 bo id juz nie sa po kolei, a co dopiero pozniej. poza tym, chce zeby przy pierwszym "previous" przeskakiwal do ostatniego, a w ostatnim "next" do pierwszego.

mam nadzieje ze pomozecie,
pozdro
Hrehor
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
tomaszdurka
post
Post #2





Grupa: Zarejestrowani
Postów: 32
Pomógł: 1
Dołączył: 12.02.2007

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


$current to nie jest id (twój primary_key), tylko jest to po prostu numer kolejności rekordu z rekordów zwróconcyh przez zapytanie.

Do tego jest właśnie LIMIT.
Wytłumaczę.

Jeśli

  1. SELECT * FROM products

zwraca np. 10 rekordów to

  1. SELECT * FROM products LIMIT 0, 1

zwraca jeden i do tego pierwszy rekord.

  1. SELECT * FROM products LIMIT 1, 4

zwraca 4 rekordy począwszy od drugiego.

W tym przypadku pierwsza liczba to rekord od którego zaczynamy -1.
Dlatego właśnie jest tam -1.


[Po co jest zmienna $np?]
Jeśli chcesz funkcję to zrób to tak.


  1. function navigation($nav, $value, $current) {
  2. if ($current < 1) {
  3. // echo "Błędne foto pierwszy";
  4. return false;
  5. }
  6. $query = "SELECT * FROM photos WHERE " . $nav . " = '" . $value . "' ORDER BY " . $nav . " ASC LIMIT " . ($current - 1) . ", 18446744073709551615";
  7. // 18446744073709551615 to max mysql number
  8.  
  9. $result_nav = mysql_query($query_nav);
  10. $ilosc_fotek = mysql_num_rows($result_nav);
  11.  
  12. if (!$ilosc_fotek) {
  13. //echo "Drugi nav:".$nav." value".$value." np:".$np." current:".$current." id:".$id;
  14. return false;
  15. } elseif($current == 1) {
  16. $next = $current + 1;
  17. $prev = $ilosc_fotek;
  18. } elseif ($ilosc_fotek == 1) {
  19. $next = 1;
  20. $prev = $current -1;
  21. } else {
  22. $next = $current + 1;
  23. $prev = $current - 1;
  24. }
  25. $r_array['data'] = mysql_fetch_assoc($result_nav);
  26. $r_array['next'] = $next;
  27. $r_array['prev'] = $prev;
  28. return $r_array;
  29. }
  30.  
  31.  
  32. $_GET['photo_number'] = isset($_GET['photo_number']) ? $_GET['photo_number'] : 1; // ustalenie domyślnego photo_number jako 1
  33.  
  34. if($photo = navigation('category', 'arch', $_GET['photo_number'])) {
  35. // Przykładowo jeśli masz pole URL w tabeli zdjęć
  36. echo '<img src="' . $photo['data']['url'] . '" />';
  37. echo '<a href="' . $photo['prev'] . '">Poprzednie</a>';
  38. echo '<a href="' . $photo['next'] . '">Następne</a>';
  39. }



Ale jako $_GET['photo'_number'] używasz liczby z przedziału od 1 do ilości twoich fotek spełniających podane kryteria wyszukiwania np. względem kategorii.

PS. Dałem w HTML bo php escape'ował quote'y.

Ten post edytował tomaszdurka 14.02.2007, 13:10:50
Go to the top of the page
+Quote Post
hrehor
post
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 13.02.2007

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


Cytat(tomaszdurka @ 14.02.2007, 13:06:21 ) *
$current to nie jest id (twój primary_key), tylko jest to po prostu numer kolejności rekordu z rekordów zwróconcyh przez zapytanie.


wstawilem, ale nie dziala. pewnie dlatego ze nie rozumiem, jak zrozumiem to pewnie zadziala :-)

nie kumam zmiennej $_GET['photo_number'] - co to jest ? w tablicy GET jedyna wartoscia przekazywana jest $id, a skoro to nie jest photo_number to on (photo_number) zawsze bedzie rowny 1 (domyslna ustawiona wartosc). jesli $current jest numerem kolejnosci rekordu to chyba nie moze wystepowac w samym zapytaniu, bo wowczas (przed zapytaniem) ma wartosc nieokreslona. $current zostaje okreslony dopiero po zapytaniu, tak ?
pozdro
Hrehor

Cytat(bendi @ 14.02.2007, 14:38:52 ) *
  1. <?php
  2. $query1 = "SELECT * FROM `photos` WHERE `".$nav."` >= '".$value."' ORDER BY `".$nav."` ASC LIMIT 3";
  3. $query1 = "SELECT * FROM `photos` WHERE `".$nav."` <= '".$value."' ORDER BY `".$nav."` ASC LIMIT 3";
  4. ?>

Takie rozwiązanie w sql'u mi pryzszło do głowy, moze trzeba troche pokombinowac, ale jezeli trzeba tylko pobrac rekord z tymi "dookola" to to moze byc dobra droga.


O to mi chodziło :-) mniej więcej, ale pchnęło na dobre tory. Po cały skrypt zapraszam do odp. dla tomaszadurka
dzięki i pozdro
Hrehor

nie wiem czemu odp dla usera bendi znalazla sie tutaj... niewazne
udalo mi sie w koncu napisac te funkcje. wyglada tak
  1. <?
  2. function navigation($nav,$value,$np,$id) {
  3.  
  4. $query_f = "SELECT * FROM `photos` WHERE `id` < ".$id." AND `".$nav."` = '".$value."' ORDER BY `id` ASC";
  5.  
  6. $query_p = "SELECT * FROM `photos` WHERE `id` < ".$id." AND `".$nav."` = '".$value."' ORDER BY `id` DESC";
  7.  
  8. $query_n = "SELECT * FROM `photos` WHERE `id` > ".$id." AND `".$nav."` = '".$value."' ORDER BY `id` ASC";
  9.  
  10. $query_l = "SELECT * FROM `photos` WHERE `id` > ".$id." AND `".$nav."` = '".$value."' ORDER BY `id` DESC";
  11.  
  12. $result_f = mysql_query($query_f);
  13. $result_p = mysql_query($query_p);
  14. $result_n = mysql_query($query_n);
  15. $result_l = mysql_query($query_l);
  16.  
  17. $firstrow = mysql_fetch_row($result_f);
  18. $first = $firstrow[0];
  19.  
  20. $prevrow = mysql_fetch_row($result_p);
  21. $prev = $prevrow[0];
  22.  
  23. $nextrow = mysql_fetch_row($result_n);
  24. $next = $nextrow[0];
  25.  
  26. $lastrow = mysql_fetch_row($result_l);
  27. $last = $lastrow[0];
  28.  
  29. if($prev == $next){$next = $prev = $id;};
  30.  
  31. if (!$prev){$prev = $last;};
  32.  
  33. if (!$next){$next = $first;};
  34.  
  35. if ($np == "next"){
  36. echo $next;
  37. }
  38. elseif ($np == "prev"){
  39. echo $prev;
  40. }
  41. else{
  42. echo "np jest inny niz next lub prev";
  43. }
  44. }
  45. ?>

a w kodzie strony jest tak
  1. <?php
  2. navigation(ee_date,$row['ee_date'],prev,$id)
  3. navigation(ee_date,$row['ee_date'],next,$id)
  4. navigation(category,$row['category'],prev,$id)
  5. navigation(category,$row['category'],next,$id)
  6. ?>


nie podoba mi sie w kodzie ze sa az 4 zapytania do bazy sql... pewnie da sie to uproscic. najwazniejsze ze dziala tak jak chcialem. chociaz musze przyznac ze popelnilem blad w zalozeniu - mianowicie teraz przegladanie zdjec wg $nav - ee_date, przeskakuje pomiedzy zdjeciami ktore maja te sama date. lepiej by bylo gdyby przeskakiwalo pomiedzy zdjeciami w calej bazie danych. ale teraz to pryszcz, tylko ze bedzie potrzebna nowa funkcja i zapytan do bazy bedzie 8.
dzieki za odpowiedzi
pozdro
Hrehor

naszla mnie jeszcze jedna rzecz, apropos zapytan sql z ktorych tu skorzystalem.
skoro zapytanie:

SELECT * FROM `photos` WHERE `id` < ".$id." AND `category` = 'arch' ORDER BY `id` ASC

zwraca wszystkie rzedy bazy danych z kategorii arch o id mniejszym od podanego, to powinna byc funkcja php pozwalajaca sie dostac zarowno do pierwszego jak i ostatniego rzedu.

wiem juz, ze funkcja mysql_fetch_row($query); zwroci pierwszy rzad. czy istnieje jakas ktora zwroci ostatni?
wtedy zapytan do bazy mialbym dwa razy mniej
pozdro
Hrehor
Go to the top of the page
+Quote Post

Posty w temacie


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: 3.10.2025 - 23:28