login  Naam:   Wachtwoord: 
Registreer je!
 Forum

query in WHILE, duplicate id.

Offline Erwt - 08/12/2008 22:20 (laatste wijziging 09/12/2008 09:24)
Avatar van ErwtPHP beginner // edit: Probleem is veranderd, namelijk:

Oké, ik heb gekozen om de waarde simpel te verhogen met 100.. dit onderwerp is voor mij nu al lastig genoeg.

Ik heb een toolman menu in DHTML gedownload, wanneer je een menuitem sleept (drag and drop) dan wordt aan het einde van het slepen (het loslaten van je muis) de hele menu geupdate, dat is althans de bedoeling.

De volgende code gebruik ik via ajax:

[url]http://plaatscode.be/51666/[/url]

Hij gooit er netjes 100 bij op maar er is iets mis met de volgorde o.i.d.

Stel ik heb:

ids = 1,2,3 en waardes = Home,Chicks,Contact

Als ik dan Home naar Contact sleep en ik alert mijn query.. dan krijg ik:

Klik hier voor het plaatje!

1(Home) wordt 102, dat moet dus 103 zijn omdat dat later weer -100 gedaan wordt.

Dus er klopt nog iets niet, is er iemand die me hierbij kan helpen? Als er nadere informatie nodig is dan zeg je het maar.

Een publiekelijk voorbeeld kan ik niet online zetten omdat de database gewoon toegankelijk is, voor een voorbeeld kan je me een PM sturen.

16 antwoorden

Gesponsorde links
Offline Wim - 08/12/2008 22:24
Avatar van Wim Crew algemeen een tijdelijke (andere) waarde geven verschillend van alle bestaande ID's....
Offline Erwt - 08/12/2008 22:41
Avatar van Erwt PHP beginner Ging het maar zo makkelijk als hoe je dit zegt.. ik heb nu:

  1. $i = 0;
  2. while($i < $c_ids)
  3. {
  4. $volgende = $i + 1;
  5. $temp = $volgende + 500;
  6. $query = "UPDATE `menu` SET id='" . $temp . "' WHERE id='" . $ids[$i] . "'";
  7. $result = mysql_query($query) or die(mysql_error());
  8. $i++;
  9. }


Dat was de tijdelijke, maar hoe maak ik nu de definitieve weer dan? Ik snap er echt niks meer van 
Offline Rens - 08/12/2008 22:51
Avatar van Rens Gouden medaille

Crew algemeen
Ten eerste haal je met MAX() de hoogste waarde op, je doet deze waarde+1 en nu heb je je niet bestaande id.
Vervolgens ga je van home en contact de ID's ophalen.
Je gaat nu de home (bijvoorbeeld) op de niet bestaande ID zetten.
Vervolgens zet je contact op de ID van home en de ID van home zet je op die van contact.
  1. <?PHP
  2. $sQueryMax = "SELECT MAX(id) FROM <tabel>";
  3. $rResultMax = MySQL_Query($sQueryMax) or die(MySQL_Error());
  4. $iMax = MySQL_Result($rResultMax)+1;
  5.  
  6. $iFirst = $_GET['first'];
  7. $iSecond = $_GET['second'];
  8. $sQueryBackupFirst = "UPDATE <tabel> SET id=".$iMax." WHERE id=".$iFirst";
  9. $sQueryUpdateSecond = "UPDATE <tabel> SET id=".$iFirst." WHERE id=".$iSecond;
  10. $sQueryUpdateFirst = "UPDATE <tabel> SET id=".$iSecond." WHERE id=".$iMax;

Vervolgens je queries uitvoeren en klaar.

Let op:
Hier zit geen beveiliging of niks op...
Offline Erwt - 08/12/2008 22:55
Avatar van Erwt PHP beginner Het probleem is dat mijn systeem iets ingewikkelder is om mee te werken. Depressive atm, denk dat ik morgen nog eens ga kijken.
Offline Wim - 08/12/2008 23:06
Avatar van Wim Crew algemeen
Rens schreef:
Ten eerste haal je met MAX() de hoogste waarde op

http://dev.mysq...rt-id.html
Offline Rens - 08/12/2008 23:43
Avatar van Rens Gouden medaille

Crew algemeen
PHP.net: mysql_insert_id
mysql_insert_id — Get the ID generated from the previous INSERT operation

Of bedoel je de LAST_INSERT_ID functie van MySQL zelf?
Die doet eigenlijk precies hetzelfde als de MAX(id) die ik gebruik...
Je moet er bij allebei nog 1 optellen.

Of begrijp ik het nu verkeerd?
Offline Wim - 08/12/2008 23:46
Avatar van Wim Crew algemeen performantie gericht gaat last_insert_id volgens mij beter zijn; bij MAX ga je alle waardes nog moeten vergelijken en moet mysql nog rekenwerk verrichten...

Ik had het trouwens over de PHP functie ja... Daarom dat ik naar Mysql.com verwijs    (had het dus wel degelijk over de mysql functie )
Offline Erwt - 09/12/2008 09:23 (laatste wijziging 11/12/2008 08:40)
Avatar van Erwt PHP beginner Oké, ik heb gekozen om de waarde simpel te verhogen met 100.. dit onderwerp is voor mij nu al lastig genoeg.

Ik heb een toolman menu in DHTML gedownload, wanneer je een menuitem sleept (drag and drop) dan wordt aan het einde van het slepen (het loslaten van je muis) de hele menu geupdate, dat is althans de bedoeling.

De volgende code gebruik ik via ajax:

[url]http://plaatscode.be/51666/[/url]

Hij gooit er netjes 100 bij op maar er is iets mis met de volgorde o.i.d.

Stel ik heb:

ids = 1,2,3 en waardes = Home,Chicks,Contact

Als ik dan Home naar Contact sleep en ik alert mijn query.. dan krijg ik:

Klik hier voor het plaatje!

1(Home) wordt 102, dat moet dus 103 zijn omdat dat later weer -100 gedaan wordt.

Dus er klopt nog iets niet, is er iemand die me hierbij kan helpen? Als er nadere informatie nodig is dan zeg je het maar.

Een publiekelijk voorbeeld kan ik niet online zetten omdat de database gewoon toegankelijk is, voor een voorbeeld kan je me een PM sturen.

// Update:

heb veel volgordes proberen aan te passen, maar nog steeds doet hij het niet.

Als ik 2 menu items gebruik doet hij perfect.

Als ik 3 menu items gebruik dan werkt hij niet goed. Wanneer home van de 1e naar de 2e plek gaat, is er geen probleem. Wanneer home van de 1e naar de 3e plek gaat, dan gaat het mis.
Offline Kr4nKz1n - 11/12/2008 09:23
Avatar van Kr4nKz1n Onbekend Voordat ik wat ga posten. Is het niet handiger als je hier een extra veld voor hebt genaamd position?
Offline Erwt - 11/12/2008 09:27
Avatar van Erwt PHP beginner id==position, daar komt het op neer.

Want of je nu een position of id gebruikt, je moet ze beidde een tijdelijke naam geven, schiet je toch niet veel me op of zie ik dat verkeerd?
Offline Kr4nKz1n - 11/12/2008 09:30 (laatste wijziging 11/12/2008 09:38)
Avatar van Kr4nKz1n Onbekend Nou als je id op auto staat kun je er na een tijdje gaten in krijgen.
ID's: 1, 5, 127
Snap?

Edit
  1. <?php
  2.  
  3. $pos = ''; // Huidige positie
  4. $posTemp = ''; // Tijdelijke positie
  5. $posNew = ''; // Nieuwe positie
  6.  
  7. /*
  8. Dit moet er gebeuren wanneer 2 wordt versleept tussen 6 en 7 toch?
  9. 1 1
  10. 2 3
  11. 3 4
  12. 4 5
  13. 5 6
  14. 6 2
  15. 7 7
  16. 8 8
  17. */
  18.  
  19. if($pos > $posNew)
  20. {
  21. mysql_query("UPDATE tabel SET position=".$posTemp." WHERE position=".$pos."");
  22. mysql_query("UPDATE tabel SET position=position+1 WHERE position<".$pos." AND position>".$posNew."");
  23. mysql_query("UPDATE tabel SET position=".$posNew." WHERE position=".$posTemp."");
  24. }
  25. elseif($pos < $posNew)
  26. {
  27. mysql_query("UPDATE tabel SET position=".$posTemp." WHERE position=".$pos."");
  28. mysql_query("UPDATE tabel SET position=position-1 WHERE position<".$pos." AND position>".$posNew."");
  29. mysql_query("UPDATE tabel SET position=".$posNew." WHERE position=".$posTemp."");
  30. }
  31. ?>


Code is natuurlijk niet helemaal mooi met die ."" etc. Het gaat op dit moment alleen om de denkwijze.

Snap je het een beetje?
Offline Erwt - 11/12/2008 11:02 (laatste wijziging 11/12/2008 12:10)
Avatar van Erwt PHP beginner Ja tot dat 'snap' gedeelte snap ik het nog, je voorbeeld is ook juist.

Over 1 á 2 uur heb ik toegang tot m'n webhost en zal ik het direct proberen.. heb het na ongeveer 5 keer doorlezen eindelijk een beetje door.

Is er verder geen lek te zien in de code? Want hij krijgt van javascript eigenlijk de id's van nu al mee, dus eigenlijk zijn alle 3 de variabelen boven aan de pagina al bekend.

Wat ik wel jammer vind van je voorbeeld is dat je in je comments het hebt over 8 buttons en in je code maar 3. Als je weet waar je het over hebt dan is dat wel te snappen maar misschien was het beter geweest een gelijk aantal te nemen, maar mij hoor je niet klagen met zo een antwoord 
Offline Kr4nKz1n - 11/12/2008 12:36
Avatar van Kr4nKz1n Onbekend UHmz je bedoelt dat ik in mijn voorbeeld 1 t/m 8 gebruikt en maar 3 queries heb?

De eerste query die geeft het verplaatste id een tijdelijke positie.
De middelste query die verschuift alle posities tussen de verplaatste positie en de nieuwe positie.
De laatste query die geeft het verplaatste id zijn nieuwe positie.

Dus 3 queries is meer als genoeg.
Offline Erwt - 11/12/2008 13:13
Avatar van Erwt PHP beginner Ik snap hem volledig, met sommige dingen had ik dus geen rekening gehouden! zeker bedankt! 

Ik heb nu wel toegang tot m'n webhost maar nog niet tot m'n ftp. Als je het voorbeeld nog wil zien dan hoor ik het wel (zou niet weten waarom maar.. )
Offline Kr4nKz1n - 11/12/2008 13:21
Avatar van Kr4nKz1n Onbekend Tja laat maar zien alst werkt gehe 

Of als je ut nie voor elkaar krijgt ;)
Offline Erwt - 11/12/2008 17:58 (laatste wijziging 12/12/2008 11:44)
Avatar van Erwt PHP beginner Het probleem gevonden, de oplossing nog niet.

Ik krijg de waardes verkeerd door van mijn javascript.
Die javascript haalt alle li tag's op en gooit ze gescheiden met een komma naast elkaar. Deze stuurt hij via php dan door, ik denk dat ze in php goed worden verwerkt.

//edit:

Ik kreeg de waarden niet goed door vanaf javascript, nu krijg ik ze wel door maar op de verkeerde manier.

Ik krijg het volgende lijstje terug:

Oud:(voordat ik de drag and drop actie deed)
oudid: 1(Home)
oudid: 2(Downloads)
oudid: 3(Contact)

Nieuw:(nadat ik mijn drag and drop actie deed)
nieuwid: 2(Downloads)
nieuwid: 3(Contact)
nieuwid: 1(Home)

Maar vergeet niet dat ik ze zo terug krijg:

Oud: 1|2|3
Nieuw: 2|3|1

De volgordes kloppen wel maar ik kan niet zeggen:

update menu set id=oudid where id=nieuwid.

Hoe krijg ik nu wel de goede waarden terug?

(Dit probleem is van PHP naar JS gegaan, 't zou mooi zijn als dit kan worden aangepast)


Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.228s