Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL]Nawigacja
Forum PHP.pl > Forum > PHP
marcio
Witam pisze sobie modul nawigaji i mam jeden problem chce zrobic przesuwanie linkow w gore/dol w danej kategorii na stronie myslalem ze bedzie to pestka ale trzeba tam duzo warunkow i mam problem bo mi sie juz to wszystko placze mam taka "podstawowa" funkcje:
  1. <?php
  2. function move_link($id, $site, $wh) {
  3.  
  4. $sql_old = mysql_query('select * from navigation where id = '.(int)$id.' limit 1');
  5. $old = mysql_fetch_assoc($sql_old);
  6.  
  7. if($wh = 'up') $sql_move = mysql_query('select * from navigation where id < '.(int)$id.' and site = "'.mysql_real_escape_string($site).'" order by id asc limit 1'); else $sql_move = mysql_query('select * from navigation where id > '.(int)$id.' and site = "'.mysql_real_escape_string($site).'" order by id desc limit 1');
  8.  
  9. if(mysql_num_rows($sql_move) > 0) $new = mysql_fetch_assoc($sql_move);
  10.  
  11. if(!empty($new['id'])) {
  12.  
  13. if(mysql_query('update navigation set link = "'.$old['link'].'", name_href = "'.$old['name_href'].'", site = "'.$old['site'].'" where id = '.$new['id'].'') && mysql_query('update navigation set link = "'.$new['link'].'", name_href = "'.$new['name_href'].'", site = "'.$new['site'].'" where id = '.$old['id'].'')) $message = get_error('#0B0', '#eee', '#0B0', 'Link zostal przesuniety'); else $message = get_error('#FF0000', '#eee', '#FF0000', 'Blad: '.mysql_error());
  14. }
  15. else $message .= 'Brak nowego id<Br>';
  16. $data = $message;
  17. return $data;
  18. }
  19.  
  20. //wywoluje
  21. if(isset($_GET['view']) && $_GET['view'] == 'navigation' && isset($_GET['select']) && !empty($_GET['select']) && isset($_GET['action']) && ($_GET['action'] == 'up' || $_GET['action'] == 'down') && isset($_GET['id']) && !empty($_GET['id'])) $zawartosc = move_link($_GET['id'], $_GET['select'], $_GET['action']);
  22. ?>

No i tu zaczynaja sie schodki bo linki czasami sie nie zmieniaja a czasami sie zmieniaja tak jak ja nie chce.

Mialo by to tak dzialac mam np takie linki na stronie index.php:
Strona glowna
Rejestracja
Administracja

Teraz po kliknieciu na Przesun do goru na link Strona Glowna albo link ma sie nie przesuwac albo ma sie zamienic miejscem z ostatnim linkiem skoro jest on pierwszy ale tak sie nie dzieje

Gdy klikne na Przesun w dol na link Administracja zamienia sie on z pierwszy czyli to jest ok

Gdy klikne na Przesun w dol na link Strona Glowna mam blad ze nie ma nowego ID wiec warunek z zapytaniu sql sie nie spelnia.

Gdy klikne na Przesun w gore na link Rejestracja link sie zamienia miejscem z linkiem Strona glowna czyli jest ok

Gdy klikne przesun w dol na link Rejestracja to Rejestracja staje sie pierwszym linkiem a Administracja ostatnim

Gdy klikne przesun w gore na link Administracja dostaje:
Administracja
Rejestracja
Strona glowna

Jak widac czasami dobrze dziala czasami zle musze uzupelnic tu kilka warynkow tylko nie wiiem na jakiej zasadzie je tam wepchnac i kiedy.

Oczywiscie jesli zmienie ten order by id desc na asc i viceversa i tak czy siak nie dziala w 100%

Czy ktos jest w stanie pomoc?
lukaszgolder
A nie łatwiej byłoby zroibć kolumne "kolejność" w bazie danych i robić to jakoś tak:
  1. <?php
  2. $stara_koeljnosc = ... mysql_query("SELECT `kolejnosc` FROM `navigation` WHERE id=5");
  3. mysql_query("UPDATE `navigation` SET koeljnosc=kolejnosc+1 WHERE koeljnosc=$stara_kolejnosc-1");
  4. mysql_query("UPDATE `navigation` SET kolejnosc=kolejnosc-1 WHERE id=5);
  5. ?>

i analogicznie w 2 strone
marcio
Nom w sumie moglbym ale zmienialem juz kilka razy strukture tej tabeli i w sumie potem by bylo troche kombinowania z dawaniem kolejnosci danemu linku na danej stronie i z wartosciami ujemnymi etc... chcialbym to chyba jednak zrobic na takiej strukturze jaka jest no chyba ze jeszcze ktos sie wypowie.
Darti
Poprę słowa @lukaszgolder, to jest chyba najprostsza metoda na kolejność (dodac kolumnę w bazie odpowiadającą za kolejność). a wartości ujemnych ustrzeżesz się sprawdzając, czy dany item jest SELECT MIN(kolumna_kolejnosci) FROM ... lub SELECT MAX (kolumna_kolejnosci), nie dajesz wtedy guzika przesuwania odpowiednio w dół i w górę.
Za pomocą SELECT MAX(...) rozwiazesz tez problem kolejności nowego linka.
Pamiętac jedynie trzeba, ze przy usuwaniu dobrze jest przesunąć kolejne linki o jeden w dół, dzięki czemu unikasz dziur (ale tutaj są różne koncepcje - czy w ogóle usuwac, czy przesuwac itd)
marcio
OK mialem troche czasu i pobawilem sie prawie dziala ale nie do konca mam:
  1. <?php
  2. function move_link($id, $site, $wh) {
  3.  
  4. $sql_old = mysql_query('select * from navigation where id = '.(int)$id.' and site = "'.mysql_real_escape_string($site).'" limit 1');
  5. $old = mysql_fetch_assoc($sql_old);
  6.  
  7. if($wh == 'up') {
  8.  
  9. $sql_move = mysql_query('select * from navigation where id < '.(int)$id.' and site = "'.mysql_real_escape_string($site).'" order by id desc');
  10.  
  11. if(mysql_num_rows($sql_move) > 0) $new = mysql_fetch_assoc($sql_move);
  12.  
  13. else {
  14.  
  15. $sql_move_one = mysql_query('select max(id) from navigation where site = "'.mysql_real_escape_string($site).'"');
  16.  
  17. if(mysql_num_rows($sql_move_one) > 0) {
  18. $max_nav = mysql_fetch_row($sql_move_one);
  19. $sql_max = mysql_query('select * from navigation where id = '.$max_nav[0].' limit 1');
  20. $new = mysql_fetch_assoc($sql_max);
  21.  
  22.    }
  23.  }
  24.  
  25. if(!empty($new['id'])) {
  26.  
  27. if(mysql_query('update navigation set link = "'.$old['link'].'", name_href = "'.$old['name_href'].'", site = "'.$old['site'].'" where id = '.$new['id'].'') && mysql_query('update navigation set link = "'.$new['link'].'", name_href = "'.$new['name_href'].'", site = "'.$new['site'].'" where id = '.$old['id'].'')) $data = get_error('#0B0', '#eee', '#0B0', 'Link zostal przesuniety o jedna pozycje do gory'); else $data = get_error('#FF0000', '#eee', '#FF0000', 'Blad: '.mysql_error());
  28.  }
  29. }
  30.  
  31. else {
  32.  
  33. $sql_move = mysql_query('select * from navigation where id > '.(int)$id.' and site = "'.mysql_real_escape_string($site).'" order by id asc');
  34.  
  35. if(mysql_num_rows($sql_move_one) > 0) $new = mysql_fetch_assoc($sql_move_one);
  36.  
  37. else {
  38.  
  39. $sql_move_one = mysql_query('select min(id) from navigation where site = "'.mysql_real_escape_string($site).'"');
  40.  
  41. if(mysql_num_rows($sql_move_one) > 0) {
  42. $min_nav = mysql_fetch_row($sql_move_one);
  43. $sql_min = mysql_query('select * from navigation where id = '.$min_nav[0].' limit 1');
  44. $new = mysql_fetch_assoc($sql_min);
  45.  
  46.        }
  47.    }
  48. if(!empty($new['id'])) {
  49.  
  50. if(mysql_query('update navigation set link = "'.$old['link'].'", name_href = "'.$old['name_href'].'", site = "'.$old['site'].'" where id = '.$new['id'].'') && mysql_query('update navigation set link = "'.$new['link'].'", name_href = "'.$new['name_href'].'", site = "'.$new['site'].'" where id = '.$old['id'].'')) $data = get_error('#0B0', '#eee', '#0B0', 'Link zostal przesuniety o jedna pozycje w dol'); else $data = get_error('#FF0000', '#eee', '#FF0000', 'Blad: '.mysql_error());
  51.  }
  52. }
  53.  
  54. return $data;
  55. }
  56. ?>

Oczywiscie potem funkcje poprawie zeby nie bylo tyle if'ow bedzie elastyczniejsza jednak nie dzialaja dobrze tylko te 2 rzeczy:
Cytat
Gdy klikne na Przesun w dol na link Strona Glowna mam blad ze nie ma nowego ID wiec warunek z zapytaniu sql sie nie spelnia.
Gdy klikne przesun w dol na link Rejestracja to Rejestracja staje sie pierwszym linkiem a Administracja ostatnim czyli dziala zle


I teraz nie wiem zabardzo co jest przyczyna tego czy ktos moze pomoc?
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.