[PHP/MySQL] script compleet uitvoeren na sluiten browser

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • lucasvanlierop
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2018
Ik heb een PHP script wat bv volgende query moet uitvoeren in MySQL:

code:
1
2
3
4
5
6
UPDATE nodes SET node_lft = node_lft + 1 WHERE node_lft > 2;
UPDATE nodes SET node_rgt = node_rgt + 1 WHERE node_rgt > 3;
UPDATE nodes SET node_lft = node_lft - 3, node_rgt = node_rgt - 3 
  WHERE node_lft > 6 AND node_rgt < 8;
UPDATE nodes SET node_lft = node_lft - 1 WHERE node_lft > 6;
UPDATE nodes SET node_rgt = node_rgt - 1 WHERE node_rgt > 6


Omdat mysql_query() geen multiple statements ondersteunt doe ik het nu zo:
($qM = bovenstaande query)

code:
1
2
3
4
5
// Split the query in parts
foreach(explode(";", $qM) as $qMKey => $qMVal) {
   mysql_query($qMVal)
      or die("Move node (query part " . $qMKey . ") " . mysql_error());
}


Het probleem is nu dat het wel eens misgaat, als het de pagina met het script wordt afgesloten of opnieuw aangeroepen terwijl een aantal van de 5 statements nog uitgevoerd moeten worden gaat de informatie in de tabel 'stuk'.

Hoe zou ik dit kunnen voorkomen?

[ Voor 5% gewijzigd door lucasvanlierop op 19-05-2004 10:16 ]

WinXP@P4-2,4 GHz+ Zalman 7000 cooler | ASUS P4PE | 1024MB DDR-RAM | 40 GB + 120 GB Seagate HD's | 2x Samsung 172T@Matrox G550+SiS 8 Mb PCI | RME Multiface


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Als de query mislukt, dan roep je die() aan, dus dan stopt het script. Andere vraag: is je data nog integer als er 1 van de bovenstaande queries mislukt? Ik denk dat je er beter aan zou doen om een soort van transaction te proggen, waarbij, als er 1 query mislukt de boel teruggedraaid wordt.

[edit]

Na het sluiten van je browser wordt je script sowieso gestopt, de topictitel is wat misleidend. ;)

[ Voor 17% gewijzigd door RedRose op 19-05-2004 10:24 ]

Sundown Circus


Acties:
  • 0 Henk 'm!

  • lucasvanlierop
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2018
RedRose schreef op 19 mei 2004 @ 10:21:
Als de query mislukt, dan roep je die() aan, dus dan stopt het script. Andere vraag: is je data nog integer als er 1 van de bovenstaande queries mislukt? Ik denk dat je er beter aan zou doen om een soort van transaction te proggen, waarbij, als er 1 query mislukt de boel teruggedraaid wordt.
[edit]
Nee de data is dan niet meer integer (sterker nog compleet waardeloos), zal toch maar eens naar transactions gaan kijken, even zien hoe snel/goed dat werkt in MySQL.
Na het sluiten van je browser wordt je script sowieso gestopt, de topictitel is wat misleidend. ;)
Mmz, ja de vraag was dus of dit te voorkomen is.

WinXP@P4-2,4 GHz+ Zalman 7000 cooler | ASUS P4PE | 1024MB DDR-RAM | 40 GB + 120 GB Seagate HD's | 2x Samsung 172T@Matrox G550+SiS 8 Mb PCI | RME Multiface


Acties:
  • 0 Henk 'm!

  • MarkvE
  • Registratie: Maart 2004
  • Laatst online: 30-01 17:16
Er is een functie die ervoor zorgt dat het script altijd geheel wordt uitgevoerd, no matter what de gebruiker ook doet (browser sluiten, "stop" knop, etc.) Alleen weet ik jammer genoeg niet meer de naam van de functie...

Vormkracht10


Acties:
  • 0 Henk 'm!

  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 19-09 07:49
MarkvE schreef op 19 mei 2004 @ 11:36:
Er is een functie die ervoor zorgt dat het script altijd geheel wordt uitgevoerd, no matter what de gebruiker ook doet (browser sluiten, "stop" knop, etc.) Alleen weet ik jammer genoeg niet meer de naam van de functie...
Volgens mij bedoel je deze :

http://nl3.php.net/manual/en/function.ignore-user-abort.php

:)

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


Acties:
  • 0 Henk 'm!

  • Markieman
  • Registratie: December 2001
  • Laatst online: 01-06 11:37
[...] Standaard wordt echter jouw script gestopt wanneer de gebruiker de connectie sluit [...]
Dit gedrag kan gewijzigd worden met [...] of het makkelijkst met de ignore_user_abort() functie. [...]
Zie de php manual

You do not fear them? - The Wraith? Naah. Now *clowns*, that's another story.


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Die query kan trouwens in 1x...

Iets als:
SET node_lft = (CASE WHEN node_lft ... THEN node_lft + 1 WHEN ... THEN ... ELSE node_lft END),
node_rgt = (CASE .... END);

Ik heb iig in Celko's boek SQL For Smarties een voorbeeld gezien en wel eens nagemaakt, wellicht dat die "single query"-versie ook online wel ergens staat als je zoekt op Celko's Nested set, maar met je eigen updates moet het ook wel lukken die samen te voegen.
Over performance hoef je je denk ik niet echt druk te maken, je moet toch alle nodes aanpassen, dus het zal zelfs ietsje vlotter zijn om dat dan maar in 1 enkele query te doen.

Verder kan je overigens de controle over het al dan niet "stoppen" van het script bij "browser disconnect" bepalen via de ignore_user_abort functie.
Pagina: 1