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 | 1844
 
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}