Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php][mysql] zmiana liczby porządkowej rekordu
mpps
post
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

  1. IF($position!=$rek[position]){
  2. mysql_query("UPDATE tabela SET position=position+1 WHERE position>=$position") OR die(mysql_error());
  3. }


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
-Wieviór-
post
Post #2





Goście







Cytat(nowotny @ 7.02.2008, 00:40:21 ) *


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:

  1. <?php
  2. $position_doc='7';//pozycja docelowa gdzie chcemy umiescic rekord
  3. $rekord='trzy';//nazwa rekordu ktory chcemy przesunac
  4.  
  5. $query='SELECT position FROM tabela WHERE rekord="'.$rekord.'"';
  6. $result=mysql_query($query);
  7. $rekord_current_position=mysql_fetch_assoc($result);
  8.  
  9. if($rekord_current_position>$position_doc) {
  10. $direction='back';
  11. $query='SELECT position FROM `tabela` WHERE `position` BETWEEN '.$position_doc.' AND '.$rekord_current_position.';';
  12. }
  13. else {
  14. $direction='forw';
  15. $query='SELECT position FROM `tabela` WHERE `position` BETWEEN '.$rekord_current_position.' AND '.$position_doc.';';
  16. }
  17.  
  18. $result=mysql_query($query);
  19. while ($row = mysql_fetch_assoc($result)) {
  20. if($row==$rekord_current_position){
  21. $query='UPDATE tabela SET position="'.$position_doc.'" WHERE rekord="'.$row['rekord'].'"';
  22. }
  23. else{
  24. if($direction=='forw'){
  25. $query='UPDATE tabela SET position="'.($row['position']-1).'" WHERE rekord="'.$row['rekord'].'"';
  26. }
  27. else{
  28. $query='UPDATE tabela SET position="'.($row['position']+1).'" WHERE rekord="'.$row['rekord'].'"';
  29. }
  30. }
  31. mysql_query($query);
  32. }
  33. ?>


Nie potrzebne używać * i tworzyć tablicę, wyczytując całą tabelę z bazy danych, jeśli używamy tylko position ;]
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 27.12.2025 - 00:02