Problem s databazou. No reference found
- matto
- Člen | 55
Ahote,
neviem co robim zle, ale casto sa mi stava, ze vidim tuto chybu:
No reference found for $orders->ID.
Vyskytuje sa na roznych tabulkach a v roznych prezenteroch a iba vtedy ked mam vymazany temp, ako nahle dam refresh, vsetko ide ako ma az kym zase nevymazem temp.
Kod:
public function renderDefault() {
$table = $this->context->createOrders();
$orders = $table->where(array("state" => "new"));
$this->template->orders = $orders;
}
{foreach $orders as $orders}
<tr>
<td>{$orders->ID}</td>
<td>{$orders->name}</td>
</tr>
{/foreach}
- Eda
- Backer | 220
Právě jsem chtěl postnout příspěvek se stejným problémem.
Abych to trochu ukotvil:
Schéma databáze:
<?php
CREATE TABLE `novinka` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`server_id` int(6) NOT NULL,
`titulek` varchar(100) COLLATE utf8_czech_ci DEFAULT '',
`informace` text COLLATE utf8_czech_ci,
`datum` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`typ_nov` tinyint(4) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `datum` (`datum`),
KEY `server_id` (`server_id`),
CONSTRAINT `novinka_ibfk_1` FOREIGN KEY (`server_id`) REFERENCES `server` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
CREATE TABLE `server` (
`id` int(6) NOT NULL AUTO_INCREMENT,
`nazev` varchar(50) COLLATE utf8_czech_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `nazevserveru` (`nazev`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
?>
Kód, který způsobí chybu:
<?php
foreach($selection as $r)
{
$n = new NovinkaEntity;
$n->id = $r->id;
$n->titulek = $r->titulek;
$n->informace = $r->informace;
$n->datum = $r->datum;
$n->server_id = $r->server_id;
$s = new Server;
$s->nazev = $r->server->nazev; // tento řádek způsobí chybu
$n->server = $s;
$return[] = $n;
}
?>
Verze Nette je: 2.0.3 revision eb558ae
Dole v Debug baru vidím dotaz:
<?php
SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL AND TABLE_NAME = 'novinka'
?>
a je u něj napsané, že databáze vrátila 0 řádků.
Když však dotaz spustím v Admineru, pořadovaný řádek mi to najde.
Může to mít nějakou souvislost s tímto vláknem ?
Cache jsem zkoušel několikrát promazávat a nepomohlo to.
Pro úplnost ještě obsah 2 souborů database cache:
<?php
<?php //netteCache[01]000070a:2:{s:4:"time";s:21:"0.87180900 1341953587";s:10:"serialized";b:1;}?>a:6:{s:2:"id";b:1;s:7:"titulek";b:1;s:9:"informace";b:1;s:5:"datum";b:1;s:9:"server_id";b:1;s:6:"server";b:1;}
?>
<?php
<?php //netteCache[01]000070a:2:{s:4:"time";s:21:"0.87101100 1341953587";s:10:"serialized";b:1;}?>a:3:{s:7:"primary";a:1:{s:7:"novinka";s:2:"id";}s:7:"hasMany";a:0:{}s:9:"belongsTo";a:0:{}}
?>
- Eda
- Backer | 220
Ani když zavolám přímo:
<?php
$x = $this->db->getDatabaseReflection();
$x->getBelongsToReference('novinka', 'server');
?>
Tak to nevrátí nic.
Dokonce ani tohle nevrátí nic:
<?php
$this->db->query("
SELECT
CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'novinka'
AND REFERENCED_TABLE_NAME` IS NOT NULL
AND TABLE_SCHEMA = DATABASE()
");
?>
Velmi zajímavé je, že tohle už vrátí jeden záznam:
<?php
$this->db->query("
SELECT
CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'novinka'
AND TABLE_SCHEMA = DATABASE()
");
?>
Takže problém bude zřejmě v té třetí podmínce.
Když použiju klasickou funkci mysql_query():
<?php
$r = mysql_query("
SELECT
CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'novinka' AND TABLE_SCHEMA = DATABASE()
AND REFERENCED_TABLE_NAME IS NOT NULL
");
?>
Ten záznam to kupodivu najde…
- hrach
- Člen | 1838
tady v tom mas teda zrovna chybu – prekpep.
$this->db->query("
SELECT
CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'novinka'
AND REFERENCED_TABLE_NAME` IS NOT NULL
AND TABLE_SCHEMA = DATABASE()
");
kazdopadne to vraci chybu asi i po jeho oprave, tnz. jakou mas verzi php, mysql, atp?
- Eda
- Backer | 220
Jo, jestli myslíš ten apostrof, tak to je jen překlep. Zkoušel jsem to totiž s apostrofy i bez nich a pak jsem to nějak zapomněl umazat.
Nicméně ano, vrací to chybu. (Exceptionu No reference found, když volám jednotlivé dotazy, proběhnou v pořádku, jen nevrátí nic.)
Nechápu ale, jaktože je rozdíl mezí tím, když volám $db->query a mysql_query.
Verze:
PHP: 5.3.10–1ubuntu3.2
Apache/2.2.22 (Ubuntu)
MySQL 5.5.24
- castamir
- Člen | 629
Prvně si zjisti, zda ti databáze pracuje s case sensitive nebo case insensitive údaji, dále vyzkoušej následující 3 varianty:
{foreach $orders as $orders}
<tr>
<td>{$orders->id}</td>
</tr>
{/foreach}
{foreach $orders as $orders}
<tr>
<td>{$orders["ID"]}</td>
</tr>
{/foreach}
{foreach $orders as $orders}
<tr>
<td>{$orders["id"]}</td>
</tr>
{/foreach}