Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Przełączanie rekordów-problem z sortowaniem
Forum PHP.pl > Forum > Przedszkole
rafik73
Witam
Mam dajmy na to listę:
id | imie | nazwisko
1 adam nowak
2 alicja kowalska
4 barbara kowalska
3 malwina kowalska
5 janina zabitowska

wyświetlam ją w tej postaci (alfabetycznie), po kliknięciu na link, metodą $_GET przesyłam id rekordu i otwieram go
w widoku pojedyńczym, gdzie jest wyświetlone więcej szczegółów. W widoku pojedyńczego rekordu dodałem możliwość przechodzenia pomiędzy pojedyńczymi
rekordami, żeby za każdym razem nie wracać do listy. Rozwiązałem to za pomocą:
  1. $poprz = mysql_query("SELECT * FROM test WHERE id < '$id' ORDER BY id DESC LIMIT 1");//poprzedni
  2. $nast = mysql_query("SELECT * FROM test WHERE id > '$id' ORDER BY id ASC LIMIT 1");//następny

Wszystko cyka, ładnie przełącza, tylko....nie w kolejności alfabetycznej, przełącza mi takiej kolejności (wg id):
id | imie | nazwisko
1 adam nowak
2 alicja kowalska
3 malwina kowalska
4 barbara kowalska
5 janina zabitowska

Jak zrobić, żeby przełączał w kolejności alfabetycznej (wg schematu ORDER BY nazwisko , imie ASC)?
Aqu
  1. SELECT * FROM `test ` WHERE CONCAT(imie, nazwisko) > "xxx" LIMIT 1

Wydaje mi się, że coś takiego powinno zadziałać.
rafik73
A czym jest "xxx"?

ok, roozumię, że xxx to nazwa dla połączonych kolumn, ale jak to odnieść do sortowania?

Jakieś pomysły?
Kshyhoo
A z czym masz prpblem dodać ORDER BY nazwisko, imie; ?
  1. SELECT * FROM test WHERE id < '$id' ORDER BY nazwisko, imie id ASC LIMIT 1
rafik73
Żaden, bo dodawałem, tylko, że efekt jest taki, że pomija rekord o id=3

Listing przełączania pojedyńczego rekordu:

  1. $a = $_REQUEST['a']; //tu pobieram wartości
  2. $id = $_GET['id']; //po wyborze z listy w osobnym pliku oraz z panelu przełączania
  3.  
  4. $max_query = mysql_query("SELECT MAX(id)AS max FROM test "); //identyfikacja ostatniego id
  5. $max_guery_array=mysql_fetch_assoc($max_query);
  6. $max=$max_guery_array[max];
  7.  
  8. $min_query = mysql_query("SELECT MIN(id)AS min FROM test "); //identyfikacja pierwszego id
  9. $min_guery_array=mysql_fetch_assoc($min_query);
  10. $min=$min_guery_array[min];
  11.  
  12. $poprz = mysql_query("SELECT * FROM test WHERE id < '$id' ORDER BY id DESC LIMIT 1"); //przełączanie wstecz
  13. $poprz1=mysql_fetch_assoc($poprz);
  14. $p=$poprz1[id];
  15.  
  16. $nast = mysql_query("SELECT * FROM test WHERE id > '$id' ORDER BY id ASC LIMIT 1"); //przełączanie do przodu
  17. $nast1=mysql_fetch_assoc($nast);
  18. $n = $nast1[id];
  19.  
  20. if ($p<$min) $poprzednia = "poprzednia" ; //deaktywacja"poprzednia" na pierwszym rekordzie w tabeli
  21. else
  22. $poprzednia = '<a href="details.php?a=edit&amp;id='.$p.'">poprzednia</a>' ;
  23.  
  24. if ($id>=$max) $nastepna = "następna" ; //deaktywacja"następna" na ostatnim rekordzie w tabeli
  25. else
  26. $nastepna = '<a href="details.php?a=edit&amp;id='.$n.'">następna</a>' ;
  27.  
  28. echo $poprzednia.' ... '.$nastepna; //panel przełączania
  29.  
  30.  
  31. if($a == 'edit' and !empty($id)) {
  32.  
  33. $wynik = mysql_query("SELECT * FROM test WHERE id='$id'")
  34. or die('Błąd zapytania'); //wyciągnięcie danych do rekordu
  35. //poniżej kod wyświetlający zawartość
nospor
http://nospor.pl/mysql-faq.html#faq-4
Masz tam napisane jak wyznaczac sasiadow w sortowaniu dowolnyn a nie tylko po ID
rafik73
Jak to teraz zaadaptować do mojego przykładu?

Nie chce działać, wywala błędy z @
nospor
Jak robisz jakis kod, to ZAPAMIETAJ Sobie, ze nalezy podac jak ten kod wyglada i dokładne komunikaty bledow.
rafik73
unexcepted '@'

Jeśli to zmienne, to czy nie powinno być z $?

Parse error: syntax error, unexpected '@' in D:\WebServ\httpd\details.php on line 28

W tej postaci nie wywala błędu:

  1. mysql_query("SET @nr = 0, @id=5, @idprev = 0,@idprevfound=0, @idnext=0,@idnextfound=0");
  2. mysql_query("SELECT @nr:=@nr+1,
  3. if(id<>@id and not @idprevfound, @idprev := id,if(@idprevfound,null,@idprevfound:=1)),
  4. if(id=@id, @idnextfound := 1,if(@idnextfound and not @idnext,@idnext := id, null)) FROM tabela1 order by pole");
  5. mysql_query("SELECT @idprev prev, @idnext next");


Walczę dalej...
nospor
Cytat
Jeśli to zmienne, to czy nie powinno być z $?
Nie, nie powinny. Zmienny mysql a zmienn php to dwie rozne sprawy...

Cytat
W tej postaci nie wywala błędu:
No, bo tak wlasnie mialo byc... boje sie zapytac co miałeś wczesniej...
rafik73
Rozumię, że samo id oznacza kolumne z indeksem tabeli?
nospor
Tak, id oznacza kolumne będącą kluczem głównym autoincremetnujacym w tabeli. Jesli u Cibie to pole nazywa sie inaczej, to masz tam wstawić twoją nazwe
rafik73
Działa!!!!
nospor - szacun. Nie ma to jednak jak się samemu po śladzie dojdzie do ładu.
Teraz tylko muszę "hamulce" założyć, żeby mi poza zakresy nie wychodziło. :-)
Serdeczne dzięki!!!

A da się z tego zrobić przełączanie "ostatni","pierwszy"?
nospor
Cieszę się, że sam do tego pomału doszedłeś smile.gif

Wstaw jednak poprawny kod - dla potomnych - nie bądź sknera smile.gif

order by pole asc limit 1 - pierwszy
order by pole desc limit 1 - ostatni
rafik73
OK, narazie wersja bez "hamulców", wyróżniłem elementy składni mysql wielkimi literami (czytelniej - słaby wzrok mam):

  1. $a = $_REQUEST['a'];
  2. $id = $_GET['id'];//pobieram id z listy
  3.  
  4. mysql_query("SET @nr = 0, @id=$id, @idprev = 0,@idprevfound=0, @idnext=0,@idnextfound=0");
  5. mysql_query("SELECT @nr:=@nr+1,
  6. IF(id<>@id AND NOT @idprevfound, @idprev := id,IF(@idprevfound,NULL,@idprevfound:=1)),
  7. IF(id=@id, @idnextfound := 1,IF(@idnextfound AND NOT @idnext,@idnext := id, NULL)) FROM test ORDER BY name");
  8. $t=mysql_query("SELECT @idprev prev, @idnext next");
  9. echo $t1[next];//to do testów ;)
  10. echo $t1[prev];//to do testów ;)
  11. $n=$t1[next];
  12. $p=$t1[prev];
  13.  
  14. $poprzednia = '<a href="details.php?a=edit&amp;id='.$p.'">poprzednia</a>' ;
  15. $nastepna = '<a href="details.php?a=edit&amp;id='.$n.'">następna</a>' ;
  16.  
  17. echo $poprzednia.' ... '.$nastepna;
nospor
Pisz poprawnie....

nie: $t1[next]
a: $t1['next']

Włącz wyswietlanie wszystkich błędów to bedziesz widział gdy piszesz źle.
rafik73
Cytat(nospor @ 7.04.2015, 12:04:18 ) *
Cieszę się, że sam do tego pomału doszedłeś smile.gif

Wstaw jednak poprawny kod - dla potomnych - nie bądź sknera smile.gif

order by pole asc limit 1 - pierwszy
order by pole desc limit 1 - ostatni


hmmm, tylko, że to rozwiązanie wymaga oddzielnych zapytań, a twoje jest zrobione na jednym...


Cytat(nospor @ 7.04.2015, 12:09:49 ) *
Pisz poprawnie....

nie: $t1[next]
a: $t1['next']

Włącz wyswietlanie wszystkich błędów to bedziesz widział gdy piszesz źle.

Dzięki za uwagę
nospor
last to na dobrą sprawę @nr
Zas first to pierwsze ustawienie @nr - praca domowa dla Ciebie smile.gif
rafik73
Ok, to jestem na etapie jak z twojego hasła:
'"Myśl, myśl, myśl..." - Kubuś Puchatek' :-)

Wiedziałem, że mnie dogłębna analiza nie ominie, ale to zaowocuje na przyszłość

Tylko się upewnie:


if(id<>@id and not @idprevfound, @idprev := id,if(@idprevfound,null,@idprevfound:=1)

czerwony - warunek
zielony - true
niebieski - false

czy tak?
nospor
tak
rafik73
"pierwsza" działa tak:


  1. mysql_query("SET @nr = 0, @id=$id, @idprev = 0,@idprevfound=0, @idnext=0,@idnextfound=0");
  2. mysql_query("SELECT @nr:=@nr+1,
  3. IF(id<>@id AND NOT @idprevfound, @idprev := id,IF(@idprevfound,NULL,@idprevfound:=1)),
  4. IF(id=@id, @idnextfound := 1,IF(@idnextfound AND NOT @idnext,@idnext := id, NULL)) FROM test ORDER BY name LIMIT 1");
  5. $t=mysql_query("SELECT @idprev first");
  6.  
  7. echo $t1[first];//to do testów ;)
  8.  
  9. $p=$t1[first];
  10.  
  11. $pierwsza = '<a href="details.php?a=edit&amp;id='.$p.'">pierwsza</a>' ;
  12.  
  13. echo $pierwsza.' ... '.$ostatnia;


i jest OK

"ostatnia":

  1. mysql_query("SET @nr = 0, @id=$id, @idprev = 0,@idprevfound=0, @idnext=0,@idnextfound=0");
  2. mysql_query("SELECT @nr:=@nr+1,
  3. IF(id<>@id AND NOT @idprevfound, @idprev := id,IF(@idprevfound,NULL,@idprevfound:=1)),
  4. IF(id=@id, @idnextfound := 1,IF(@idnextfound AND NOT @idnext,@idnext := id, NULL)) FROM test ORDER BY name LIMIT 1");
  5. $t=mysql_query("SELECT @idnext last");
  6.  
  7. echo $t2[last];//to do testów ;)
  8.  
  9. $o=$t1[last];
  10.  
  11. $ostatnia = '<a href="details.php?a=edit&amp;id='.$o.'">pierwsza</a>' ;
  12.  
  13. echo $pierwsza.' ... '.$ostatnia;


i zwraca zero
nospor
Mowilem ci, ze last to poprostu @nr.
Zas first to pierwsze przypisanie @nr
rafik73
czyli dla last?:
  1. $t=mysql_query("SELECT @nr last");
nospor
Tak, ale dodajesz to do zapytania, ktore pobiera inne rzeczy:
$t=mysql_query("SELECT @idprev prev, @idnext next, @nr last");
rafik73
zaraz ,zaraz, to ma podać numer indeksu czy liczbę rekordów?
Bo rekordy mam 23 i taką mi odczytuje a ostatni indeks u mnie ma wartość 30

"first" pokazuje dobrze czyli 9, a taki jest numer pierwszego indeksu
nospor
Tak, faktycznie, sie jorblem co do last....

select @nr:=@nr+1, @last := id,....
i dodaj deklaracje zmiennej @last do pierwszego zapytania
rafik73
Teraz gitarra :-)

Nad "hamulcami" popracuje, jak skończe dam znać

No to czas na 'hamulce': smile.gif

  1. if($f == 0){ // $f to 'first'
  2. $pierwsza="Pierwsza";
  3. $poprzednia="Poprzednia";
  4. }
  5. else
  6. {
  7. $pierwsza = '<a href="test.php?a=edit&title='.$title.'&set='.$set.'&amp;id='.$f.'" class="navi">ŤŤ Pierwsza</a>' ;
  8. $poprzednia = '<a href="test.php?a=edit&title='.$title.'&set='.$set.'&amp;id='.$p.'" class="navi">Ť Poprzednia</a>' ;
  9. }
  10. if($_GET['id'] == $l){ // $l to 'last'
  11. $nastepna="Następna";
  12. $ostatnia="Ostatnia";
  13. }
  14. else
  15. {
  16. $nastepna = '<a href="test.php?a=edit&title='.$title.'&set='.$set.'&amp;id='.$n.'" class="navi">Następna ť</a>' ;
  17. $ostatnia = '<a href="test.php?a=edit&title='.$title.'&set='.$set.'&amp;id='.$l.'" class="navi">Ostatnia ťť</a>' ;
  18. }


Śmiga jak ta lala 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.