Trying to get property of non-object

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

Nekdy se mi stane, ze mi u stranky (ktera v 99% pripadu nebehne bez problemu) vyskoci hlaska „Trying to get property of non-object“.
File: …\vendor\nette\nette\Nette\Database\Table\ActiveRow.php:312

public function __unset($key)
303:        {
304:            throw new Nette\DeprecatedException('ActiveRow is read-only.');
305:        }
306:
307:
308:        protected function accessColumn($key, $selectColumn = TRUE)
309:        {
310:            $this->table->accessColumn($key, $selectColumn);
311:            if ($this->table->getDataRefreshed() && !$this->dataRefreshed) {
312:                $this->data = $this->table[$this->getSignature()]->data;
313:                $this->dataRefreshed = TRUE;
314:            }
315:        }

Zajimave je, ze mi staci obnovit stejnou stranku (F5) a vse nebehne bez problemu (neudelam nic vic, nezmeni se data ani nic jineho). Co by to mohlo byt?

David Matějka
Moderator | 6445
+
0
-

verze nette? kod, ktery to dela?…

JarekSt
Člen | 39
+
0
-

matej21 napsal(a):

verze nette? kod, ktery to dela?…

nette verze: 2.1.0 (ale delalo to i na jinych verzich – 2.1.4 a 2.2.1).
nevim, co vsechno chces videt, ale treba takhle vypada sablona (zobrazuji se data z tabulky, ktera ma seznam nejakych temat („stromova struktura“) ‚idecko‘, ‚nazev‘, ‚idecko nadrizeneho uzlu‘ + nejake dalsi atributy):

{block content}
	<div class="col-md-12 column">
            <h1>Administrace témat</h1>
            {snippet temata}
            {foreach $temata as $tema}
                {? $selection = $tema->related('temata','id_parent')->order('poradi ASC')}
                <p>
                    <h3>
                    <a class="btn btn-default btn-xs ajax" n:href="blokTema! $tema->id_tema,$tema->pristupne"><span n:class="$tema->pristupne=='A' ? 'glyphicon glyphicon-ok' : 'glyphicon glyphicon-lock'"></span></a>
                    <a n:if="!$iterator->first" class="btn btn-primary btn-xs ajax" n:href="posunTema! up,$tema->id_parent,$tema->poradi"><span class="glyphicon glyphicon-arrow-up"></span></a>
                    <a n:if="!$iterator->last" class="btn btn-primary btn-xs ajax" n:href="posunTema! down,$tema->id_parent,$tema->poradi"><span class="glyphicon glyphicon-arrow-down"></span></a>
                    {$tema->nazev_tema} <a class="btn btn-default btn-xs pull-right" n:href="AdminTemata:editovatTema $tema->id_tema"><span class="glyphicon glyphicon-edit"></span> změnit</a>
                    <a n:if="$selection->count()==0" class="btn btn-danger btn-xs ajax pull-right" n:href="deleteTema! $tema->id_tema"><span class="glyphicon glyphicon-remove"></span> smazat</a>
                    </h3>
                </p>

                {if $selection->count()>0}
                <ul>
                    {foreach $selection as $polozka}
                    <li n:class="$iterator->odd ? odd:even">
                        <a class="btn btn-default btn-xs ajax" n:href="blokTema! $polozka->id_tema,$polozka->pristupne"><span n:class="$polozka->pristupne=='A' ? 'glyphicon glyphicon-ok' : 'glyphicon glyphicon-lock'"></span></a>
                         <a n:if="!$iterator->first" class="btn btn-primary btn-xs ajax" n:href="posunTema! up,$polozka->id_parent,$polozka->poradi"><span class="glyphicon glyphicon-arrow-up"></span></a>
                         <a n:if="!$iterator->last" class="btn btn-primary btn-xs ajax" n:href="posunTema! down,$polozka->id_parent,$polozka->poradi"><span class="glyphicon glyphicon-arrow-down"></span></a>
                        {$polozka->nazev_tema}
                         <a class="btn btn-default btn-xs pull-right" n:href="AdminTemata:editovatTema $polozka->id_tema"><span class="glyphicon glyphicon-edit"></span> změnit</a>
                         <a class="btn btn-danger btn-xs ajax pull-right" n:href="deleteTema! $polozka->id_tema"><span class="glyphicon glyphicon-remove"></span> smazat</a>
                    </li>
                    {/foreach}
                    <li><a class="btn btn-success btn-xs" n:href="AdminTemata:pridatTema $polozka->id_parent"><span class="glyphicon glyphicon-plus"></span> přidat nové podtéma</a></li>
                </ul>
                {else}
                    <ul>
                        <li><a class="btn btn-success btn-xs" n:href="AdminTemata:pridatTema $tema->id_tema"><span class="glyphicon glyphicon-plus"></span> přidat nové podtéma</a></li>
                    </ul>
                {/if}
            {/foreach}
            {/snippet}
            <p><a class="btn btn-success btn-xs" n:href="AdminTemata:pridatTema 0"><span class="glyphicon glyphicon-plus"></span> přidat nové téma</a></p>
	</div><!--col-md-12 column-->
{/block}
Tabetha
Člen | 140
+
0
-

robí to aj mne, nikdy som neprišiel na príčiny, nikdy sa nikdo nesťažoval, že by nešla stránka. Len to nachádzam v logu. A bolo to od 2.0.0 a vyššie snáď vždy

JarekSt
Člen | 39
+
0
-

struktura tabulky:
CREATE TABLE temata (
id_tema int(10) unsigned NOT NULL AUTO_INCREMENT,
id_parent int(10) unsigned NOT NULL,
nazev_tema varchar(200) COLLATE utf8_czech_ci DEFAULT NULL,
popis_tema text COLLATE utf8_czech_ci,
pristupne char(1) COLLATE utf8_czech_ci DEFAULT NULL,
poradi smallint(6) DEFAULT NULL,
PRIMARY KEY (id_tema),
UNIQUE KEY id_parent,poradi (id_parent,poradi)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci

Caine
Člen | 216
+
0
-

To je proste bug v NDBT a jsou s tim problemy leta (i kdyz min a min)..

hranicka
Člen | 23
+
0
-

Stává se nám to také. Když se smaže cache, poté se provede request na nějakou stránku (Nette\Database si vytvoří cache) a pak přejdeme na další stránku, Nette\Database\Table\Selection někdy pozlobí, což se projeví jak píše JarekSt.
Když je vypnutý debug mode, tak ani F5 nepomůže.

Možné provizorní řešení:

  • upravit Nette\Database\Table\Selection::offsetGet
public function offsetGet($key)
{
	$this->execute();

	// solves strange cache bug
	$rows = ($this->rows) ? : $this->data;

	return $rows[$key];
}

Nebo je možný také jiný hack (i když předchozí řešení považuji za „lepší“):

  • upravit Nette\Database\Table\ActiveRow::accessColumn
protected function accessColumn($key, $selectColumn = TRUE)
{
	$this->table->accessColumn($key, $selectColumn);
	if ($this->table->getDataRefreshed() && !$this->dataRefreshed) {
		$row = ($this->table[$this->getSignature()]) ? : $this->table->get($this->getSignature());
		$this->data = $row->data;
		$this->dataRefreshed = TRUE;
	}
}

Issue:
https://github.com/…se/issues/15

Chybu nedokážu zatím reprodukovat cíleně, do té doby nemůžu dopsat testy a pullnout opravu :(

Editoval hranicka (3. 7. 2014 7:37)

Jan Endel
Člen | 1016
+
0
-

Zkoušel jsi poslat pull a dopsat testy? @hranicka

hranicka
Člen | 23
+
0
-

@JanEndel Zatím to sem dávám jako návrh (příčina bude možná jinde), problém je, že tu chybu nedokážu spolehlivě reprodukovat. Až se mi to povede, dopíšu testy a pošlu pull, zatím nemůžu :(

Snad se ozve ještě někdo komu se to stává. Pokusím se ještě vypozorovat kdy přesně k tomu problému dojde, najít řešení a pullnout. Ale může to chvilku trvat.

oskarmaniak
Člen | 29
+
0
-

Po přechodu z nette 2 na 2.2.1, 2.2.2 bojuji nejspíše s obdobným cachovacím problémem, který má za následek Trying to get property of non-object chybovou hlášku.

/temp/cache/latte hlásí problém při vyčítání proměnné poslanou do šablony z presenteru

<?php echo Latte\Runtime\Filters::escapeHtml($eventdetail->tag->label, ENT_NOQUOTES) ?>

Pokud nahodím zálohu nette 2 tak se data vyčítají, údaje v DB tedy existuje.

Dostal jsem se ke kroku vypnout latte cachování v tu chvíli se chybová hláška změní na:

Trying to get property of non-object
File: ..\libs\Nette\Latte\Engine.php(154) : eval()'d code:82

A na tom jsem se zasekl…

PHP 5.4.19
Apache/2.4.4 (Win32) OpenSSL/0.9.8y PHP/5.4.19
Tracy 2.2.2
Nette Framework 2.2.2 (released on 2014-06-26)

Editoval oskarmaniak (1. 7. 2014 16:58)