Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: konkretne zapytanie - zapytanie mysql
Forum PHP.pl > Forum > Bazy danych > MySQL
hrehor
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
tomaszdurka
Witam tak na szybko to można zrobić to tak:

  1. <?php
  2. $current = $_GET['current_photo'];
  3. if ($current < 1) {
  4. die("Błędne foto");
  5. }
  6. $query = "SELECT * FROM `photos` WHERE `" . $nav . "` = '" . $value . "' ORDER BY " . $nav . " ASC LIMIT " . ($current - 1). ", 18446744073709551615"; // 18446744073709551615 to max mysql number
  7. $result = mysql_query($query);
  8. $ilosc_fotek = mysql_num_rows($result); 
  9.  
  10. if (!$ilosc_fotek) {
  11. die("Błędne foto");
  12. } elseif($current == 1) {
  13. $next = $current + 1;
  14. $prev = $ilosc_fotek;
  15. } elseif ($ilosc_fotek == 1) {
  16. $next = 1;
  17. $prev = $current -1;
  18. } else {
  19. $next = $current + 1;
  20. $prev = $current - 1;
  21. }
  22. ?>


Tutaj szukasz zdjęcia po danych kryteriach, potem wybierasz pierwsze, określone przez $_GET['current_photo'].
Jeśli jako current dasz ujemną albo liczbe większą niż jest zdjęć w wyszukiwanych kryteriach MySQL zwróci komunikat błednego photo.
Jako następną fotkę zastosuj $next jako poprzednią $prev.
hrehor
Dzieki za szybka odpowiedz. Przyswoilem kod, wkleilem na strone... no i dziala :-) ale nie do konca :-/
kod dziala... ale tylko na id=1 i id=2, pozniej wywala sie na drugim bledzie, co znaczy ze zapytanie SQL nie dziala...
Co oznacza wpis "($current - 1)" w zapytaniu SQL ? zakladam ze mam id w bazie danych o nastepujacych numerach 1, 2, 3, 4, 8 (tak mam). to czy jezeli wezmiemy 8, to wynikiem zapytania bedzie 7? jesli tak, to bez sensu (chodzilo mi o przeskoczenie rekordu, a nie odjeciu wartosci, poniewaz numery nie beda pokolei w bazie).
poza tym calosc kodu wyrzucilem do includowanego pliku (functions.php) i zrobilem z niego funkcje:

navigation ($nav,$value,$np,$current)
gdzie $current to wartosc $id (ogladana fotka)
a $np to next lub prev

  1. <?php
  2. function navigation($nav,$value,$np,$current) {
  3. // help od usera tomaszdurka z php.pl
  4. /*$nav = "category";
  5. $value = "arch";
  6. $np = "next"
  7. $current = $id;*/
  8.  
  9. if ($current < 1) {
  10. die("Błędne foto pierwszy");
  11. }
  12. $query_nav = "SELECT * FROM `photos` WHERE `".$nav."` = '".$value."' ORDER BY `".$nav."` ASC LIMIT ".($current - 1).", 18446744073709551615"; // 18446744073709551615 to max mysql number
  13. $result_nav = mysql_query($query_nav);
  14. $ilosc_fotek = mysql_num_rows($result_nav); 
  15.  
  16. if (!$ilosc_fotek) {
  17. echo "Drugi nav:".$nav." value".$value." np:".$np." current:".$current." id:".$id;
  18. } elseif($current == 1) {
  19. $next = $current + 1;
  20. $prev = $ilosc_fotek;
  21. } elseif ($ilosc_fotek == 1) {
  22. $next = 1;
  23. $prev = $current -1;
  24. } else {
  25. $next = $current + 1;
  26. $prev = $current - 1;
  27. }
  28.  
  29. if ($np = "next"){
  30. echo $next;
  31. }
  32. else
  33. echo $prev;
  34. }
  35. ?>


w kodzie strony do adresu hrefa
  1. <? navigation(ee_date,$row['ee_date'],prev,$id) ?>// - dla daty i zdjecia wstecz
  2. <? navigation(ee_date,$row['ee_date'],next,$id) ?>// - dla daty i zdjecia wprzod
  3.  
  4. <? navigation(category,$row['category'],prev,$id) ?>// - dla kategorii wstecz
  5. <? navigation(category,$row['category'],next,$id) ?>// - dla kategorii wprzod


zaznaczam ze na id=1 i 2 dziala, wiec skladania jest chyba ok
wiecej pomocy :-)
Hrehor
tomaszdurka
$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.
bendi
  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.
hrehor
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
tomaszdurka
A ja się tu staram żeby jedno zapytanie było... smile.gif
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.