Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] pobieranie kolejnego elementu z zapytania
Forum PHP.pl > Forum > Przedszkole
lamcpp
witam,
wykonuje proste zapytanie na bazie:
  1. $wynik =mysqli_query($db,"SELECT id,nazwa,plik FROM czlowiek ORDER BY pozycja DESC");

Teraz odczytuje dane i porównuje je z rekordem wczytanym z GET,
a więc robię pętle która przebiega po wszystkich elementach i wyszukuje elementu o id takim samym jak to pobrane z GET
  1. while($tworze = mysqli_fetch_array($wynik))
  2. {
  3. if($tworze_min['id'] == $_GET['id'])
  4. {
  5. //jeśli istnieje podane ID to wyswietlam zdjecie, w którym przekazuje nowe ID
  6. echo "<a href='http://localhost/galeria/index.php?id=$res[0]" ><img src='".$images_dir."/tb_".$tworze[2]."' border='0' alt='".$tworze[1]."' /></a>";
  7. //a tu powinien być jakiś kod który sprawdzi mi i pobierze id albo pozycje natępnego elementu zapytania z while,
  8. //następnego czyli takiego który występuje w tablicy "tworze" bezposrednio po elemencie którego [id] jest równe $_GET['id']
  9. }
  10. }


Jeśli ID istnieje to wyświetlam dane zdjęcie i teraz jak wyciągnąć następny element tego zapytania i poprzedni element tego zapytania (potrzebuje tego do zrobienia nawigacji zdjeć, back i next. Chciałem po id np id-1, oraz id+1 ale id mogą być różne, chciałem po pozycji ale pozycja może miec ten sam numerek albo też dwa numerki wiecej...Czy jest jakaś np. funkcja w PHP za pomocą której mogę wyciągnąć następny element zapytania (po tym jak spełniony został warunek: if($tworze_min['id'] == $_GET['id'])) oraz poprzedni element.
maly_swd
1. sprawa, powinienes juz w zapytaniu ograniczyc liczbe elementow do tego z id z geta... ale to pozostawiam Tobie

tu znajdziesz opis problemu poprzedni i nastepny http://nospor.pl/mysql-faq-n25.html#faq-4
Istari
Mordercze pytanie do serwera!

Zapytaj o konkretne id i o jeden większe
  1. SELECT id,nazwa,plik FROM czlowiek WHERE id >= {$_GET['id']} ORDER BY pozycja ASC LIMIT 2


To Ci da aktualną oraz następną pozycję od ręki

Potem o jeden mniejsze
  1. SELECT id,nazwa,plik FROM czlowiek WHERE id < {$_GET['id']} ORDER BY pozycja LIMIT 1


i masz dwa zapytania pobierające 3 rekordy, a nie całą tabelę
lamcpp
ale mi bardziej chodzi o funkcje w php, która sprawdzałaby jaki jest następny element po bierzącym, albo wyświetlała poprostu kolejny element. BO te zapytania SQL w przypadku mojego kodu nie będą miały raczej zastosowania;/
darko
Cytat
BO te zapytania SQL w przypadku mojego kodu nie będą miały raczej zastosowania;/


Nie? A po czym wnosisz? Chyba, że po schodach... winksmiley.jpg
Crozin
Również nie mogę zrozumieć dlaczego niby podane przez Istari zapytania nie mogły by być użyte, ale do cofnięcia się lub posunięcia do przodu możesz użyć http://pl.php.net/manual/en/function.mysql-data-seek.php
lamcpp
już tłumacze na przykładzie swojego kodu dlaczego uważam że nie da rady u mnie użyć tych funkcji na przykładzie wycinka swojego kodu galerii zdjęć:
1) Miniaturki są wyświetlane na podstawie decyzji użytkownika, w menu mam około 30 pozycji, po wybraniu którejkolwiek z nich pojawiają się miniaturki wyfiltrowane za pomocą instrukcji WHERE zgodnie z daną pozycją
Kod:
  1. if(($nr == 'czwar') && ($id_kat) && ($id_miejsca)) //wyświetla 4 pozycje menu: kategoria -> miejsce
  2. {
  3. $wynik = mysqli_query($dbc,"SELECT zdjecie.id,nazwa,plik FROM zdjecie
  4. WHERE id_kategorii=$id_kat AND id_miejsca=$id_miejsca LIMIT $start,$strona");
  5. $num = mysqli_num_rows($wynik);
  6. if(empty($num))
  7. {
  8. echo 'Brak zdjęć do wyświetlenia<br />';
  9. }
  10. else
  11. {
  12. while($res = mysqli_fetch_array($wynik))
  13. {
  14. $size = GetImageSize($images_dir."/tb_".$res[2]);
  15. if($size[0] > $size[1])
  16. {
  17. $wyswietlam = "<div id='zdjecie_poz'>";
  18. if($counter == $number_of_thumbs_in_row)
  19. {
  20. $counter = 1;
  21. echo "<br /><br />\n";
  22. }
  23. else
  24. $counter++;
  25. echo $wyswietlam."<a href='index.php?wysw=yes&id=$res[0]&plik=$res[2]&nazwa=$res[1]"."' title='$bierzacy_adres'><img src='".$images_dir."/tb_".$res[2]."' border='0' alt='".$res[1]."' /></a>"."</div>";
  26. }
  27. else if($size[0] < $size[1])
  28. {
  29. $wyswietlam = "<div id='zdjecie_pion'>";
  30. if($counter == $number_of_thumbs_in_row)
  31. {
  32. $counter = 1;
  33. echo "<br /><br />\n";
  34. }
  35. else
  36. $counter++;
  37. echo $wyswietlam."<a href='index.php?wysw=yes&id=$res[0]&plik=$res[2]&nazwa=$res[1]"."' title='$bierzacy_adres'><img src='".$images_dir."/tb_".$res[2]."' border='0' alt='".$res[1]."' /></a>"."</div>";
  38.  
  39. }
  40. }
  41. }
  42. }


Daje tu tylko okrojony kod bo tych instrukcji jest duzo wiecej tylko w kazdej zmienia się zapytanie (dlatego mogą się tu nawiasy zamykające niezgadzać)
Tak jak wspomniałem ten kod służy do tego by w zależnosci czy istnieją zmienne GET przesłane po nacisnieciu jakiejs pozycji menu wysłał zapytanie do bazy odnosnie jakiejs tam liczby zdjec. Jeśli jakieś zdjęcia są to wyświetlają się w formie miniaturek, znow w linku z GET,, w którym przesyłam nazwe zdjęcia, id oraz jego plik, który posłuzy mi do identyfikacji, która miniaturka ma się otworzyć jako duże zdjęcie.
Podsumowując tą część: mam wielopoziomowe menu, oparte na wielu zapytaniach do bazy odpowiednio filtrowanych poprzez WHERE. W zależnosci od kliknięcia w daną pozycje menu, dane zostają odczytane z bazy i wyswietlone jako miniaturki.
Teraz tworzenie dużych zdjęć. Ważne jest dla mnie aby zdjęcia otwierały się w tej samej stronie i w pojemniku (divie) tam gdzie tresc.
Więc w głownym pliku index.php wpisuje kod:


  1. if($_GET['wysw'] && $_GET['id'] && $_GET['plik'])
  2. {
  3.  
  4. if($tworze_min['id'] == $_GET['id'])
  5. {
  6. echo "<a href='index.php?id={$_GET['id']}&wysw=yes'><img src='".$images_dir."/".$_GET['plik']."' border='0' alt='".$res[1]."' /></a>";
  7. }
  8. }

I ok mam wyświetlone duże zdjęcie, ale chciałem tez do niego zrobić nawigacje. Tylko no wlasnie problemem jest to że jestem teraz w pliku index.php, a wszystkie zapytania do bazy są w pliku wyswietl_miniaturki.php. Można by było tutaj w tym pliku poprostu przepisać to samo zapytanie, które służyło do utworzenia miniaturek i na tej podstawie za pomocą zapytan SQL, które mi wyzej podaliscie utworzyć linki NEXT i PREW. Tyle że problem jest następujący..tych zapytan jest około 30..i kazde składniowo wygląda inaczej i generuje inne miniaturki. Dlatego sobie pomyslałem ze jeżeli teraz wkleje to jedno konkretne zapytanie, do tej konkretnej grupy miniaturek, to to samo będę musiał zrobić dla innych, a więc musiałbym przeklejac kazde zapytanie do tego pliku, sprawdzac jaki jest nastepny i poprzedni element i wtedy wyswietlac. Inna sprawa jak odróznić te zapytania, zeby wiedziec ktore miniaturki wyswietlic w pełnym oknie,jesli tak jak widać powyzej wszystko jest sprawdzane po jednej linice:if($_GET['wysw'] && $_GET['id'] && $_GET['plik']).
Myślałem ze w tym przypadku najlepszym rozwiązaniem będzie.. przesłać samo zapytanie, które zostało utworzone do stworzenia miniaturek i juz dwa problemy rozwiązane, bo nie musze pisac zapytania, i nie musze wymyslac jakiegos sposobu na identyfikacje jakie zdjecia mają zostać wyswietlone. Jak pomyslałem tak też starałem sie zrobić. Za pomocą sesji przesyłałem same zapytania jako łancuch znaków np tak:
w pliku w którym było odpowiednie zapytanie do tworzenia miniaturek tworzyłem zmienną sesyjną i przypisywałem jej własciwe zapytanie tworzące miniaturki np.
  1. $query = "SELECT * FROM costam WHERE jakiswarunek>ilus";
  2. $_SESSION['co_wys'] = $query;

i miałem juz zapytanie w sesji. Następnie w pliku index.php odtwarzałem to zapytanie np. tak:
  1. $do_wysw = $_SESSION['co_wys'];
  2. $sprawdz = mysqli_query($dbc,"$do_wysw");

I w tym momencie własciwie stanęłem. a wlasciwie nawet udało mi sie stworzyć kod odpowiedzialny za przycisk "NEXT" i działał on poprawnie, ale przycisku "PREVIOUS" nie udało sie utworzyć, a kod wyglądał tak:
  1. while($tworze_min = mysqli_fetch_array($sprawdz))
  2. {
  3. if($tworze_min['id'] == $_GET['id'])
  4. {
  5. echo "<a href='index.php?id={$_GET['id']}&wysw=yes'><img src='".$images_dir."/".$tworze_min['plik']."' border='0' alt='".$res[1]."' /></a>";
  6. }
  7.  
  8. if($tworze_min['id'] > $_GET['id'] && $_GET['id'] !='')
  9. {
  10. echo "<a href='index.php?wysw=yes&nav=next&id=".$tworze_min['id']."'>Następne</a>";
  11. exit();
  12. }
  13.  
  14.  
  15. }


Tłumacząc go, jeśli pobrane za pomocą GET id ma tą samą wartość co w zapytaniu (pobranym z sesji) to wyswietlamy pełne zdjęcie, a kod ponizej(instrukcja if) jeśli wartosc 'id' pobrana z zapytania uzyskanego dzięki sesji jest większe niż id bierzącej miniaturki i nie pusta to tworzymi linka do tej wartosci i nadajemy mu wartość tego id.
Co do linka "PREVIOUS" nie mozna tak za bardzo zrobic analogicznie bo wtedy będzie się wyswietlac tylko NEXT albo tylko PREVIOUS.

Dlatego własnie pomyslałem sobie ze jesli miałbym funkcje która odczyta kolejny element zapytania, czyli tak jak w moim przypadku: mam załózmy za pomocą GETA odczytane id o wartosci 15, i teraz za pomocą jakieś funkcji szukam wartości o następnym id (bo wcale nie koniecznie musi miec 16) i przekazuje do linka, który bedzie słuzył jako przycisk "NEXT" przy przewijaniu zdjęcia, i analogicznie to samo dla funki PREVIOUS.
Funkcje dostałem powyzej od Was, ale nie bardzo wiem jak ją uzyc.
uff troche się napisałem, jesli ktos ma jakis pomysł to prosiłbym o pomoc:)
maly_swd
  1. SELECT id,nazwa,plik FROM czlowiek WHERE id >= {$_GET['id']} ORDER BY pozycja ASC LIMIT 2

niestety ale to zapytanie jest bledne:)
Odpowiedz co sie stanie jesli nie bedzie ID=$_GET['id'] ?
Wtedy dostaniemy bledne dane
lamcpp
no i własnie tu jest problem,
To zapytanie jest poprawne ale nie pasuje do mojego kodu:
jest poprawne dlatego, że $_GET['id'] będzie istniał zawsze ponieważ jest pobierany z linku miniaturki,
a nie pasuje do mojego kodu, ponieważ z racji tego że mam bardzo dużo zapytan na stronie, każdą treść zapytania pobieram w formie sesji, wstawiam ją do pliku index.php i na niej wykonuje zapytanie WHILE. a więć mająć już pobraną tresc zapytania, które moze wyglądac róznie, nie mogę go w pliku index.php zmodyfikować..mogę tylko wykorzystać np odczytując zawartość z mysqli_fetch_array. Stąd własnie uważam ze te dwa zapytania podane przez Was powyzej, no nie mam jak ich zastosować.;/ Nie wiem może ratunkiem było by przesyłanie z każdym zapytaniem np. tablicy, która zawierała by wyniki danego zapytania (w sensie np. przechowywała by wszystkie pola ID danego zapytania) i pozniej zrobić WHILE($cos =zapytanie odczytane z sesji) { tresc} i w tresci jakoś porównywać tą tablicę z ID otrzymanym z metody GET i jeśli $_GET['id'] == tablica['id'] to wyswietlamy zdjecie w pełnym ekranie
jesli $_GET['id'] > tablica['id'] to przycisk wstecz i podany link do tego mający w sobie id=$_GET['id']
jesli $_GET['id'] < tablica['id' to przyisk dalej i podany link do tego mający w sobie id=$_GET['id']
tylko problem jest taki, że za bardzo nie wiem jak przenieść tą tablicę pomiedzy plikami z pliku 'wyswietl_miniaturki.php' do pliku 'index.php', moze by ją zrobić jako globalna? Prosiłbym o Wasze opinie, pomysły..jak można to rozwiązac i czy z tą tablicą to w miarę dobre rozwiązanie i czy mozna to ciągnąć?
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.