Chyba při vytváření presenteru podle tutoriálu
- xciza
- Člen | 194
Hoj, procházím tutoriál a zasekl jsem se u přepisování souboru default.latte. Nakopíroval jsem si kód, který je v tutoriálu ale když se chci podívat co to vypíše tak mě to vyhodí hlášku: „PDOException – No reference found for $task->user“. Když v souboru ale smažu řádek <td>{$task->user->name}</td> tak to jde. Dočetl jsem se něco o cizích klíčích v databázi, ale koukal jsem do ni a měli by tam být. Poradíte prosím,kde by mohla být chyba?
- xciza
- Člen | 194
Databáze je tvořeno příkazem SQL z tutoriálu zde na stránkách čili:
CREATE TABLE `task` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`text` varchar(100) NOT NULL,
`created` datetime NOT NULL,
`done` tinyint(1) unsigned NOT NULL DEFAULT 0,
`user_id` int(10) unsigned NOT NULL,
`tasklist_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `order` (`tasklist_id`,`done`,`created`),
INDEX `fk_user` (`user_id`),
CONSTRAINT `fk_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
CONSTRAINT `fk_tasklist` FOREIGN KEY (`tasklist_id`) REFERENCES `tasklist` (`id`)
);
CREATE TABLE `tasklist` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`password` char(128) NOT NULL,
`name` varchar(30) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
);
- tesil
- Člen | 1
Dobrý den, mám stejný problém. Zkouším to na localhostu, používám balík XAMPP pro Apache a MySQL. Databázi jsem vytvořil následovně. Stáhnul jsem soubory quickstart.mysql.sql a data.mysql.sql. Otevřel adminer na localhost/quickstart/www/adminer, kde jsem provedl SQL příkazy nahráním stažených souborů. Stejná chyba No reference found for $task->user na řádku <td><?php echo Nette\Templating\Helpers::escapeHtml($task->user->name, ENT_NOQUOTES) ?></td>. Jako kolega, tak i já po vymazání řádku <td>{$task->user->name}</td> nemám problém. Problém s fk_key se nabízí, ale jak na něj?
EDIT: V PHPMyAdminoj jsem si nastavil v parametrech tabulek Uložiště na typ InnoDB. Poté tabulka task-Struktura-zobrazit relace a růčo nastavil pro sloupec user_id FOREIGN KEY na database.user.id (database je jméno mojí databáze). Je to ruční nastavení, ale funguje to.
Editoval tesil (21. 2. 2012 22:53)
- xciza
- Člen | 194
tesil napsal(a):
Dobrý den, mám stejný problém. Zkouším to na localhostu, používám balík XAMPP pro Apache a MySQL. Databázi jsem vytvořil následovně. Stáhnul jsem soubory quickstart.mysql.sql a data.mysql.sql. Otevřel adminer na localhost/quickstart/www/adminer, kde jsem provedl SQL příkazy nahráním stažených souborů. Stejná chyba No reference found for $task->user na řádku <td><?php echo Nette\Templating\Helpers::escapeHtml($task->user->name, ENT_NOQUOTES) ?></td>. Jako kolega, tak i já po vymazání řádku <td>{$task->user->name}</td> nemám problém. Problém s fk_key se nabízí, ale jak na něj?
EDIT: V PHPMyAdminoj jsem si nastavil v parametrech tabulek Uložiště na typ InnoDB. Poté tabulka task-Struktura-zobrazit relace a růčo nastavil pro sloupec user_id FOREIGN KEY na database.user.id (database je jméno mojí databáze). Je to ruční nastavení, ale funguje to.
Jak jsi prosim tě změnil ten typ úložiště? Jsem v PHPAdminoj ve své databázi a vidím její strukturu, kde u jednotlivých tabulek je úložiště MyISAM. Ale nevím jak ho změnit…
Editoval xciza (22. 2. 2012 10:38)
- Michal Majer
- Člen | 8
@xciza Asi už jsi na to přišel, ale sám jsem to teď řešil, tak snad někomu pomůžu, když popíšu jak vyřešit problém s typem té databáze.
Aby se databáze automaticky vytvořila v InnoDB a tudíž fungovali relace, musí se upravit soubor my.ini (u Wampu ho se naléza zde: wamp\bin\mysql\mysql5.1.53)
Úplně na konec pod [mysqld] se musí připsat
default-storage-engine=InnoDB
Pak jakmile se vytvoří databáze, musí se ty tabulky vkládat popořadě
tak, aby šly nejdříve ty bez cizích klíčů, tj. nejdříve
user
a tasklist
a teprve pak task
.
Doufám že to někomu ušetří čas ;-)
- tami
- Člen | 1
„PDOException – No reference found for $task->user“.
Tak s touto hlaskou jsem se potykala dva dny…
Nejdriv jsem zjistila, ze mi chybi foreign keys, tak jsem je nastavila
prikazy:
ALTER TABLE task ADD CONSTRAINT fk_user FOREIGN KEY (user_id) references
user(id);
ALTER TABLE task ADD CONSTRAINT fk_tasklist FOREIGN KEY (tasklist_id) references
tasklist(id);
ale nepomohlo to. Pak jsem si vsimla, ze to mam asi spatne nastavene uloziste,
tak jsem ho zmenila na InnoDB a porad to nechodilo. Nakonec mi pomohl prispevek
vyse od tesil a nastavila jsem ty klice rucne a konecne to chodi…!! Nemuzete
mi nekdo rict, proc pomohlo az to rucni nastaveni? V cem jsem mela chybu, proc
se neprovedly ty prikazy na zmenu klicu, co tady uvadim? Dekuju.
Editoval tami (29. 3. 2012 13:42)
- ja__no
- Člen | 2
stiahol som si https://github.com/…03_presenter
aplikacia funguje zcasti.
a sice po kliknuti na menu napr na: Projekt A. P s url:
QuickStartPresenter/www/task/default/1
tak mi vyhodi chubu: PDOException, No reference found for
$tasklist->related(task)
line 33: $this->template->tasks =
$this->taskList->related(‚task‘)->order(‚created‘);
.. testujem to na xamp, osx, musel som zmenit foreign key a uloziste na
imnnodb
viete poradit, nasmerovat?dakujem
- klay
- Člen | 1
Vytvořte tabulky tímto SQL scriptem
SET FOREIGN_KEY_CHECKS=0;
CREATE TABLE `task` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`text` varchar(100) NOT NULL,
`created` datetime NOT NULL,
`done` tinyint(1) unsigned NOT NULL DEFAULT 0,
`user_id` int(10) unsigned NOT NULL,
`tasklist_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `order` (`tasklist_id`,`done`,`created`),
INDEX `fk_user` (`user_id`),
CONSTRAINT `fk_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
CONSTRAINT `fk_tasklist` FOREIGN KEY (`tasklist_id`) REFERENCES `tasklist` (`id`)
) ENGINE=InnoDB;
CREATE TABLE `tasklist` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`password` char(128) NOT NULL,
`name` varchar(30) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB;
SET FOREIGN_KEY_CHECKS=1;