[PHP/MySQL] Schuiven in volgorde in lijst

Pagina: 1
Acties:
  • 2.216 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
Ik ben bezig met het schrijven van een php klasse die voor mij in combinatie met MySQL een
bedrijvenlijst bijhoudt enb uitleest. Het is belangrijk dat in deze bedrijvenlijst geschoven kan worden van positie (De lijst is gebaseerd op een volgorde in prioriteit). Deze klasse gaat draaien in combinatie met een backend van een website en ik wil hierdoor niet teveel extra load toevoegen.

In de search kwam ik het volgende tegen:
\[ASP/SQL] Records schuiven dmv Up/Down knop

Hier gaat het echter om MSSQL en is mij nog steeds niet duidelijk wat het efficienste is.

Nu wil ik met drie buttons (moveUp, moveDown, moveTop) de positie in de lijst kunnen veranderen. Probleem is dan er dan elke keer 2 queries nodig zijn (Update van het unieke ID, Update van alle die groter of kleiner zijn). Als een admin dus 10 keer op die moveUp drukt heb je in een hele korte tijd 20 queries te pakken)

Andere oplossing is clientside met inputs werken waarin de order ingevuld kan worden. Nadeel is dat met een lijst van 50 of 100 bedrijven het vervelend is als je al die nummertjes handmatig moet editen.

Heeft iemand een suggestie of idee?

code:
1
2
3
4
5
6
TABLE company
==============
company_id
name
address
order

Computer Specs


Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 19-09 18:02
Ik zou client side mbv javascript de volgorde bijhouden en het geheel bij een submit pas laten opslaan in de database.

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Leuk detail : Het in 1x opsturen van een lijst met 100 bedrijven met een volgnummer zorgt natuurlijk ook voor 100 update queries ;)..

Maar verder ben ik met wackmaniac. Gewoon leuk javascript waarmee je de boel op volgorde kunt zetten, en vervolgens een grote save (of submit) knop die de reaultaten in 1x opsturen.

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


Acties:
  • 0 Henk 'm!

Verwijderd

wackmaniac schreef op woensdag 02 mei 2007 @ 13:20:
Ik zou client side mbv javascript de volgorde bijhouden en het geheel bij een submit pas laten opslaan in de database.
Exact wat ik zou doen. Bij een submit de array met bedrijfsnamen / IDs opvangen, dit vergelijken met wat je op het moment in de database hebt staan en zonodig her en der wat updaten.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Waarom maak je je druk om een paar update-query's? Stel dat er honderd items in je lijst staan, en het laatste wil je bovenaan hebben, tsja, dan worden er zo'n honderd query's uitgevoerd.

Dat is toch precies waar een database voor gemaakt is? Zo vaak zal die volgorde niet veranderen, tenminste, het lijkt me niet dat de gebruikers van die site continu de lijst zitten te sorteren...

\/ spuit 11 :P

[ Voor 3% gewijzigd door CodeCaster op 02-05-2007 13:26 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Hoevaak verandert iemand nou de volgorde? De database heeft geen enkel probleem met die 2 queries die na iedere request binnenkomen, zolang het aantal bedrijven dat geupdate wordt niet ontzettend groot is en je ook nog veel indices hebt gedefinieerd op het volgorde-veld.

hoi Codecaster :'(

[ Voor 6% gewijzigd door GlowMouse op 02-05-2007 13:26 ]


Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
Ben niet zo'n held met javascript. Zou iemand mij een suggestie of tip kunnen doen waar ik naar zou moeten kijken?

Aan de andere kant zou je idd gewoon die update's voor lief kunnen nemen :p

[ Voor 25% gewijzigd door GandalfTheGrey op 02-05-2007 13:27 ]

Computer Specs


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

http://tool-man.org/examples/sorting.html

En dan bij het onClick() van de knop ervoor zorgen dat de volgorde (in dit geval gescheiden met pipes ( | )) ge-explodeerd wordt in php, dus onClick="window.location.href='verwerk.php?list='+list.getSequence()" of zo :)

[ Voor 18% gewijzigd door CodeCaster op 02-05-2007 13:31 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
GandalfTheGrey schreef op woensdag 02 mei 2007 @ 13:17:
Als een admin dus 10 keer op die moveUp drukt heb je in een hele korte tijd 20 queries te pakken)
Die 20 queries voor een admin actie boeien niet. Wat boeit is dat er 10x geklikt en gewacht moet worden. Als vaak X keer een moveUp/MoveDown actie gedaan moet worden, is het wellicht handig om een interface aan te bieden waarbij je dmv een dropdown het veld kan selecteren waar het huidige record achter moet komen.

{signature}


Acties:
  • 0 Henk 'm!

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50

BikkelZ

CMD+Z

Het is niet helemaal waar dat je dan 100 queries uitvoert. Je bepaalt het beginpunt (bijvoorbeeld positie 6), het eindpunt (bijvoorbeeld positie 5), en je verandert alleen de positie van die items die gelijk aan vijf of groter zijn maar kleiner dan zes door er 1 bij op te tellen. Omgekeerd kan dit ook.

Als je MySQL 5 gebruikt kun je eerst een paar variabelen definieren van de te schuiven rij als je die niet meteen meegeeft vanuit je interface.

SQL:
1
UPDATE company SET order = order + 1 WHERE order < 6 AND order >= 5


Je kunt van te voren bepalen met een stukje script wat die integers zijn in deze query. Als je een item helemaal bovenaan zet in plaats van onderaan in een lijst van 200 wordt het dus vanzelf dit:

SQL:
1
UPDATE company SET order = order + 1 WHERE order >= 1 AND order > 200


Als je met unique keys werkt moet je even aan de ORDER BY order DESC / ASC denken, anders gaat hij miepen.

iOS developer


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

De twee update queries werken alleen als je maar 1 item verplaatst. Zodra je eigenlijk je hele lijstje om hebt kunnen gooien wordt het een heel stuk lastiger om te bepalen welke queries er allemaal uitgevoerd moeten worden.

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


Acties:
  • 0 Henk 'm!

Verwijderd

Janoz schreef op woensdag 02 mei 2007 @ 14:12:
De twee update queries werken alleen als je maar 1 item verplaatst. Zodra je eigenlijk je hele lijstje om hebt kunnen gooien wordt het een heel stuk lastiger om te bepalen welke queries er allemaal uitgevoerd moeten worden.
Rauw geschreven:
PHP:
1
2
3
4
5
6
7
8
9
$bedrijvenarray = $_POST['bedrijvenlijst'];

foreach($bedrijvenarray as $bedrijfid->$bedrijfgegevens){

if ($bedrijfgegevens["Rang"] != $databaseobject[$bedrijfid]["Rang"]){
mysql_query("UPDATE...");
}

}


Is in principe goed te doen.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Dat zijn niet de type queries uit de post waarop ik reageerde. Wat jij hier weergeeft is juist de fictieve 100 queries waar ik het over had (1 item naar de top verplaatsen zorgt er immers voor dat alle order waardes anders zijn).

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


Acties:
  • 0 Henk 'm!

Verwijderd

Ik reageerde dan ook op het "Zodra je eigenlijk je hele lijstje om hebt kunnen gooien wordt het een heel stuk lastiger om te bepalen welke queries er allemaal uitgevoerd moeten worden." gedeelte, aangezien dat qua code goed te doen is.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Dat is allemaal heel leuk en aardig, maar lees nog even de post van Bikkelz waarin hij aangeeft dat het op zijn manier geen 100 queries zouden zijn, waarop ik zeg dat zijn manier erg lastig wordt wanneer er meer items verplaatst zijn. Daaruit verplaats queries afleiden is erg lastig en dan is inderdaad 'de 100 queries' manier die ik eerder aangaf, en die jij nu uitgewerkt hebt, een stuk makkelijker.

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


Acties:
  • 0 Henk 'm!

Verwijderd

Janoz schreef op woensdag 02 mei 2007 @ 15:33:
Dat is allemaal heel leuk en aardig, maar lees nog even de post van Bikkelz waarin hij aangeeft dat het op zijn manier geen 100 queries zouden zijn, waarop ik zeg dat zijn manier erg lastig wordt wanneer er meer items verplaatst zijn. Daaruit verplaats queries afleiden is erg lastig en dan is inderdaad 'de 100 queries' manier die ik eerder aangaf, en die jij nu uitgewerkt hebt, een stuk makkelijker.
In dat geval kun je ook elke user interactie bijhouden, dat elke keer bij het klikken op "Zet dit bedrijf 1 rang hoger" er aan de array "interactie_geschiedenis" een item toegevoegd wordt.

Bij het submitten van het form vervolgens kijken op welke knoppen er geklikt is, en dit in query's vertalen. Easy peazy :)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Tja, en toen was ondertussen al door iemand anders de volgorde aangepast waardoor je uitgaat van een andere beginstand en is het resultaat al helemaal niet wat je verwacht.

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


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
In MySQL zou je gebruik kunnen maken van de functie ELT... maar er is in MSSQL volgens mij geen vergelijkbare functie....

als je dan met Javascript al je regels opnieuw geordend hebt, kun je in 1 statement alles updaten:
SQL:
1
2
3
4
UPDATE
    company
SET
    order = ELT(order, 12, 11, 9, 10, 8, 1, 2, 3, 4, 6, 5, 7)


waarbij de argumenten van ELT zijn: oude ordernummer en daarna op de positie van het oude ordernummer in de argumentenlijst het nieuwe ordernummer... (dus het eerste ordernummer wordt nu op positie 12 geordend, het tweede op positie 11, etc)

maar nogmaals, volgens mij bestaat er geen vergelijkbare functie in MSSQL

overigens zou ik het veld "order" even een andere naam geven... is een reserved word...

[ Voor 13% gewijzigd door P.O. Box op 02-05-2007 15:48 ]


Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
Bedankt voor de reacties allemaal. Ik heb momenteel de javascript oplossing geimplementeerd met gebruik van ELT statement (perfect!)

Enige probleem is dat de backend alle lijsten in tabelformaat weergeeft. Het gebruik van JavaScript TOOLMAN vereist <LI> items. Dit vloekt dus nogal met de layout van de andere pagina's.
Is er een manier om Tabel Rows als <li> item te gebruiken?

edit:
order inderdaad gerenamed naar priority

[ Voor 16% gewijzigd door GandalfTheGrey op 02-05-2007 16:13 ]

Computer Specs


Acties:
  • 0 Henk 'm!

  • reddevil
  • Registratie: Februari 2001
  • Laatst online: 19-09 17:42
Ik heb het script van toolman aangepast dat ie ook met tables werkt... als je interesse hebt, laat maar horen, dan kan ik wel een voorbeeldje ergens neerzetten.

PS. Het werkt alleen met tables met een border=0, geen zin om uit te zoeken waarom ;) Naja hij werkt wel, maar dan schuift ie beetje vaag op naar rechts als je vertikaal gaat draggen.... Ow en als laatste: volgens mij werkt ie alleen goed in IE :P

[ Voor 25% gewijzigd door reddevil op 02-05-2007 16:24 ]


Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
Daar zou je me een groot plezier mee doen :) Gebruik zelf ook border=0.

Computer Specs


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Euh... <li class="order_li">, en die dan in je CSS declareren?

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

Verwijderd

Dit lijkt me nu eindelijk eens zo'n typisch gevalletje waar het overhypte AJAX wél voor een handige interface kan zorgen :) Of is dat wat over de top voor TS?

Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
CodeCaster schreef op woensdag 02 mei 2007 @ 18:11:
Euh... <li class="order_li">, en die dan in je CSS declareren?
Het gaat erom dat ik een lijst heb die er zo uit ziet:
code:
1
2
3
4
5
6
===============================================
# CompanyName   Website     E-mail
1   KPN          kpn.nl     info@kpn.nl
2   Bedrijf X    x-bus.nl   blaat@blaat.nl

========================================


Het enige wat ik wil is dat deze rijen dus onderling kan swappen en dit opslaan.
Weet niet of ik met LI style hetzelfde kan bereiken op een makkelijke manier?

AJAX interface is misschien net iets over de top :p

[ Voor 29% gewijzigd door GandalfTheGrey op 02-05-2007 18:43 ]

Computer Specs


Acties:
  • 0 Henk 'm!

Verwijderd

Je kan natuurlijk ook een wat eenvoudigere versie maken waarbij je bijvoorbeeld twee bedrijven van plaats laat wisselen, of een exacte plek meegeeft waar een bedrijf moet komen te staan. In dit geval heb je slechts 2 update queries, die dus de order value van de twee bedrijven omwisselt.

Het is natuurlijk maar de vraag of dit aan je wensen voldoet, maar in ieder geval weer een alternatief! (lijkt me ook wat meer bruikbaar als je bijvoorbeeld iets van plaats 99 naar 50 wil verplaatsen en je geen gebruik maakt van het eerder voorgestelde javascript voorstel)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

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'


Acties:
  • 0 Henk 'm!

  • reddevil
  • Registratie: Februari 2001
  • Laatst online: 19-09 17:42
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.

[ Voor 36% gewijzigd door reddevil op 03-05-2007 09:41 ]


Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
Bedankt reddevil. Alleen werkt volgens mij de "klik" showAll niet en de serializeList geeft niks terug.
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.

[ Voor 79% gewijzigd door GandalfTheGrey op 03-05-2007 12:13 ]

Computer Specs


Acties:
  • 0 Henk 'm!

  • reddevil
  • Registratie: Februari 2001
  • Laatst online: 19-09 17:42
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).

Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
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 )

Computer Specs


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
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...

Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
Volgens mij is er een probleem als er 1 rij verwijdert wordt en de nummers niet meer oplopend zijn. Klopt dit?

Computer Specs


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
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...

[ Voor 42% gewijzigd door P.O. Box op 04-05-2007 15:44 ]


Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
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
    function saveOrder($order){

        $order = substr($order, 2, strlen($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($nieuwevolgorde, 0, -2);
        
        $sQuery = "UPDATE company SET priority = ELT(priority, ".$nieuwevolgorde.")";

[ Voor 139% gewijzigd door GandalfTheGrey op 04-05-2007 17:12 ]

Computer Specs


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
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...

[ Voor 3% gewijzigd door P.O. Box op 04-05-2007 17:11 ]


Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
Ik snap het principe van de ELT functie wel, maar ik heb het gevoel dat ik ergens iets mis.

Computer Specs


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
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...

[ Voor 13% gewijzigd door P.O. Box op 04-05-2007 17:22 ]


Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
PHP:
1
2
3
4
5
6
7
8
    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?

Computer Specs


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
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?

Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
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.

Computer Specs


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
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
print_r($oud);
print_r($nieuw);
print_r($nieuwevolgorde);

Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
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

Computer Specs


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
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
$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...

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
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.

Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
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...

Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
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....

Acties:
  • 0 Henk 'm!

  • GandalfTheGrey
  • Registratie: Juli 2001
  • Laatst online: 01-12-2024

GandalfTheGrey

Remember, Remember..

Topicstarter
Geweldig het werkt :) de functie saveOrder is nu maar 3 of 4 lines :D

Computer Specs


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
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