Hoofdcategorieën
Topicacties

[PHP/MySQL] Schuiven in volgorde in lijst

Pagina: 1 2 last

Reageer Nieuw Topic

Acties:


Door: Janoz
Moderator PRG/SEA
!litemod
Berichten: 16.510
Reg. datum: 19 oktober 2000

Wat je daar laat zien is gewoon een tabel. Ik zie niet in waarom je daarvoor een li zou moeten misbruiken aangezien een li gemaakt is voor een lijstje van elementen, en niet tabulaire data (lees: met kolommen).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Berichten: 1.215
Reg. datum: 21 februari 2001

quote:
GandalfTheGrey schreef op woensdag 02 mei 2007 @ 16:32:
Daar zou je me een groot plezier mee doen :) Gebruik zelf ook border=0.
Voor de liefhebber:
http://home.hccnet.nl/reddevil/tablesort.zip

Als iemand nog zin en tijd heeft om 't probleem van de border=1 op te lossen of ze kunnen het werkend krijgen onder diverse andere browsers.... >:) >:)

PS. Kan zijn dat er in de html nog wat onzin code staat, maar dat kan je eenvoudig strippen.

reddevil wijzigde dit bericht 03-05-2007 09:41 (36%)

Vaelaa - Human Warlock 80 @ Sunstrider

Remember, Remember..

Bedankt reddevil. Alleen werkt volgens mij de "klik" showAll niet en de serializeList geeft niks terug.
quote:
Janoz schreef op donderdag 03 mei 2007 @ 09:26:
Wat je daar laat zien is gewoon een tabel. Ik zie niet in waarom je daarvoor een li zou moeten misbruiken aangezien een li gemaakt is voor een lijstje van elementen, en niet tabulaire data (lees: met kolommen).
Inderdaad. Daarom ben ik nu ook aan het proberen de TOOLMAN te editen voor tables.

GandalfTheGrey wijzigde dit bericht 03-05-2007 12:13 (79%)

Berichten: 1.215
Reg. datum: 21 februari 2001

quote:
GandalfTheGrey schreef op donderdag 03 mei 2007 @ 12:05:
Bedankt reddevil. Alleen werkt volgens mij de "klik" showAll niet en de serializeList geeft niks terug.
De klik laat alleen zien welke rows aangevinkt zijn met de checkbox voor de row.

geen idee wat de serializeList exact doet, maar zoals ie bij mij nu werkt kan ik gewoon de volgordes ophalen door een javascriptje te gebruiken die de tabel row voor row doorloopt (beetje zoals de showAll doet).

Vaelaa - Human Warlock 80 @ Sunstrider

Remember, Remember..

Het javascript werkt nu volledig goed :)

Alleen SQL statement lijkt niks te doen?!

Affected rows: 0 (Query took 0.0004 sec)
SQL query: UPDATE company SET priority = ELT( priority, 2, 1 )
Berichten: 1.188
Reg. datum: 24 augustus 2005

die query werkt alleen voor rijen die al bestaan in de database he? m.a.w. bestaan er wel rijen in je tabel... en hebben deze nu als priority ook 1 en 2.... nadeel van dit systeem is nl wel dat je netjes moet ordenen...
 
Remember, Remember..

Volgens mij is er een probleem als er 1 rij verwijdert wordt en de nummers niet meer oplopend zijn. Klopt dit?
Berichten: 1.188
Reg. datum: 24 augustus 2005

dat klopt in principe ja... ELT is een leuke functie, maar je moet hem exact goed gebruiken in dit geval.. anders heeftie geen goed effect...

je kunt denk ik het best ook in het javascript zorgen dat je nummers oplopend blijven...
en verwijderde rijen misschien vervangen door 0 of NULL en daarna de velden met priority 0 of NULL verwijderen...

P.O. Box wijzigde dit bericht 04-05-2007 15:44 (42%)

 
Remember, Remember..

Op een of andere manier krijgen twee bedrijven elke x priority = 0 na de Update.
Moet de oude situatie (IN de database) ook een oplopend rijtje zijn ?


Mijn javascript geeft gewoon dit door (Rij met alle company ID's in volgorde gescheiden door pipes):
?action=order&order=0|94|21|20|26|22|23|24|28|29|50|48|52..|95|17

Vervolgens krijgen company 95 en 17 elke keer priority 0 van ELT. Terwijl alle andere priority's wel goed en oplopend kloppen?! Verder lijkt hij sommige wijzingen wel op te slaan en andere niet :p


Mijn code (PHP4 server)
Ik doe eerst een substring waarin ik de eerste twee tekens verwijder, omdat het javascript ook de tableheadrow meegeeft (die heeft standaard id=0)
PHP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
    function saveOrder($order){

        $order = substr($order2strlen($order)-1);
        $aOrder = explode("|"$order);        
        //array van oldorder => company_id
        $oud = array();
        $sQuery = "SELECT company_id FROM company ORDER BY priority";
        $rQuery = mysql_query($sQuery);
        $i = 1;
        while($aQuery = mysql_fetch_array($rQuery)){
            $oud[$i] = $aQuery['company_id'];
            $i++;
        }
        //array van company_id => neworder
        $nieuw = array();
        $j = 1;
        foreach($aOrder as $company){
            $nieuw[$company] = $j;
            $j++;
        }
        $nieuwevolgorde = "";
        foreach($oud as $key => $value){
            $nieuwevolgorde .= $nieuw[$value] . ", ";
        }
        $nieuwevolgorde = substr($nieuwevolgorde0-2);
        
        $sQuery = "UPDATE company SET priority = ELT(priority, ".$nieuwevolgorde.")";
?>

GandalfTheGrey wijzigde dit bericht 04-05-2007 17:12 (139%)

Berichten: 1.188
Reg. datum: 24 augustus 2005

eerst even een vraag: begrijp je de functie ELT? dan zou je er in principe uit moeten kunnen komen...
de originele prioriteiten hoeven niet perse oplopend te zijn... wel moet de ELT functie aangeroepen worden met minimaal de originele prioriteit aantal aan argumenten... zo niet, dan geeft hij null terug....

het is niet de meest ideale functie hiervoor, maar wel als je in 1 statement de volgorde wilt updaten... vereiste is dus wel dat je netjes nummert...
op zich moet dat ook geen probleem zijn... je begint bij 1... en een volgende rij wordt altijd max + 1... als je rijen verwijdert doe je de ELT actie, waardoor de nummering daarna weer OK zou moeten zijn... als je het netjes doet kan het niet fout gaan...

edit: oh, je hebt wat toegevoegd... ff bekijken...

P.O. Box wijzigde dit bericht 04-05-2007 17:11 (3%)

 
Remember, Remember..

Ik snap het principe van de ELT functie wel, maar ik heb het gevoel dat ik ergens iets mis.
Berichten: 1.188
Reg. datum: 24 augustus 2005

de code ziet er op zich goed uit... ik denk dat je even wat print_r-en er tussen moet gooien om te kijken wat er nou waar in de code staat... ik heb het vermoeden dat $oud niet evenlang is als $nieuw... terwijl die wel even lagn moeten zijn... verwijderde items moet je namelijk niet uit $nieuw verwijderen, maar voorzien van 0 bijvoorbeeld... ook al heb je ze namelijk inmiddels verwijderd... de oude volgordenummering weet dat nog niet...

P.O. Box wijzigde dit bericht 04-05-2007 17:22 (13%)

 
Remember, Remember..


PHP:

1
2
3
4
5
6
7
8
<?php
    function delete($company_id){
        // Delete the company
        $sQuery = sprintf("DELETE FROM company WHERE company_id=%d LIMIT 1"$company_id);        
        if($rQuery = mysql_query($sQuery)){
            return true;
        }
        return false;    
    }
?>

Het deleten gebeurd real-time. Misschien moet ik hier dan gewoon een UPDATE statement bijgooien waarin ik alles > company_id priority = priority -1 doe?
Berichten: 1.188
Reg. datum: 24 augustus 2005

je bedoelt dat als je verwijderd, dat dan direct de betreffende rij uit de database wordt verwijderd? en wordt dan je overzicht opnieuw getoond of doe je het verwijderen dan met ajax ? m.a.w. is $oud op het moment van zenden (en dus voor de database bewerkingen) nog wel exact gelijk aan wat er in je database staat?
 
Remember, Remember..

overzicht wordt opnieuw getoond. $oud klopt met wat er in de database staat.
De arrays zijn ook even groot. Maar bij het deleten wordt de volgorde dus NIET geupdate en krijg je gaps in de priority volgorde.
Berichten: 1.188
Reg. datum: 24 augustus 2005

eigenlijk moeten de verwijderde items wel nog worden meegegeven in de prioriy lijst.... met 0 ofzo... boeit niet, de update ziet ze toch niet, maar de overige priorities staan wel op hun plaats...

kun je anders even het resultaat van dit posten:
na $Query = "UPDATE .... ";
PHP:

1
2
3
<?php
print_r($oud);
print_r($nieuw);
print_r($nieuwevolgorde);
?>

 
Remember, Remember..


code:
1
2
3
4
5
6
7
8
Oud = Order => Company_ID
Oud ( [1] => 17 [2] => 95 [3] => 94 [4] => 21 [5] => 26 [6] => 20 [7] => 23 [8] => 22 [9] => 24 [10] => 28 [11] => 29 [12] => 50 [13] => 48 [14] => 52 [15] => 55 [16] => 31 [17] => 33 [18] => 16 [19] => 34 [20] => 37 [21] => 35 [22] => 36 [23] => 30 [24] => 38 [25] => 39 [26] => 40 [27] => 41 [28] => 25 [29] => 42 [30] => 43 [31] => 45 [32] => 44 [33] => 46 [34] => 47 [35] => 49 [36] => 32 [37] => 53 [38] => 54 [39] => 56 [40] => 58 [41] => 51 [42] => 15 [43] => 57 [44] => 18 [45] => 60 [46] => 61 [47] => 62 [48] => 63 [49] => 64 [50] => 65 [51] => 66 [52] => 67 [53] => 68 [54] => 69 [55] => 70 [56] => 71 [57] => 72 [58] => 73 [59] => 74 [60] => 75 [61] => 76 [62] => 78 [63] => 77 [64] => 79 [65] => 81 [66] => 89 [67] => 82 [68] => 83 [69] => 84 [70] => 85 [71] => 88 [72] => 90 [73] => 91 [74] => 105 [75] => 99 [76] => 101 [77] => 92 [78] => 14 [79] => 19 [80] => 86 [81] => 59 [82] => 27 [83] => 87 [84] => 96 [85] => 93 [86] => 97 [87] => 98 [88] => 100 [89] => 102 [90] => 103 [91] => 104 [92] => 106 ) 

Nieuw = Company ID => Nieuw Orde
Nieuw ( [17] => 1 [95] => 2 [94] => 3 [21] => 4 [26] => 5 [20] => 6 [23] => 7 [22] => 8 [24] => 9 [28] => 10 [29] => 11 [50] => 12 [48] => 13 [52] => 14 [55] => 15 [31] => 16 [33] => 17 [16] => 18 [34] => 19 [37] => 20 [35] => 21 [36] => 22 [30] => 23 [38] => 24 [39] => 25 [40] => 26 [41] => 27 [25] => 28 [42] => 29 [43] => 30 [45] => 31 [44] => 32 [46] => 33 [47] => 34 [49] => 35 [32] => 36 [53] => 37 [54] => 38 [56] => 39 [58] => 40 [51] => 41 [15] => 42 [57] => 43 [18] => 44 [60] => 45 [61] => 46 [62] => 47 [63] => 48 [64] => 49 [65] => 50 [66] => 51 [67] => 52 [68] => 53 [69] => 54 [70] => 55 [71] => 56 [72] => 57 [73] => 58 [74] => 59 [75] => 60 [76] => 61 [78] => 62 [77] => 63 [79] => 64 [106] => 65 [81] => 66 [89] => 67 [83] => 68 [84] => 69 [85] => 70 [88] => 71 [90] => 72 [91] => 73 [105] => 74 [99] => 75 [101] => 76 [92] => 77 [14] => 78 [19] => 79 [86] => 80 [59] => 81 [27] => 82 [87] => 83 [96] => 84 [93] => 85 [97] => 86 [98] => 87 [100] => 88 [102] => 89 [103] => 90 [104] => 91 [82] => 92 ) 

Nieuwevolgorde = lijst nieuwe volgorde's
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 92, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 65

Berichten: 1.188
Reg. datum: 24 augustus 2005

ik bedenk me ineens nog iets...
toen ik die ELT functie voorstelde, had ik in gedachte dat je oude priorities, naar nieuwe priorities ging zetten, zonder ID's e.d. te weten... jij kwam echter met een code waarbij je de ID's op een volgorde in een array zette.... om dan ELT te gebruiken geeft een heel geklooi met "nieuwevolgorde" zoals je zelf al zag...
nu bedacht ik me net dat de FIELD functie eigenlijk nog veel makkelijker is als je ID's gebruikt...

je hebt een array $order, met daarin de ID's op de nieuwe volgorde...
dan doe je:
PHP:

1
<?php
$sQuery = "UPDATE company SET priority = FIELD(id, " . implode($order",") . ")";
?>

FIELD geeft de positie van id terug in de lijst....

scheelt je een hoop code lijkt me...
 
Berichten: 6.285
Reg. datum: 26 oktober 2002

Chique!

Enige probleem wat open blijft staan is dat meerdere mensen in de database kunnen werken. Stel dat ik een rij verwijder en er een paar toevoeg terwijl iemand anders in JavaScript aan het sorteren is dan heb je een probleem.

Een website voor maar ¤ 1299 op maat ontworpen! GO-ON.nl Goedkope Websites!

Berichten: 1.188
Reg. datum: 24 augustus 2005

quote:
GandalfTheGrey schreef op zaterdag 05 mei 2007 @ 11:57:
code:
1
2
3
4
5
6
7
8
Oud = Order => Company_ID
Oud ( [1] => 17 [2] => 95 [3] => 94 [4] => 21 [5] => 26 [6] => 20 [7] => 23 [8] => 22 [9] => 24 [10] => 28 [11] => 29 [12] => 50 [13] => 48 [14] => 52 [15] => 55 [16] => 31 [17] => 33 [18] => 16 [19] => 34 [20] => 37 [21] => 35 [22] => 36 [23] => 30 [24] => 38 [25] => 39 [26] => 40 [27] => 41 [28] => 25 [29] => 42 [30] => 43 [31] => 45 [32] => 44 [33] => 46 [34] => 47 [35] => 49 [36] => 32 [37] => 53 [38] => 54 [39] => 56 [40] => 58 [41] => 51 [42] => 15 [43] => 57 [44] => 18 [45] => 60 [46] => 61 [47] => 62 [48] => 63 [49] => 64 [50] => 65 [51] => 66 [52] => 67 [53] => 68 [54] => 69 [55] => 70 [56] => 71 [57] => 72 [58] => 73 [59] => 74 [60] => 75 [61] => 76 [62] => 78 [63] => 77 [64] => 79 [65] => 81 [66] => 89 [67] => 82 [68] => 83 [69] => 84 [70] => 85 [71] => 88 [72] => 90 [73] => 91 [74] => 105 [75] => 99 [76] => 101 [77] => 92 [78] => 14 [79] => 19 [80] => 86 [81] => 59 [82] => 27 [83] => 87 [84] => 96 [85] => 93 [86] => 97 [87] => 98 [88] => 100 [89] => 102 [90] => 103 [91] => 104 [92] => 106 ) 

Nieuw = Company ID => Nieuw Orde
Nieuw ( [17] => 1 [95] => 2 [94] => 3 [21] => 4 [26] => 5 [20] => 6 [23] => 7 [22] => 8 [24] => 9 [28] => 10 [29] => 11 [50] => 12 [48] => 13 [52] => 14 [55] => 15 [31] => 16 [33] => 17 [16] => 18 [34] => 19 [37] => 20 [35] => 21 [36] => 22 [30] => 23 [38] => 24 [39] => 25 [40] => 26 [41] => 27 [25] => 28 [42] => 29 [43] => 30 [45] => 31 [44] => 32 [46] => 33 [47] => 34 [49] => 35 [32] => 36 [53] => 37 [54] => 38 [56] => 39 [58] => 40 [51] => 41 [15] => 42 [57] => 43 [18] => 44 [60] => 45 [61] => 46 [62] => 47 [63] => 48 [64] => 49 [65] => 50 [66] => 51 [67] => 52 [68] => 53 [69] => 54 [70] => 55 [71] => 56 [72] => 57 [73] => 58 [74] => 59 [75] => 60 [76] => 61 [78] => 62 [77] => 63 [79] => 64 [106] => 65 [81] => 66 [89] => 67 [83] => 68 [84] => 69 [85] => 70 [88] => 71 [90] => 72 [91] => 73 [105] => 74 [99] => 75 [101] => 76 [92] => 77 [14] => 78 [19] => 79 [86] => 80 [59] => 81 [27] => 82 [87] => 83 [96] => 84 [93] => 85 [97] => 86 [98] => 87 [100] => 88 [102] => 89 [103] => 90 [104] => 91 [82] => 92 ) 

Nieuwevolgorde = lijst nieuwe volgorde's
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 92, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 65

grappig, net toen ik mijn nieuwe oplossing aan het posten was, postte jij dit.... ik denk dat je met de nieuwe oplossing hier geen antwoord meer op hoeft, maar mocht dat wel zo zijn: is het mogelijk om het met een kleinere set te testen? ik kan hier nl. niet echt een fout in vinden, maar misschien komt dat omdat ik door de enorme hoeveelheid getallen...
 
Berichten: 1.188
Reg. datum: 24 augustus 2005

quote:
djluc schreef op zaterdag 05 mei 2007 @ 12:09:
Chique!

Enige probleem wat open blijft staan is dat meerdere mensen in de database kunnen werken. Stel dat ik een rij verwijder en er een paar toevoeg terwijl iemand anders in JavaScript aan het sorteren is dan heb je een probleem.
dat hou je natuurlijk altijd als je eerst een hele lijst bewerkingen doet alvorens daadwerkelijk de opdracht naar de database te sturen....
 
Remember, Remember..

Geweldig het werkt :) de functie saveOrder is nu maar 3 of 4 lines :D
Berichten: 1.188
Reg. datum: 24 augustus 2005

quote:
GandalfTheGrey schreef op zaterdag 05 mei 2007 @ 13:25:
Geweldig het werkt :) de functie saveOrder is nu maar 3 of 4 lines :D
super! twas leuk om mee te denken!
 

Pagina: 1 2 last



VNU Media logo Hosted by True

© 1998 - 2010 Tweakers.net - Alle rechten voorbehouden - Uw Privacy - Algemene Voorwaarden

Uitgever van:

Website van het jaar 2009