Nedochází k zápisu do databáze, pokud mu předchází download dat

Janek007
Člen | 8
+
0
-

Ahoj,

v presenteru, který má na starost export dat, chci provést dvě operace:

  1. vyexportovat data ( = výběr z databáze na základě specifikace z formuláře, download ve formě .txt)
  2. uložit aktivitu uživatele ( = uložení popisu operace do databáze)

Úsek PHP:

try
{
    $this->samplesFacade->export($formData, $exportedIds);
    $this->usersFacade->saveUserActivity($this->getUser()->id, "data export");
}
catch (Nette\Database\DriverException $ex)
{
    $this->error($ex->getMessage(), 500);
}

Problém je, že k uložení aktivity nedojde. Když přehodím pořadí (nejdřív uložení aktivity a potom export), je vše v pořádku. Jenže export může teotericky selhat a potom nechci, aby došlo k uložení aktivity. Nevíte, kde je příčina?

Díky, Honza

David Grudl
Nette Core | 8218
+
0
-

Myslím, že křišťálovou kouli tu nikdo nemá, ale můžeš to probrat s https://chatgpt.com/

Janek007
Člen | 8
+
0
-

Ok, s gpt to proberu, ale k té křišťálové kouli – byl můj dotaz nekonkrétní?

Infanticide0
Člen | 103
+
+3
-

Moje koule mi řiká, že ta tvoje metoda export asi vrací data a ukončuje request, proto ti to pak nezaloguje akci.
Jestli to tak je, tak je to blbost a předělej to.

Janek007
Člen | 8
+
0
-

Tvoje koule měla pravdu (použil jsem kus svého starého kódu a tohohle jsem si nevšiml…)

Dík…

m.brecher
Generous Backer | 863
+
+1
-

@Janek007

Na tvůj dotaz v češtině copilot nepíše že nemá křišťálovou kouli, ale nabízí konkrétní řešení. Přehodit pořadí download x save a transakcí zajistit, aby buďto proběhly obě operace nebo žádná + dodá vzorek kódu:

try {
    $this->database->beginTransaction();

    // Uložení aktivity uživatele
    $this->usersFacade->saveUserActivity($this->getUser()->id, "data export");

    // Export dat
    $this->samplesFacade->export($formData, $exportedIds);

    $this->database->commit();
} catch (Nette\Database\DriverException $ex) {
    $this->database->rollBack();
    $this->error($ex->getMessage(), 500);
}

Mě takhle od boku přijde že to má logiku a já bych to tak řešil také. Copilot ale řešení včetně smysluplného vzorku kódu dodal za 10 vteřin. Doba se mění a dnes je lepší předhodit dotaz nejprve copilotu a až když selže tak zkusit fórum.

Janek007
Člen | 8
+
0
-

Jojo, už jsem to takhle nějak uplichtil taky… V tomhle případě bylo ale řešením si ten svůj kód nejdřív pořádně přečíst, pak by k dotazu ani nedošlo (v tomto je doba pořád stejná).

Díky za odpovědi.