databáze – rozdílné fungování na serveru / localu

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

Ahoj,

začínám s nette a mám menší problém. Bude to asi banalita. Snažím se připojit k db a myslím že úspěšně, ovšem jeli tomu opravdu tak, nevím protože nejsem schopen to otestovat, každopádně laděnka začala ukazovat queries.

Config-
config.neon: http://pastebin.com/rejrG1q1

Model-
Repository.php: http://pastebin.com/XdNKgX0y
ArticleRepository.php: http://pastebin.com/LS7WTWG3

Presenter-
ArticlePresenter.php: http://pastebin.com/DYxHntaZ

co to dělá je k nahlednutí zde: http://kerouac.cz/ – vypisuje Class ArticleRepository has not been found. Ovšem netuším proč, protože se mi to zdá zapsané vše okay a na lokálu to funguje jak má. Co by tedy mohlo být příčinou nenalezení této třídy?


další věcí je použití funkce getTable() a následně findAll() které se nacházejí v repository.php. Můžete si všimnout, že jsem si tam nechal vypisovat náhradní text, je to z toho důvodu, abych otestoval, jestli je to průchozí do šablony, což úspěšně jde, ovšem jak tam navrátím původní hodnotu(tu v komentáři) tak dojde k tomu že fce getTable generuje nějakou sněť objektů, byť by člověk očekával výstup řádků tabulky ve formě třeba polí.

Laděnka vypisuje „htmlspecialchars() expects parameter 1 to be string, object given“ a po klasickém var_dump($this->getTable()) ta ona sněť objektů vypadá takto, pokud to okopčim celé:


class Nette\Database\Table\Selection#130 (15) { protected $connection ⇒ class Nette\Database\Connection#136 (6) { private $dsn ⇒ string(35) "mysql:host=localhost;dbname=kerouac“ private $driver ⇒ class Nette\Database\Drivers\MySqlDriver#138 (1) { private $connection ⇒ … } private $preprocessor ⇒ class Nette\Database\SqlPreprocessor#124 (6) { private $connection ⇒ … private $driver ⇒ class Nette\Database\Drivers\MySqlDriver#138 (1) { … } private $params ⇒ NULL private $remaining ⇒ NULL private $counter ⇒ NULL private $arrayMode ⇒ NULL } private $databaseReflection ⇒ class Nette\Database\Reflection\DiscoveredReflection#114 (4) { protected $cache ⇒ class Nette\Caching\Cache#123 (4) { … } protected $cacheStorage ⇒ class Nette\Caching\Storages\FileStorage#126 (4) { … } protected $connection ⇒ … protected $structure ⇒ array(1) { … } } private $cache ⇒ class Nette\Caching\Cache#125 (4) { private $storage ⇒ class Nette\Caching\Storages\FileStorage#126 (4) { … } private $namespace ⇒ string(48) „Nette.Database.3e5d010f62496188f087ec5bd26b988b\000“ private $key ⇒ NULL private $data ⇒ NULL } public $onQuery ⇒ array(1) { [0] ⇒ array(2) { … } } } protected $sqlBuilder ⇒ class Nette\Database\Table\SqlBuilder#121 (12) { protected $selection ⇒ … protected $connection ⇒ class Nette\Database\Connection#136 (6) { private $dsn ⇒ string(35) „mysql:host=localhost;dbname=kerouac“ private $driver ⇒ class Nette\Database\Drivers\MySqlDriver#138 (1) { … } private $preprocessor ⇒ class Nette\Database\SqlPreprocessor#124 (6) { … } private $databaseReflection ⇒ class Nette\Database\Reflection\DiscoveredReflection#114 (4) { … } private $cache ⇒ class Nette\Caching\Cache#125 (4) { … } public $onQuery ⇒ array(1) { … } } protected $delimitedTable ⇒ string(9) „article“ protected $select ⇒ array(0) { } protected $where ⇒ array(0) { } protected $conditions ⇒ array(0) { } protected $parameters ⇒ array(0) { } protected $order ⇒ array(0) { } protected $limit ⇒ NULL protected $offset ⇒ NULL protected $group ⇒ string(0) "" protected $having ⇒ string(0) "" } protected $name ⇒ string(7) „article“ protected $primary ⇒ string(2) „id“ protected $rows ⇒ NULL protected $data ⇒ NULL protected $referenced ⇒ array(0) { } protected $referencing ⇒ array(0) { } protected $referencingPrototype ⇒ array(0) { } protected $aggregation ⇒ array(0) { } protected $accessed ⇒ NULL protected $prevAccessed ⇒ NULL protected $observeCache ⇒ bool(false) protected $checkReferenced ⇒ bool(false) protected $keys ⇒ array(0) { } }
"

Jak to mám chápat? Co se mi to snaží říct?

Je to obsáhlejší čtení, takže děkuji za každou reakci, řeším to už pár dní a pořád né a né,
Petr.

enumag
Člen | 2118
+
0
-

„Class ArticleRepository has not been found.“ – to RobotLoader občas dělá, stačí smazat cache.

„htmlspecialchars() expects parameter 1 to be string, object given“ – pravděpodobně v šabloně máš něco jako {$article}, tj. snažíš se vypsat něco, co je objekt (zřejmě ActiveRow). Rozklikej si laděnku, kterou ti to hází a podívej se na řádek té šablony. Mělo by tam být asi něco jako {$article->name}. Když nevidím ten výstup laděnky tak konkrétnější být nemohu.

qteck
Člen | 164
+
0
-

cache jsem několikrát smazal, možná to drží ještě VPSko někde, kdo ví, to uvidíme zítra, ale co ta druhá část otázky.

abstract class Repository extends Nette\Object
{
        /** @var Nette\Database\Connection */
        protected $connection;

        public function __construct(Nette\Database\Connection $db)
        {
                $this->connection = $db;
        }


        /**
         * Vrací objekt reprezentující databázovou tabulku.
         * @return Nette\Database\Table\Selection
         */
        protected function getTable()
        {
                // název tabulky odvodíme z názvu třídy
                preg_match('#(\w+)Repository$#', get_class($this), $m);
                return $this->connection->table(lcfirst($m[1]));
        }

------>    $this->connection->table(lcfirst($m[1])); //toto vrací onen objektový obsah

Je to přesně tak jak říkáš vypisuji objekt v šabloně {$article}, předtím volám ještě dump a zkoumu to, ale jde o to, kde se tam takovýto obsah bere? očekával bych tam obsah tabulky article a ona tam takováhle sněť objektů. Co je tomu příčinou? Popřípadě, jak se správně dotázat?

Editoval qteck (10. 11. 2012 22:20)

enumag
Člen | 2118
+
0
-

To není sněť objektů, to je prostě objekt Selection, který v sobě má odkazy na další objekty, protože je potřebuje při práci.

Když říkáš, že v cache to není tak mne napadá problém v jmenných prostorech nebo překlep v názvu třídy.

qteck
Člen | 164
+
0
-

tak jsem použil metodu $this->findBy(array('1')); která jasně v anotaci ukazuje formát returnu:

	/**
	 * Vrací řádky podle filtru, např. array('name' => 'John').
	 * @return Nette\Database\Table\Selection
	 */
	public function findBy(array $by)
	{
		return $this->getTable()->where($by);
	}

a stále to vypisuje ten stejný obsah objektů, naprosto bezezměny. proto prostě jediné kam to všechno vede je tento kus kódu:

abstract class Repository extends Nette\Object
{
	/** @var Nette\Database\Connection */
	protected $connection;



	public function __construct(Nette\Database\Connection $db)
	{
		$this->connection = $db;
	}



	/**
	 * Vrací objekt reprezentující databázovou tabulku.
	 * @return Nette\Database\Table\Selection
	 */
	protected function getTable()
	{
		// název tabulky odvodíme z názvu třídy
		preg_match('#(\w+)Repository$#', get_class($this), $m);
		return $this->connection->table(lcfirst($m[1]));
	}

já nevím, ale nemůže to ukazovat na to že se db nedokáže připojit?

enumag
Člen | 2118
+
0
-

Že to vrací tenhle objekt je naprosto v pořádku. Spíš ukaž tu šablonu.

Místo var_dump používej \Nette\Diagnostics\Debugger::barDump, respektive si na tuhle funkci udělej nějakou zkratku.

qteck
Člen | 164
+
0
-

no šoupu to tam jednoduše takto:

{block content}

<h1 style="">Lorem Ipsum forem popuk</h1>
{var_dump($article)}

.
.
.

oka – právě jsem se mezitím snažil najít objekt ve kterém by to třeba bylo, ale nezdá se že by tam něco bylo v tom k vypsání

ViPEr*CZ*
Člen | 817
+
0
-

Nezkoumejte objekt var_dumpem, ale mrkněte do API, kde to je popsané líp.
Pokud dumpujete v šabloně tak takhle:

{dump $arcticle}
qteck
Člen | 164
+
0
-

ještě navíc mi laděnka neukazuje žádné queries, takže ani asi nedochází k položení toho dotazu, otázka je ovšem opět proč?

neon vypadá takto: http://pastebin.com/um3m1Bd4 a to je vše co jsem pro spuštění db, udělal doufám že je to tedy vše. loginy, hosty názvy db jsem zkontroloval už nespočetněkrát

Editoval qteck (11. 11. 2012 21:21)

enumag
Člen | 2118
+
0
-

Pořád nějak nechápu o co se vlastně snažíš. Jestli databáze funguje ověříš tak že se pokusíš něco vypsat (NDB pošle SQL dotaz až když v šabloně zavoláš foreach nad tou tabulkou).

qteck
Člen | 164
+
0
-

aha, tak to je pak jasné proč v tom dumpu není vrácen žádnej řádek. prosimtě, mohl by si mi to jenom na příkladu ukázat, jak by si to vypsal ty? nevím z jakého objektu bych to měl lovit.

název tabulky article->name, podle apidokumentace bych to hledal pod article->rows laděnka pak ovšem oznamuje a říká že neexistuje.

enumag
Člen | 2118
+
0
-

První věc: proměnná $article je Selection, tedy množina řádků, nikoli pouze jeden!

{foreach $article as $row}
	{* $row je objekt třídy ActiveRow představující konkrétní článek *}
	{$row->name} {* vypíše název článku (tedy pokud v té tabulce článků máš sloupec name) *}
{/foreach}

Možná ti pomůže když si to Selection pojmenuješ $articles místo $article. ;-)

Editoval enumag (11. 11. 2012 22:37)

qteck
Člen | 164
+
0
-

ty jo funguje to, to je super, moc děkuju!

teď jen tedy ještě jedna menší otázečka, jak by to vypadalo pouze pro jeden řádek? selection – množiny řádků; activeRow – jeden řádek.

příklad:

class UserRepository extends Repository
{

-takto vypadá tedy volání podle jednoho id;
	/**
	 * @return Nette\Database\Table\ActiveRow
	 */
	public function findByName($username)
	{
		return $this->findBy(array('username' => $username))->fetch();
	}

volání více záznamů
	/**
	 * @return Nette\Database\Table\Selection
	 */
	public function findByName($username,$username2)
	{
		return $this->findBy(array('username' => $username,'username' => $username2))->fetch();
	}
}

jsou to právě ty anotace co rozhodnou o tom z jaké třídy se bude ono rows volat? nebo jak to funguje?

popřípadě, co říká tento řádek konkrétně ono v uvozovkách?

function tasksOf(Nette\Database\Table\ActiveRow $list)

je to jen forma přetypování, které říká že $list bude obsahovat objekt z třídy ActiveRows?

ViPEr*CZ*
Člen | 817
+
0
-

qteck napsal(a):

function tasksOf(Nette\Database\Table\ActiveRow $list)

je to jen forma přetypování, které říká že $list bude obsahovat objekt z třídy ActiveRows?

Toto je základ jazyka. Je to pevné určení typu, který funkce tasksOf přijímá. Pokud se jako parametr pošle něco jiného než objekt Nette\Database\Table\ActiveRow, pak dojde k vyvolání vyjímky.

jiri.pudil
Nette Blogger | 1032
+
0
-

jsou to právě ty anotace co rozhodnou o tom z jaké třídy se bude ono rows volat? nebo jak to funguje?

Ty anotace jsou jenom nápověda pro programátora (a pro IDE), případně se z nich generuje dokumentace. O tom, co která metoda vrátí, rozhoduje to, co je v té metodě uvedené za klíčovým slovem return.

U Nette tříd to lze dohledat v API dokumentaci. Tam například zjistíš, že fetch() vrací ActiveRow.

enumag
Člen | 2118
+
0
-

Ne, ty anotace nerozhodují naprosto o ničem. To je jen informativní komentář podle kterého se orientuje IDE při napovídání.

Ta druhá metoda je úplně špatně:

  1. Místo dvou parametrů by měla přijímat pole např. $names.
  2. A to pole by měla taky použít pomocí return $this->findAll()->where(‚username‘, $names); //vygeneruje do SQL operátor IN
  3. Rozhodně by neměla na konci volat fetch. Metoda fetch totiž vrací jeden (v tomto případě první) řádek, tedy ActiveRow, nikoli Selection.
qteck
Člen | 164
+
0
-

oka a moc děkuji za vysvětlení, ještě jednou děkuji (především enumagovi) :-))