databáze – rozdílné fungování na serveru / localu
- qteck
- Člen | 164
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
„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
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)
- qteck
- Člen | 164
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?
- qteck
- Člen | 164
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)
- qteck
- Člen | 164
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
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
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
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
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
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ě:
- Místo dvou parametrů by měla přijímat pole např. $names.
- A to pole by měla taky použít pomocí return $this->findAll()->where(‚username‘, $names); //vygeneruje do SQL operátor IN
- Rozhodně by neměla na konci volat fetch. Metoda fetch totiž vrací jeden (v tomto případě první) řádek, tedy ActiveRow, nikoli Selection.