Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql]rekord w góre lub w dół...
Forum PHP.pl > Forum > Przedszkole
k0b3
Nie moge znaleść takiego tematu na forum.

Chodzi mi o możliwość zmiany kolejności danych wpisów w bazie

Mam wyświetlone za pomocą jakiegoś pliki.php dane wpisy z bazy xxx

1 aaaaa - w góre | w dół
2 bbbbb - w góre | w dół
3 cccccc - w góre | w dół
4 ddddd - w góre | w dół
5 eeeee - w góre | w dół
6 fffffffff - w góre | w dół
7 ggggg - w góre | w dół

za pomocą wciśniecia "w góre" wpis wędruje o jedną pozycję do góry np. id 2 zamienia się z 1
identycznie z "w dół" tylko wpis idzie o jedna pozycje niżej...

Jest jakieś gotowe rozwiązanie?
mdco
Nie zmieniaj ID tylko dodaj nowe pole LP i tą wartosc zmieniaj.
k0b3
aha.. czyli mam stworzyć sobie z ideksowaniem jakąś kolumne np. 'nr'?

Jak zmieniać jej waartość?
Za bardzo nie wiem jak przedsatwic to w kodzie...
Lonas
To moze pokaz jakis kod..
k0b3
Zaden błąd... W pierwszym poście chyba można zauważyc, że dopiero probuje coś takiego zapisać, a po drugie nie wiem jak sie do tego zabrać...

podobnie jest w panelu administracyjnym zarządzania forami phpbb2 by przemo

Jest możliwość przesówania działów forum w góre i w dół...
Balas
Juz ktos napisal, zrob sobie dodatkowe pole, np. kolejnosc, przy wyswietlaniu dajesz sortowanie wdg tej kolumny.
Przy zmianie kolejnosci masz tylko 2 proste zapytania (jedno kolejnosc +1, drugie -1).
k0b3
Dobra, dzieki za odp...
wiem o co chodzi, ale nie wiem jak to zapisac...

Niżej rozpatruje przenoszenie wpisu do góry o jeden.. W dół zapewne będzie analogicznie.

mam tak w bazie:


i do tego pierwsze zapytanie... Dodaje do wybranego wiersza +1 w kolumnie $nr

  1. <?php
  2. $query = "SELECT * FROM menu WHERE id = '".$_GET['id']."';";
  3. $wynik = mysql_query($query);
  4.  
  5. $rekord = mysql_fetch_assoc($wynik);
  6.  
  7. $id = $rekord['id'];
  8. $nr=$rekord['nr'];
  9. $typ=$rekord['typ'];
  10. $nazwa=$rekord['nazwa'];
  11.  
  12. $nrup1=$nr+1;
  13. $up = mysql_query ("UPDATE menu SET nr='".$nrup1."', typ='".$typ."', nazwa='".$nazwa."' WHERE id = '".$id."';");
  14. ?>


tylko teraz w bazie sa dwa wiersze o np. nr: 4
jak dodajac (+1) jednoczesnie odjąć (-1) od nr wyżej?

cieżko jest mi wytłumaczyć ten problem. Mam nadzieje ze się połapiecie

Zastanawiam sie, czy przypadkiem nie robie sobie zamieszania z takim zapytaniem.. Może jest łatwiejszy sposób? smile.gif
maryaan
masz przyklad z zamiana wartosci zmiennych
  1. <?php
  2. $a = 5;
  3. $b = 4;
  4. //teraz w Twojej wersji wyglada to tak
  5. $a = $b
  6. $b = //no wlasnie nie wiadomo co bo $a i $b to to samo...
  7. //a powinno byc tak
  8. $tmp = $b;
  9. $b = $a;
  10. $a = $tmp;
  11. ?>


oczywiscie $tmp to musi byc wartosc nieosiagalna przez inne wiersze (np 0 jesli zaczales numeracje od 1) i wykonane musza zostac wszystkie operacje albo zadna
Kicok
Ja kiedyś napisałem podobny skrypt, ale oparty na liczbach zmiennoprzecinkowych. Dzięki temu podczas zmiany pozycji jakiegoś elementu na liście wykonywane było tylko 1 zapytanie. Skrypt spisywał się całkiem nieźle, jak ktoś chce to może to sobie przeanalizować (AFAIK w phpBB3 też zastosowano podobne rozwiązanie):

  1. <?php
  2. // Pobieramy posortowane działy z bazy danych.
  3. // Informacje o działach przechowujemy w tablicy $dzialy,
  4. // a tablica $id służyć będzie do powiązania identyfikatorów działów z bazy z warto
    ściami tablicy $dzialy
  5. $dzialy = array();
  6. $id = array();
  7. $c = 0;
  8. $result = mysql_query('SELECT * FROM `dzialy` ORDER BY `pozycja` ASC;', $conn_id);
  9. while($row = mysql_fetch_assoc($result))
  10. {
  11. $dzialy[$c] = $row;
  12. $id[$row['id']] =& $dzialy[$c++];
  13. }
  14.  
  15.  
  16. // Teraz ustawiamy dla każdego działu wartość pola `pozycja` jaką miałby,
  17. // po przeniesieniu go o 1 w górę lub w dół
  18. for($i=0; $i<$c; $i++)
  19. {
  20. switch($i)
  21. {
  22. case 0: $dzialy[$i]['up'] = $dzialy[$i]['pozycja']; break;
  23. case 1: $dzialy[$i]['up'] = $dzialy[($i-1)]['pozycja'] / 2; break;
  24. default: $dzialy[$i]['up'] = ($dzialy[($i-2)]['pozycja'] + $dzialy[($i-1)]['pozycja']) / 2; break;
  25. }
  26.  
  27. switch($i)
  28. {
  29. case ($c-1): $dzialy[$i]['dowm'] = $dzialy[$i]['pozycja']; break;
  30. case ($c-2): $dzialy[$i]['down'] = (($dzialy[($i+1)]['pozycja'] * 2) + 1) / 2; break;
  31. default: $dzialy[$i]['down'] = ($dzialy[($i+1)]['pozycja'] + $dzialy[($i+2)]['pozycja']) / 2; break;
  32. }
  33. }
  34.  
  35.  
  36. // Jeśli trzeba to zmieniamy pozycję działu
  37. if(isset($_GET['act']))
  38. {
  39. $_GET['id'] = intval($_GET['id']);
  40. $_GET['act'] = ((($_GET['act'] == 'up') || ($_GET['act'] == 'down')) ? $_GET['act'] : 'pozycja');
  41.  
  42. mysql_query('UPDATE `dzialy` SET `pozycja` = '.$id[$_GET['id']][$_GET['act']].' WHERE (`id` = '.$_GET['id'].');', $conn_id);
  43.  
  44. header('Location: '.basename(__FILE__));
  45. exit();
  46. }
  47.  
  48. // a jeśli nie trzeba, to wyświetlamy listę działów
  49. echo('<table border="1" cellspacing="0" cellpadding="2" width="400">');
  50. for($i=0; $i<$c; $i++)
  51. {
  52. echo('<tr>');
  53. echo('<td width="200" align="center"><b>'.$dzialy[$i]['nazwa'].'</b></td>');
  54. echo('<td width="100" align="center">'.(($i != 0) ? '<a href="?act=up&amp;id='.$dzialy[$i]['id'].'">Do góry</a>' : '&nbsp;').'</td>');
  55. echo('<td width="100" align="center">'.(($i != ($c-1)) ? '<a href="?act=down&amp;id='.$dzialy[$i]['id'].'">Na dół</a>' : '&nbsp;').'</td>');
  56. echo('</tr>');
  57.  
  58. }
  59.  
  60. echo('</table>');
  61. ?>



Tabela `dzialy`:
Kod
+---------+-------------+-----------+
|   ID    |    nazwa    |  pozycja  |
|  (INT)  |  (VARCHAR)  |  (FLOAT)  |
+---------+-------------+-----------+
|    1    |    Dział1   |     1     |
|    2    |    Dział2   |     2     |
|    3    |    Dział3   |     3     |
|    4    |    Dział4   |     4     |
|    5    |    Dział5   |     5     |
k0b3
Świetny skrypcik!

Dzięki wielkie 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.