ugrás a tartalomhoz

rekord mozgatás

xeras · 2007. Okt. 14. (V), 22.53
sziasztok,

elvi kérdés lenne:
ki-hogyan oldaná meg egy rekord fel-le mozgatását egy adott táblán belül?

csináltam egy ilyet:

telefon1 LE
telefon2 FEL | LE
telefon3 FEL | lE
telefon4 FEL

tehát ha a fel vagy le linkre kattintok, akkor meghívna valamilyen parancsot,
de hogy pontosan hogy lehetne szépen egyszerűen megírni, arra többen jobb rájönni

köszi
 
1

Rendezés vizuálisan, majd ha kész, fizikailag adatbázisban.

s_volenszki · 2007. Okt. 14. (V), 23.39
Szia!

Én az ilyet úgy szoktam csinálni, hogy:

1. Az adatbázisban minden rekordhoz rendelek egy sorszám mezőt amire rendezek lekérdezéskor.
2. A lista elkészításekor a tr azonosítójába beírom a sorszámát (pl.:id = tel_112)
3. DHTML-el rendezgetem föl le az egész listát ahogy szükséges, majd a mentés gombra kattintáskor egy js feldolgozza az aktuális azonosítók sorrendjét és post-olom php + adatbázisnak, hogy rendeze.

Ez az én variációm! :)

s_volenszki
2

egyszerű php-s megoldás létezik?

xeras · 2007. Okt. 15. (H), 00.09
szia,

köszi a gyors választ, de mivel én csak a php-hez értek,
így ezzel szeretném megcsinálni. meg mivan ha a js nincs engedélyezve...

szerinted tisztán php-vel hogy érdemes? nekem ez a fel/le funkciós bőven megtenné,
ha lenne ötleted...
3

JS, JS,...

csla · 2007. Okt. 15. (H), 00.44
Ha a JS nincs engedélyezve, akkor 1993 van... ;)
Na jó, ez csak vicc volt, mielőtt jönnek az érvek, hogy de mer' így meg úgy, tudom. Amit viszont ki akartam ezzel fejezni, hogy ez az alkalmazástól is függ, bizonyos feltételek mellett meg lehet követelni a JS-t.
Ha JS nélkül szeretnéd, akkor csak egyszerűen a linkre kattintásra meghívod újra a szkripted, ami az adatbázisban elrendezi a sorszámok cseréjét, majd újra megjelenited az oldalt, nyilván ekkor már az új sorrendben fog "listázódni".
Látszik, hogy - főleg hosszabb lista esetén - elegánsabb a JS támogatta megoldás, de készítheted diszkréten is (ez mindig olyan jól hangzik :)), hogy ha van JS, akkor azzal csak a két elemet cseréled vizuálisan, ha nincs, akkor anélkül újratöltöd az egész oldalt.
5

...egyszerű php megoldás...

s_volenszki · 2007. Okt. 15. (H), 09.39
Szia!

Amikor én évekkel ezelőtt elkezdtem php-t tanulni, nagyon sokáig nem értettem, hogyan jön össze a php meg a js! Aztán egy nagyon jó olvasmány segített megérteni valamit, amit úgy hívnak: Kliens szerver modell.

Ezek után rájöttem, hogy ha tisztán php rendezi a listáimat, akkor minden egyes listaelem mozgatás, szerverre menetelt és visszatérést jelent (konkrétan minden egyes rendezés egy újabb oldalletöltődés).

Ehhez képest, ha js rendezi a listát, akkor akár száz rendezési műveletet is végrhajtahtok, mire egyszer el kell menni a szerverre!

s_volenszki
9

tisztasor

xeras · 2007. Okt. 15. (H), 15.01
igen, látom hogy js-sel tényleg lehet egyszerre
sokat is módosítani (több oldalbetöltés nélkül),
viszont most ez egy rövid lista (max 5 elem),
ezért megteszi a sima php-s megoldás is...
4

mozgatás

pixelsys · 2007. Okt. 15. (H), 09.03
szia!

a legegyszerubb megoldast valahogy igy kepzelnem el:

$telefonszamok = array();
$query = "SELECT id FROM telefonszamok ORDER BY position ASC";
$result = DB::executeQuery($query);
$i = 1;
$pos = null;
while(($row = $result->next()) != false) {
	$telefonszamok[$i] = $row['id'];
	if($row['id'] == $_GET['id']) {
		$pos = $i;
	}
	$i++;
}
$swap = null;
$shift = $_GET['move']=='up' ? -1 : 1;
$swap = $telefonszamok[$pos + $shift];
$telefonszamok[$pos + $shift] = $telefonszamok[$pos];
$telefonszamok[$pos] = $swap;
DB::beginTransaction();
foreach($telefonszamok as $position => $id) {
	$query = "UPDATE telefonszamok SET position='" . $position . "' WHERE id='" . $id . "'";
	DB::executeUpdate($query);
}
DB::commitTransaction();
Termeszetesen ez azert rossz, mert lekerdezi az osszes elemet, de amennyiben a lista folytonossaga serul, akkor helyreallitja. Optimalizalt valtozatban ket rekordot kerdezel le, a kivalasztottat es a folotte vagy alatta levot es azoknak a sorrendjet csereled meg.

Petyus Daniel
6

Egy rekord

kicsy · 2007. Okt. 15. (H), 09.46
Ha egyszerre csak egy rekordot mozgatsz egy egységgel, akkor nem kell végigmenni az egész táblán, egyszerűen fel kell cserélni mozgatott rekord, illetve a felette/alatta lévő rekord sorszámát:
UPDATE `table` SET `position` = '". $position ."' WHERE `position` = '". $position +/- 1 ."'
UPDATE `table` SET `position` = '". $position -/+ 1 ."' WHERE `position` = '". $position ."'
A pluszok-mínuszok nyilván a mozgatás irányától függnek.
7

Ez így nem teljesen jó

goph-R · 2007. Okt. 15. (H), 13.09
Így a második UPDATE két sorra fog meghívódni (mivel az első lefutása után már két olyan sorod lesz aminek a position-ja = $position).

$id1 = "SELECT id FROM table WHERE position = " . ( $position +/- 1 ) . " LIMIT 1";
$id2 = "SELECT id FROM table WHERE position = " . $position . " LIMIT 1";
"UPDATE table SET position = " . $position . " WHERE id = " . $id1 . " LIMIT 1";
"UPDATE table SET position = " . ( $position +/- 1 ) . " WHERE id = " . $id2 . " LIMIT 1";
(Vagy valami ilyesmi :) Persze, ha túl soknak tűnik a két SELECT, akkor eggyel is megoldható egy ORDER BY segítségével, de ott már kell tudni az előjelet és a szerint megadni, hogy ASC vagy DESC a rendezés.
8

Igaz

kicsy · 2007. Okt. 15. (H), 13.57
Igaz, mea culpa, így korrekt.
11

értem

xeras · 2007. Okt. 15. (H), 15.06
tehát akkor be kell vezetni egy új oszlopot ahol a sorszámot tárolom,
aztán csak ki kell cserélni az egymás mellett lévőket és kész is.

köszi, mindjárt tesztelem!


szerk: működik az ötlet!
10

talált

xeras · 2007. Okt. 15. (H), 15.03
"egyszerre csak egy rekordot mozgatsz egy egységgel"
pontosan így történne :)