Po aktualizaci nette/dibi nefungujou dotazy do databáze

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

Hezký den,
trochu váhám zda stávající dotaz patří sem a nebo spíše na fórum o dibi, jestliže jsem ho špatně umístil tak mě prosím nekamenujte.

Po delší době jsem se rozhodl že aktualizuji Nette (původní verzi žel nevím, ale hodil jsem ji případně na web – jednalo se o nějakou vývojovou verzi jenž jsem používal protože opravovala tenkrát nějaký bug).

Zkusil jsem použít stávající stabilní verzi Nette Framework 0.9.5 pro PHP 5.3 (dibi jsem si vzal také z této verze) a od té doby mi přestaly jít jakékoliv dotazy do databáze skončí na chybě:

DibiDriverException
ERROR: relation "page" does not exist LINE 1: SELECT * FROM "page" ^

kompletní chyba

Je jedno jaký dotaz zadám, vždy to skončí na stejné chybě jen se případně mění název tabulky.

Zkusil jsem použít i Nette Framework 1.0-alpha pro PHP 5.3 (ano trochu mě znervózňuje to označení alpha), bohužel se steným výsledkem.

Netušíte prosím někdo z Vás co s tím? Momentálně mohu zůstat u staré verze jenž mi fungovala, ale zaručeně jednou budu chtít aktualizovat…

Díky moc,
Petr MAŠÁT

Dr.Diesel
Člen | 53
+
0
-

Napada me zkusit napsat ten dotaz i se schematem, tj. neco jako select * from "public"."page" (nevim jak s tim escapovanim), jestli neni treba v tomhle problem. Pokud projde, mozna pomuze neco v tomhle duchu

Perhaps extending the search path with your schema will help you?

SET SEARCH_PATH TO "Financial", public;

Then you could write your query unqualified without the schema:

SELECT * FROM budget;
westrem
Člen | 398
+
0
-

Ukaz ako konfigurujes dibi (ake parametre jej davas pri connectu) (teda napr vypis z config.ini).

Nepouzival si v aplikacii predtym napr. prazdny substitution? Ten je v najnovsej dibi (verim, ze ta je v distribucii s 0.9.5) uz deprecated.

Problem totiz bude podla mna v tom, ze sa k DB prihlasis pod inym ako ocakavanym userom alebo mas v kazdej query nieco co sa substituovalo a generovalo spravny nazov tabulky.

Petr Mašát
Člen | 101
+
0
-

Zdravím,

Dr.Diesel: vyzkoušel jsem upravit volání na

$result = dibi::query(
	'SELECT * FROM [public].[page]'
);

výsledek byl bohužel stejný, tj.

ERROR: relation "public.page" does not exist LINE 1: SELECT * FROM "public"."page" ^

westrem: zasílám ukázku konfigurace config.ini

[common]
php.date.timezone = "Europe/Prague"
php.iconv.internal_encoding = "%encoding%"
php.mbstring.internal_encoding = "%encoding%"
php.include_path = "%appDir%;%libsDir%"
variable.tempDir = %appDir%/cache
security.hash = "******"
service.Nette-Web-IUser = "MyUser"

[development < common]
database.driver = postgre
database.host = "*****"
database.username = "postgres"
database.password = "trini83"
database.database = "template1"
database.lazy = TRUE
database.charset = utf8
database.result:objects = TRUE
service.Nette-Security-IAuthenticator = Users
service.Nette-Security-IAuthorizator  = Permission

[production < development]
database.host = "pg1.tojeono.cz"
database.username = "aikidohostivarcz"
database.password = "*****"
database.database = "aikidohostivarcz"

Prázdný substitution myslím nikde nepoužívám. Ani jsem nevěděl že něco takového je a jde.

Celý projekt jsem hodil na web, není to nijak tajný kód : )

Editoval tachyon (20. 8. 2010 1:02)

westrem
Člen | 398
+
0
-

Okej, chyba bude podla mna v tom, ze PostgreSQL na ine direktivi na nastavovanie pripojenia, tzn oprav si to na nasledovne:

[development < common]
database.driver = postgre
database.host = "*****"
database.user = "postgres"
database.password = "trini83"
database.dbname = "template1"
database.lazy = TRUE
database.charset = utf8
database.result:objects = TRUE
service.Nette-Security-IAuthenticator = Users
service.Nette-Security-IAuthorizator  = Permission

[production < development]
database.host = "pg1.tojeono.cz"
database.user = "aikidohostivarcz"
database.password = "*****"
database.dbname = "aikidohostivarcz"

Pripadne este pridaj nasledovne:

database.postgre.port = 5432

A host, pokial nemas niekde u providera vyslovene napisane zmen na localhost

Petr Mašát
Člen | 101
+
0
-

Hoj,
možná jsem slepota slepá, ale čím se liší prosím tě tvé nastavení od mého? Třeba jsem něco přehlédl, zkusil jsem tam dát do config.ini tvůj kousek kódu a také nefunguje : (
Jinak host mám nastaven na localhost, ty hvězdičky měli být místo toho hesla. Holt psát komenty v jednu ráno se nevyplácí : )
Díky moc za trpělivost.

iguana007
Člen | 970
+
0
-

tachyon napsal(a):

Hoj,
možná jsem slepota slepá, ale čím se liší prosím tě tvé nastavení od mého? Třeba jsem něco přehlédl, zkusil jsem tam dát do config.ini tvůj kousek kódu a také nefunguje : (
Jinak host mám nastaven na localhost, ty hvězdičky měli být místo toho hesla. Holt psát komenty v jednu ráno se nevyplácí : )
Díky moc za trpělivost.

Já vidím rozdíl v user ⇒ username a dbname ⇒ database

Petr Mašát
Člen | 101
+
0
-

Takže jsem slepota slepá : )
Změnil jsem to dle komentáře, leč bohužel stále stejná chyba : (
Němá někdo prosím nějaký nápad co s tím? Pomalu ale jistě začínám upadat do depresí.

Panda
Člen | 569
+
0
-

Opravdu má být jako název databáze „template1“?

Jinak je jedno, jestli ten klíč uvedeš jako „dbname“, nebo jako „database“, protože „database“ je alias pro „dbname“.

westrem
Člen | 398
+
0
-

Panda napsal(a):

Opravdu má být jako název databáze „template1“?

Jinak je jedno, jestli ten klíč uvedeš jako „dbname“, nebo jako „database“, protože „database“ je alias pro „dbname“.

A jasne, nevsimol som si, ze v Driveri sa vola v kode este ::alias, kukal som len v dokumentacii, ze to ma ine predvolby. Kazdopadne toto plati iba pre dibi 1.3 Ked si pozries API pre 1.2 tak tam sa alias robi len pre user → username, nie pre dbname → database.

Avsak rovnaka otazka na tachyona, ma ten nazov byt naozaj template1? :)

Petr Mašát
Člen | 101
+
0
-

Ahoj všichni,
tak připojení se na databázi již funguje, chyba byla v nastavení dbname – mělo tam být postgres a ne  template1.
Nyní se mi již stránka načte, ale z nějakého důvodu to ještě přestalo nalézat šablonu @layout.phtml tj. vygeneruje to na stránku vždy jen obsah

{include $content}

a nic okolo toho. Zkoušel jsem v BasicPresenter.php nastavit

$this->template->layout = "@layout.phtml";

leč nepomohlo : (

Netuší prosím ještě někdo co s tímto?

Ještě jednou díky za trpělivost.

Panda
Člen | 569
+
0
-

Z jaké verze Nette jsi aktualizoval na jakou? Už nějakou dobu se řeší vkládání šablony view do layoutu trochu jinak.

Doplnění: Tak se omlouvám, přečetl jsem si znovu první příspěvek. :-)

Mezi verzemi 0.9.4, kterou máš v tom ZIPu (verzi najdeš vždycky jako konstantu ve třídě Framework), a 0.9.5 by žádné nekompatibility být neměly. Můžeš tady napsat příklad, jak vypadá Tvoje šablona layoutu a nějakého view?

Editoval Panda (23. 8. 2010 9:56)

Petr Mašát
Člen | 101
+
0
-

Zasílám obsah souboru /app/presenters/PagePresenter.php – což je nejvíce používané view

<?php

use \Nette\Forms\Form;

/**
 *
 */
class PagePresenter extends BasePresenter {

	protected function startup() {
		parent::startup();
		$this->model = new PageModel();
		if ($this->params['action'] == 'default' || $this->params['action'] == 'html') {
			$this->page = $this->model->getPageFromUri($this->page_uri);
		} else {
			$this->page = $this->model->getPageFromId($this->params['id']);
		}
		$this->page_id = $this->page['id'];
		$this->page_uri = $this->page['uri'];
		$this->template->page_uri = $this->page['uri'];
		$this->template->page_id = $this->page_id;
		$this->template->page_presenter = $this->page['presenter'];
	}

	public function renderDefault($uri) {
		$this->template->title = $this->page['title'];
		$this->template->text = $this->texy->process($this->page['text']);
		$this->template->test = $this->user->getIdentity();

		/*
		$filedownload = new FileDownload;
		$filedownload->sourceFile = "./gallery/8-prev.jpg";
		$filedownload->download();
		*/
		//FileDownload::getInstance()->setSourceFile("./gallery/8-prev.jpg")->download();
		//throw new BadSignalException("aaa");
		//throw new \Nette\Security\AuthenticationException("aaaaa");

	}

	public function renderCreate() { // ToDo toto přesunout do Admin presenteru
		if (!$this->user->isAllowed('page', 'edit')) {$this->redirect('Admin:login');}

		//$this->template->test = 'aaa';
		if (!isset($this->params['parent'])) {
			// v prvním kroku nového článku musíme zjistit kam že má patřit
			$this->template->step = 1;
			$this->template->structure_forPage = $this->getStructure(-1, 'page');
		} else {
			// v druhém kroku si zjistíme systémové věci
			$this->template->step = 2;
			$form = new Form;
			$form->addText('object_name', 'Název objektu:')
				->addRule(Form::FILLED, 'Pole nesmí být prázdné');
			$form->addSubmit('send', 'Pokračovat');
			$this->template->form = $form;


			if ($form->isSubmitted()) {
				if ($form->isValid() && $form['send']->isSubmittedBy()) {
					$arr = $form->getValues();
					$id = $this->model->createNewPage(2, $this->params['parent'], $arr['object_name']);
					$this->template->test = $id;
					if ($id) {
						$this->redirect('Page:edit', array('id'=>$id));
					} else {
						// ToDo
					}

				}
			}
		}
	}

	public function renderEdit() {
		if (!$this->user->isAllowed('page', 'edit')) {$this->redirect('Admin:login');}

		$this->template->title = '';
		$this->template->text = '';

		$form = new Form;

		$form->addGroup('Obsah');
		$form->addText('title', 'Nadpis:')
			->addRule(Form::FILLED, 'Pole nesmí být prázdné');
		$form->addTextArea('text', 'Obsah');

		$form->addSubmit('preview', 'Náhled celé stránky');
		$form->addSubmit('save', 'Uložit');
		$form->addSubmit('cancel', 'Zrušit');

		$form->addGroup('Systémové věci');
		$form->addText('object_name', 'Název objektu:')
			->addRule(Form::FILLED, 'Pole nesmí být prázdné');
		$form->addText('order', 'Pozice');

		$this->template->form = $form;

		if ($form->isSubmitted()) {
			if ($form->isValid() && $form['preview']->isSubmittedBy()) {
				$arr = $form->getValues();
				$this->template->title = $arr['title'];
				$this->template->text = $this->texy->process($arr['text']);
			}
			else if ($form->isValid() && $form['save']->isSubmittedBy()) {
				$this->model->setPage($this->page_id, $form->getValues());
				//$this->redirect('Page:html', $this->page_uri);
				// musime si na chvilku vytvorit objekt s novou stránkou aby jsme věděli její uri
				$page = $this->model->getPageFromId($this->params['id']);
				header('Location: '.$page['uri']);
			}
			else if ($form['cancel']->isSubmittedBy()) {
				// $this->redirect('Page:html', $this->page_uri);
				// $this->redirect('Page:default', 'index.html');
				header('Location: '.$this->page_uri);
			}
		} else {
			$form->setDefaults(array(
				'title' => $this->page['title'],
				'text' => $this->page['text'],
				'object_name' => $this->page['object_name'],
				'order' => $this->page['order'],
			));
		}
	}


	public function handleSave() {
		//$this->redirect('this', array('uri' => $uri));
	}

	public function renderSignOut($uri) {
		$this->user->signOut();
		// $this->redirect('Page:html', $this->page_uri);
		header('Location: /index.html');
	}
}

a dále jeho šablonu /app/templates/Page/default.phtml

<h1>{$title}</h1>
{!$text}


{if $user_canEdit}
<p id="menu_smallAdmin">
	<a href="{plink Page:edit, 'id'=>$page_id}">Editovat stránku</a>
	{*<a href="{plink Page:signOut 'id'=>$page_id}">Odhlásit se</a>*}
</p>
{/if}

a celé by se to mělo vykreslovat skrze /app/templates/@layout.phtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
	<meta name="copyright" content="Petr MAŠÁT, © 2009" />
	<meta name="author" content="Petr MAŠÁT, © 2009" />
	<meta name="author" content="mailto:tachyon@atlas.cz" />
	<link rel="stylesheet" type="text/css" media="print" href="/css/print.css" />
	<link rel="stylesheet" type="text/css" media="screen,projection" href="/css/basic.css" />
	<!--[if lte IE 6]>
		<link rel="stylesheet" type="text/css" media="screen,projection" href="css/basic-lte-ie6.css" />
	<![endif]-->
	<link rel="stylesheet" type="text/css" media="screen,projection" href="/css/jquery-lightbox-05.css" />
	<script src="/js/jquery.js" type="text/javascript"></script>
	<script src="/js/jquery.ui.js" type="text/javascript"></script>
	<script src="/js/jquery.nette.js" type="text/javascript"></script>
	<script src="/js/jquery-lightbox-05-min.js" type="text/javascript"></script>
	<script src="/js/global.js" type="text/javascript"></script>
	<script src="/js/texyla.js" type="text/javascript"></script>

	<link rel="stylesheet" type="text/css" href="/css/texyla.css">

	<link href="/favicon.ico" rel="shortcut icon" />
	<title>Aikido Hostivař</title>
	{if isset($robots)}<meta name="robots" content="{$robots}">{/if}

   <script type="text/javascript">
	    $(function () {
	    	$("textarea").texyla({
				width: 500,
				iconPath: "/image/texyla/icons/%var%.png",
				bottomLeftToolbar: []
	    	});
		});

    </script>
</head>
<body>
	<div id="layout">
		<ul id="skips">
			<li><a href="#content">Skočit na obsah</a></li>
			<li><a href="#menu">Skočit na menu</a></li>
			<li><a href="#search">Skočit na vyhledávání</a></li>
		</ul> <!-- #skips -->
		<p id="header">
			<a href="/" id="logo"><img src="/image/logo.jpg" alt="Aikido Hostivař" width="281" height="171" /><span></span></a><span></span>
		</p> <!--  #header -->
		<div id="content">
			{snippet}
			{include $content}
			{/snippet}
		</div> <!-- #content -->
		{include "@layout_menu_main.phtml"}

		<div id="footer">
			<p>Copyright &copy; 2009, Petr MAŠÁT | <a href="mailto:info@aikidohostivar.cz">info@aikidohostivar.cz</a>, <a href="{plink Admin:default}">administrace</a></p>
		</div> <!--  #footer -->
	</div> <!--  #layout -->

	{include "@layout_menu_admin.phtml"}

<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-184064-1");
pageTracker._trackPageview();
} catch(err) {}</script>

</body>
</html>

Jinak jsem celý projekt hodil na síť .

Editoval tachyon (25. 8. 2010 9:12)

Petr Mašát
Člen | 101
+
0
-

Hoj,
zkusil jsem dát do /app/templates/Page/default.phtml dát nakonec

{include '../@layout.phtml'}

poté se mi @layout.phtml již vykreslila (musel jsem v ní ještě zakomentit část s {include $content}) ale obsah se mi vykreslil na začátek stránky.
Myslel jsem že Nette defaultně to co je v šabloně /app/templates/Page/default.phtml dá do proměnné jenž pak použije v @layout.phtml, ale nyní to vypadá že mám tuto funcionalitu nějak vypnutou. Dá se prosím nějak opět zapnout a nebo budu muset ve všech šablonách uzavírat obsah do {block #content} a ten potom volat v @layout.phtml? Zkoušel jsem použít

$this->setLayout("layout");

v /app/presenters/PagePresenters leč nepomohlo : (

Díky za trpělivost.

Petr Mašát
Člen | 101
+
0
-

Hezký večer všem,

tak jsem již snad všechny problémy s přechodem dovyřešil. Aby se volala šablona @layout.phtml tak jsem musel ve všech stránkách (např. v /app/templates/Page/default.phtml) zabalit kód do

{block #content}
....
{/block}

a pak v @layout.phtml vypisovat toto ne pomocí

{include $content}

ale přepsat to na

{include #content}

Děkuji všem za ochotu, snad na další trable s přechodem nenarazím.