Výjimka od PDO – zjištění podrobností

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
MikeLacroix
Člen | 60
+
0
-

Zdravím,

PDO mi úplně na konec šablony přidává chybový výpis:

Fatal error: Uncaught exception ‚PDOException‘ with message ‚You cannot serialize or unserialize PDO instances‘ in [no active file]:0
Stack trace: #0 [internal function]: PDO->__sleep() #1 {main} thrown in [no active file] on line 0

Nemám tušení, kde k chybě dochází. Nějaká rada, kam umístit nějaký catch (PDOException…) nebo něco, abych zjistil trochu víc, kde k chybě dochází?

enumag
Člen | 2118
+
0
-

Tipnul bych si že se snažíš ukládat ActiveRow do session nebo něco podobného.

MikeLacroix
Člen | 60
+
0
-

To jo, taky mam takové tušení. Ale nemůžu dojit na to, kde…

romiix.org
Člen | 343
+
0
-

Bez zdrojákov ti asi nikto nepomôže…

MikeLacroix
Člen | 60
+
0
-

Zdroják sem bohužel nepošlu, protože jde o větší aplikaci a jak říkám, nemám tušení, kde k chybě dochází.

Čekal jsem spíš, že půjde něco udělat s tou (skoro) nicneříkající hláškou tak, abych mi řekla, kde je problém. Ruku na srdce: Informace „no active file“, „internal function“, „line 0“ jsou úplně k ničemu.

Případně nějak šikovně globálně trasovat požadavky na uložení do session, nebo co já vím…

Majkl578
Moderator | 1364
+
0
-

MikeLacroix napsal(a):

a jak říkám, nemám tušení, kde k chybě dochází

Myslím, že enumagovo sdělení bylo dost jasné, ne? Šance, že to je tím, je řekněme 95%.

Případně nějak šikovně globálně trasovat požadavky na uložení do session, nebo co já vím…

Můžeš si dát breakpoint sem.

Můj tip je identita při přihlášení nebo něco na ten způsob. :)

romiix.org
Člen | 343
+
0
-

Daj si exit; do stredu kódu (Myslím celý vykonávaný kód v danom pohľade – od bootstrapu cez presenter, model až pokoniec šablóny). Ak sa hláška stratí, presuň sa do stredu druhej polovice, ak nie, tak do stredu prvej polovice kódu.

MikeLacroix
Člen | 60
+
0
-

romiix.org napsal(a):

Daj si exit; do stredu kódu (Myslím celý vykonávaný kód v danom pohľade – od bootstrapu cez presenter, model až pokoniec šablóny). Ak sa hláška stratí, presuň sa do stredu druhej polovice, ak nie, tak do stredu prvej polovice kódu.

:-)

No každopádně Majkl578 díky! Tak už vím, kde to vzniká. A teď mám ještě nový problém: Zkoušel jsem si teda upravit ukládaný objekt tak, aby se při pokusu o serializaci o tu activeRow postaral. Ale k mému nečekanému zjištění se metoda __toString() při pokusu o serializaci objektu nevolá.

Nějaká idea, jak se elegantně – těsně před serializací – postarat tedy o tu active row? Něco jiného než:

<?php

$objekt->activeRow = null;
$session->foo = $objekt;

?>
enumag
Člen | 2118
+
0
-

Při serializaci se nevolá __toString ale __sleep nebo serialize. Viz dokumentace PHP.

Pokud jde o activeRow tak ten pak v podstatě nemáš šanci deserializovat. Tzn. imho je lepší ukládat do session pouze ID.

thunderbuff
Člen | 164
+
0
-

Potřebuješ celou activeRow? Pokud ti jde jen o data, tak do session ukládej jen $activeRow->toArray()

MikeLacroix
Člen | 60
+
0
-

Super! Teď ještě ale jak to implementovat?

<?php
class Obj implements Serializable {}
?>

dokumentace jsem pochopil, že je to ve jmenném prostoru PHP…? Ale ať používám use PHP, \PHP\Serializable, tak mi to Nette nenajde.

Jan Tvrdík
Nette guru | 2595
+
0
-

@MikeLacroix: To jsi pochopil špatně. Je to v globální jmenném prostoru, tedy \Serializable. Buď více pozorný při čtení dokumentace.

MikeLacroix
Člen | 60
+
0
-

Čéče, dal bych ruku do ohně, že to jsem rozhodně zkoušel. No asi jsem se někde překlepl. Díky!