![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 242 Pomógł: 0 Dołączył: 14.03.2003 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
witam,
mam taki problem: chcę zmieniać liczbę porządkową rekordu za pomocą skryptu php w trakcie uaktualniania danych w bazie. wyglądać ma to tak: 1. stan początkowy: position | rekord ------------------- 1 | rekord1 2 | rekord2 3 | rekord3 4 | rekord4 5 | rekord5 2. po zmianie: position | rekord ------------------- 1 | rekord1 2 | rekord5 3 | rekord2 4 | rekord3 5 | rekord4 3. po kolejnej zmianie: position | rekord ------------------- 1 | rekord1 2 | rekord2 3 | rekord5 4 | rekord3 5 | rekord4
powyższe rozwiązanie powoduje, że po każdym uaktualnieniu danych, czyli zmianie którejś z pozycji, te, które mają wyższą liczbę porządkową zwiększają ją o 1. problem tkwi w tym, że jeśli po raz kolejny uaktualnię dane w tabeli, te z wyższą liczbą porządkową znowu zwiększają ją o 1. wygląda to wtedy tak: 1. stan początkowy: position | rekord ------------------- 1 | rekord1 2 | rekord2 3 | rekord3 4 | rekord4 5 | rekord5 2. po zmianie: position | rekord ------------------- 1 | rekord1 2 | rekord5 3 | rekord2 4 | rekord3 5 | rekord4 3. po kolejnej zmianie: position | rekord ------------------- 1 | rekord1 2 | rekord2 3 | rekord5 5 | rekord3 6 | rekord4 jak zastosować pętlę, żeby rekord3 miał lp 4 a rekord4 lp 5? pozdrawiam Ten post edytował mpps 6.02.2008, 17:52:57 -------------------- www.mpps.pl
park maszynowy: apache 2.2.22 | php 5.4.0 | MySQL 5.0.10 | phpMyAdmin 3.5.0 | notepad ++ | pilsner urquell |
|
|
-Wieviór- |
![]()
Post
#2
|
Goście ![]() |
Generalnie chcesz osiągnąć to, że podnosić powiedzmy rekord 5 o jeden do góry, i te co są nad nim, mają opadać pod niego, tak? Czyli po prostu masz powiedzmy menu, każdy link oddzielny rekord, i ustalasz ich pozycję, poprzez strzałki góra/dół w administracji, tak?
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 242 Pomógł: 0 Dołączył: 14.03.2003 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
nie,
chodzi o to, żeby po każdej zmianie pozycji rekordu w bazie liczby porządkowe były zawsze po kolei, czyli: 1. 2. 3. 4. 5. a nie: 1. 2. 3. 6. 28. za każdym uaktualnieniem bazy (UPDATE) liczba porządkowa rekordów z większym position byłaby zmieniana - niektóre w dół, niektóre w górę, niektóre nie zmieniałyby swojej pozycji. jeśli dasz 5 po 1, to: 2->3, 3->4 a 4->5 kolejna zmiana - dajemy 2 po 1 i mamy: 5->3, 3->5, 4->6 (znika nam lp 4). w ten sposób robią się coraz większe 'dziury' między cyferkami ![]() tego chcę uniknąć -------------------- www.mpps.pl
park maszynowy: apache 2.2.22 | php 5.4.0 | MySQL 5.0.10 | phpMyAdmin 3.5.0 | notepad ++ | pilsner urquell |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 875 Pomógł: 122 Dołączył: 2.02.2008 Ostrzeżenie: (0%) ![]() ![]() |
Ja wymyśliłem coś takiego:
I mam nadzieje że nie masz pola "position" zdefiniowanego jako AUTOINCREMENT... ![]() Ten post edytował nowotny 6.02.2008, 22:41:36 |
|
|
-Wieviór- |
![]()
Post
#5
|
Goście ![]() |
Ogólnie wygląda to dobrze chyba, tylko trzeba pamiętać, że w pierwszym if'ie else oznacza =<, a więc też gdy są sobie równe, i choć nic to nie zmieni, to warto dodać elseif < i elseif =, bo nie trzeba wtedy robić zapytania do bazy. Inna sprawa, że proponuję lekką optymalizacje:
Nie potrzebne używać * i tworzyć tablicę, wyczytując całą tabelę z bazy danych, jeśli używamy tylko position ;] |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 242 Pomógł: 0 Dołączył: 14.03.2003 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
I mam nadzieje że nie masz pola "position" zdefiniowanego jako AUTOINCREMENT... ![]() no, jak bym używał do 'position', to nie potrzebowałbym takiego rozwiązania - za które bardzo Ci dziękuję, bo po lekkich modyfikacjach działa doskonale! Modyfikacje nie wpływają na funkcjonalność, dlatego nie będę zaśmiecał nimi tutaj miejsca. jeszcze raz wielkie dzięki!! jeśli komuś (może mi?) będzie się chciało, to może na podstawie Twojego rozwiązania rozwinąć temat i stworzyć np. skrypt do numerowania 'na nowo' danych w bazie. spotkałem się na tym forum wielokrotnie z pytaniem o możliwość optymalizacji bazy pod kątem nadania nowego 'id' w sytuacji, kiedy używa się 'auto_increment' i wiadomo, że po wyrzuceniu jakiegoś rekordu powstają 'dziury'. wiem, wiem, że zmiana 'id' może powodować błędy, itd, bla, bla, ale są takie sytuacje, kiedy taka zmiana jest pożądana! Inna sprawa, że proponuję lekką optymalizacje: Nie potrzebne używać * i tworzyć tablicę, wyczytując całą tabelę z bazy danych, jeśli używamy tylko position ;] a nie prawda! jak zassiesz z bazy tylko 'position', to jest problem, ponieważ nie zostanie zmieniona pozycja elementu, który już taką pozycję ma (pole nie jest 'primary', bo być nie może)! czyli, jeśli zmienisz 9->6, to 6->6 a nie 6->7 jeszcze nie wiem czemu ale właśnie to sprawdzam od siebie dodaję zmianę w sytuacji usuwania rekordu:
proste ale jeśli ktoś będzie potrzebował, to ma komplet pozdrawiam i dzięki! Ten post edytował mpps 7.02.2008, 15:36:01 -------------------- www.mpps.pl
park maszynowy: apache 2.2.22 | php 5.4.0 | MySQL 5.0.10 | phpMyAdmin 3.5.0 | notepad ++ | pilsner urquell |
|
|
-Wieviór- |
![]()
Post
#7
|
Goście ![]() |
Słusznie, nie zauważyłem, że tam się jeszcze pole rekord pojawia. No to daj wszędzie zamiast "tabela" - "rekord, tabela". No chyba, że to są jedyne pola w tej tabeli, wtedy możesz dać rzeczywiście * ;]
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.06.2025 - 06:36 |