Toon posts:

[PHP&MySQL] update met een for loopje

Pagina: 1
Acties:

Verwijderd

Topicstarter
PHP:
1
2
3
4
5
$output = explode(";", $output);
for ($i = 0; $i < (count($output) - 1); $i++) {
  $k = $i + 1;
  mysql_query("UPDATE forums SET volgorde = $output[$i] WHERE volgorde = $k AND headid = $headid") or die (mysql_error());
  }

geeft terug:
code:
1
2
3
UPDATE forums SET volgorde = '3' WHERE volgorde = '1' AND headid = '1'
UPDATE forums SET volgorde = '1' WHERE volgorde = '2' AND headid = '1'
UPDATE forums SET volgorde = '2' WHERE volgorde = '3' AND headid = '1'


deze bende word dus gemaakt door een for loopje maar, et klopt eigenlijk voor geen meter...omdat ie eigenlijk alles in 1 keer moet updaten.
maar hoe update ik 3 keer hetzelfde veld (andere rij) in 1 query?
heeft iemand misschien een oplossing voor mij?

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 24-08 21:59

Macros

I'm watching...

Ik denk niet dat dat kan in 1 query.

"Beauty is the ultimate defence against complexity." David Gelernter


Verwijderd

Zover ik weet kan dat niet...

Verwijderd

trouwens, het ziet er naar uit dat dat scrippie bedoeld is om iets om te draaien? een volgorde ofzo? op deze manier werkt dat niet... want
het wordt 3 waar 1 staat
dan wordt het 1 waar 2 staat
dan wordt het 2 waar 3 staat (maar eerste was ook al 3, dus die gaat mee en wordt ook 2)

dus gaat niet helemaal goed...

Verwijderd

Topicstarter
nee, idd, dat werkt dus niet op deze manier, maar nu zoek ik dus een andere manier om dit dus WEL werkend te krijgen :) het hoeft niet persee in 1 query...als het maar werkt :)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Het is idd een leuke puzzel, als je waarden altijd kleiner zijn dan 100 kan je de waarde eerst naar bijv 100 + nieuwewaarde updaten en dan daarna in 1 update alles bijwerken naar update ... set value = value - 100 ...

  • KillR-B
  • Registratie: Mei 2002
  • Laatst online: 20-01 20:49
ACM schreef op 15 augustus 2002 @ 15:22:
Het is idd een leuke puzzel, als je waarden altijd kleiner zijn dan 100 kan je de waarde eerst naar bijv 100 + nieuwewaarde updaten en dan daarna in 1 update alles bijwerken naar update ... set value = value - 100 ...
Dus in jouw geval:

UPDATE forums SET volgorde = 4 - volgorde WHERE headid = '1'

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

KillR-B schreef op 15 augustus 2002 @ 15:28:
UPDATE forums SET volgorde = 4 - volgorde WHERE headid = '1'

Huh??
Volgens mij doet dat wat anders dan ik zeg :)

Verwijderd

Topicstarter
hee, das een goed idee :) thnx!

Verwijderd

Topicstarter
voor de mensen die hier misschien nog wat aan kunnen hebben, dit is het geworden:
PHP:
1
2
3
4
5
6
7
8
9
$output = explode(";", $output);
for ($i = 0; $i < (count($output) - 1); $i++) {
  $k = $i + 1;
  mysql_query("UPDATE forums SET volgorde = $output[$i] + 100 WHERE volgorde = $k AND headid = $headid") or die (mysql_error());
  }
for ($i = 0; $i < (count($output) - 1); $i++) {
  $k = $i + 1;
  mysql_query("UPDATE forums SET volgorde = volgorde - 100 WHERE volgorde = $k + 100 AND headid = $headid") or die (mysql_error());
  }

:)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Die tweede hoeft niet in een lus lijkt me :)
Die kan je gewoon allemaal -100 doen in 1 update, zolang je het headid maar meegeeft ;)

Verwijderd

Aangezien de bedoeling is alles circulair 1 op te schuiven, wordt alleen de eerste element een tweede maal overschreven. Dus je hoeft dan alleen het eerste element een tijdelijk waarde buiten het domein van 'volgorde' te geven:
PHP:
1
2
3
4
5
6
7
$output = explode(";", $output);
mysql_query("UPDATE forums SET volgorde = count($output) WHERE volgorde = 1 AND headid = $headid") or die (mysql_error());
for ($i = 1; $i < (count($output) - 1); $i++) {
  $k = $i + 1;
  mysql_query("UPDATE forums SET volgorde = $output[$i] WHERE volgorde = $k AND headid = $headid") or die (mysql_error());
  }
mysql_query("UPDATE forums SET volgorde = count($output)-1 WHERE volgorde = 1 AND headid = $headid") or die (mysql_error());

Iets meer code, maar wel efficienter.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Volgens mij doet jouw code hele enge dingen, maar niet wat de topicstarter graag ziet ;)

Gewoon de code die ie nu al heeft combineren met het feit dat mysql prima dit als query accepteert:
UPDATE forums SET volgorde = volgorde - 100 WHERE headid = $headid;

En klaar is ie, imho.

  • alley
  • Registratie: Mei 2002
  • Laatst online: 01-09 14:55

alley

ahuh

Als je alles in een keer wil moven:
PHP:
1
2
mysql_query("UPDATE forums SET volgorde = volgorde-1") or die (mysql_error()); 
mysql_query("UPDATE forums SET volgorde = (select count(*) from forums)") or die (mysql_error());

I am always doing that which I can not do, in order that I may learn how to do it. (Pablo Picasso)


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

alley schreef op 15 augustus 2002 @ 17:55:
Als je alles in een keer wil moven:

Ten eerste, het gaat niet om moven... maar om veranderen van volgordes in een willekeurig andere.

Ten tweede, mysql kan geen subselects.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Ik ben niet bekend met MySQL, maar er zit vast wel een modulo-operator in. In dat geval kun je de volgende query gebruiken:

UPDATE forums
SET volgorde = volgorde % 3 + 1
WHERE headid = 1

De "3" moet je eventueel in je php code invullen.

Never underestimate the power of


  • alley
  • Registratie: Mei 2002
  • Laatst online: 01-09 14:55

alley

ahuh

ACM schreef op 15 augustus 2002 @ 17:58:

[...]

Ten eerste, het gaat niet om moven... maar om veranderen van volgordes in een willekeurig andere.

Ten tweede, mysql kan geen subselects.
Ok, van die subselects wist ik niet (vreemd though), zou er dus 1 query bij moeten voor het aantal records ophalen.
Bovendien was ik 'where volgorde=0' vergeten bij de 2e statement....

I am always doing that which I can not do, in order that I may learn how to do it. (Pablo Picasso)


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

cameodski schreef op 15 augustus 2002 @ 18:03:
Ik ben niet bekend met MySQL, maar er zit vast wel een modulo-operator in. In dat geval kun je de volgende query gebruiken:

UPDATE forums
SET volgorde = volgorde % 3 + 1
WHERE headid = 1

De "3" moet je eventueel in je php code invullen.

Ja.. die zit er in.

Maar ook jij hebt het fout, zie een paar postings omhoog van mij. Dat punt "ten eerste".

Verwijderd

ACM schreef op 15 augustus 2002 @ 17:46:
Volgens mij doet jouw code hele enge dingen, maar niet wat de topicstarter graag ziet ;)

Gewoon de code die ie nu al heeft combineren met het feit dat mysql prima dit als query accepteert:
UPDATE forums SET volgorde = volgorde - 100 WHERE headid = $headid;

En klaar is ie, imho.
Zulke hele enge doet ie niet, daar ik er vanuit ging dat de bedoeling is om de volgorde circulair op te schuiven, zoals dat (wellicht toevallig) in zijn voorbeeldje het geval was (dus 1=>2, 2=>3, 3=>1). Jammer dat hij $output niet specificeerd.
Dus in het geval dat er arbitraire waarden in $output kunnen staan, heb je volkomen gelijk, al is de keuze '+100' en '-100' volgens de dichtkunst van het programmeren niet het schoonste stukje proza. ;)
Pagina: 1