Problem s databazou. No reference found

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

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
+
0
-

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:{}}
?>
hrach
Člen | 1838
+
0
-

zkuste pls tuto vetev: https://github.com/…-refactoring

Eda
Backer | 220
+
0
-

Bohužel nefrčí :-(

Jestli je potřeba ještě dodat nějaký dump, stačí říct.

hrach
Člen | 1838
+
0
-

Hm, chtelo by to zjistit, proc dany dotaz na strukturu db vraci 0 dat…

Eda
Backer | 220
+
0
-

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…

matto
Člen | 55
+
0
-

Ja som svoj problem vyriesil cestou najmensieho odporu a to, ze som to prerobil na stare dobre dibi. Sice mi to zabralo hodinu prepisovania, ale konecne to slape ako ma. I ked ma to mrzi, pretoze Nette\Database mi pripada pohodlnejsie…

hrach
Člen | 1838
+
0
-

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
+
0
-

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

hrach
Člen | 1838
+
0
-

Mohl bys to pls zkusit oddupovat ten jedinej query, kde se ty data ztrati???

Eda
Backer | 220
+
0
-

Tak celý problém měl nakonec velmi jednoduché řešení. Mít správně nakonfigurované připojení k databázi.

Celou dobu jsem používal jinou databázi než jsem si myslel, že používám. Proto to nefungovalo.

Omlouvám se za hloupou chybu :-(

Editoval Eda (13. 7. 2012 0:38)

logging
Člen | 4
+
0
-

Zdravím, přesně tato chyba popsaná v prvním postu se mi nyní stále objevuje. Dělá to hlavně u záznamů, které v tabulce chybí. Zkoušel jsem nahrát opravny fix, ale také nepomohlo. Přepisovat na DIBI se mi to moc nechce. Nemáte někdo nějakou radu? Moc děkuji

castamir
Člen | 629
+
0
-

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}
logging
Člen | 4
+
0
-

díky moc za reakci…takže pracuje s case insensitive a ani jedna varianta neprošla…vždy to hodí chybu a po jednom reloadu to funguje

Editoval logging (24. 8. 2012 8:55)

hrach
Člen | 1838
+
0
-

Co je opravny fix? Zkus aktualni master vetev nette.

hrach
Člen | 1838
+
0
-

A jsi si jistej, zes neklikl na zip a nestahl omylem jinou verzi? Uz se to tu stalo…
Pokud ne, zaloz nove vlakno, pridej dump db, a patricnou cast kodu sablony/presenteru.