Problém s propojením s databází z Quick Start tutorialu

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

Ahoj,
snažím se udělat si svou první Nette aplikaci podle Quick Startu.
Zasekl jsem se zde: https://doc.nette.org/cs/quickstart
Nastavil jsem správně soubor config.ini, vytvořil i oba modely, ale jakmile přidám do bootstrapu tento řádek:
dibi::connect(Environment::getConfig(‚database‘));
vše přestane fungovat a hodí mi to Server error 500 od Nette.
Nevíte, prosím, kde je chyba?
Díky moc :)

westrem
Člen | 398
+
0
-

Pokial chces co najrychlejsiu a najkorektnejsiu odpoved, postni sem cely obsah bootstrap.php a config.ini.

Johnny
Člen | 24
+
0
-

Config.ini:

<?php

;
; SECURITY WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
;
; If you don't protect this directory from direct web access, anybody will be able to see your passwords.
; https://nette.org/en/security-warning
;
[common]
; PHP configuration
php.date.timezone = "Europe/Prague"
;php.session.save_path = "%tempDir%/sessions"
;php.zlib.output_compression = yes
;php.default_charset = "UTF-8"

; services
service.Nette-Security-IAuthenticator = UsersModel

service.Nette-Loaders-RobotLoader.option.directory[] = %appDir%
service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%
service.Nette-Loaders-RobotLoader.run = TRUE


[production < common]
; common database connection
database.driver = mysql
database.database = todolist
database.charset = utf8
database.lazy = TRUE
database.host = mujhost
database.username = mojeusername
database.password = mojepassword

[development < production]
; database options in development mode
database.profiler = TRUE
database.username = mojeusername
database.password = mojepassword


?>

bootstrap.php:

<?php


<?php

/**
 * My NApplication bootstrap file.
 *
 * @copyright  Copyright (c) 2010 John Doe
 * @package    MyApplication
 */



// REMOVE THIS LINE
if (!is_file(LIBS_DIR . '/Nette/loader.php')) die('Copy Nette Framework to /libs/ directory.');


// Step 1: Load Nette Framework
// this allows load Nette Framework classes automatically so that
// you don't have to litter your code with 'require' statements
require LIBS_DIR . '/Nette/loader.php';



// Step 2: Configure environment
// 2a) enable NDebug for better exception and error visualisation
NDebug::$strictMode = TRUE;
NDebug::enable();

// 2b) load configuration from config.ini file
NEnvironment::loadConfig();
dibi::connect(Environment::getConfig('database'));




// Step 3: Configure application
// 3a) get and setup a front controller
$application = NEnvironment::getApplication();
$application->errorPresenter = 'Error';
//$application->catchExceptions = TRUE;



// Step 4: Setup application router
$router = $application->getRouter();

$router[] = new NRoute('index.php', array(
	'presenter' => 'Homepage',
	'action' => 'default',
), NRoute::ONE_WAY);

$router[] = new NRoute('<presenter>/<action>/<id>', array(
	'presenter' => 'Homepage',
	'action' => 'default',
	'id' => NULL,
));



// Step 5: Run the application!
$application->run();

?>
Chbox
Člen | 125
+
0
-

potřebuješ ještě natahnout Dibi nějak podobně:

require_once LIBS_DIR . '/dibi/dibi.min.php';
Johnny
Člen | 24
+
0
-

Bohužel ani toto nepomohlo,
přidal jsem
<?
require_once LIBS_DIR . ‚/dibi/dibi-minified/dibi.min.php‘;
?>
(ta původní tvá adresa nebyla nalezena, tato již ano), ale hází to pořád tu samou chybu…

Johnny
Člen | 24
+
0
-

Jen pro informaci, přidal jsem to do bootstrapu pod řádek
require LIBS_DIR . ‚/Nette/loader.php‘;

Nevím, jestli je to správně, zatím jen následuji kroky v tutoriálu, tak se omlouvám, pokud občas nepochopím jasné věci :)

Chbox
Člen | 125
+
0
-

Zapni si

Debug::enable(Debug::DEVELOPMENT);
//odkomentuj a prepni na FALSE
$application->catchExceptions = FALSE;

Laděnka by ti měla vypsat, co je za problém.

Johnny
Člen | 24
+
0
-

Pro všechny začátečníky, kterým by toto časem také mohlo dělat problém:
Zjistil jsem, že chyba byla v tom, že jsem neměl zadávat:
dibi::connect(Environment::getConfig(‚database‘));
ale:
dibi::connect(NEnvironment::getConfig(‚database‘));
Teď to funguje (resp. nehází chybu) takže doufám, že to je OK.

Chbox
Člen | 125
+
0
-

Samozřejmě, pokud používáš prefixovanou verzi, musíš vždy uvést prefix N, nejen v tomoto případě :-)

Johnny
Člen | 24
+
0
-

Děkuji za rady. Ještě drobný dotaz: To zapnutí Debugu (musel jsem ale dát NDebug) a odkomentování a přepnutí $application->catchExceptions = FALSE; vlastně znamená, že jsem „zapnul laděnku“? Mám to takhle mít zapnuté asi pořád během vytváření aplikace? A poté to vypnout, ať běžní uživatelé nevidí do útrob, že?

Solution
Člen | 50
+
0
-

Pokud config.ini obsahuje:

<?php
service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%
?>

není potřeba dávat require pro dibi(když je ve složce libs), robotloader si ho natáhne sám.
Ale jde o to, že máš verzi s prefixy, tznm.:

<?php
dibi::connect(Environment::getConfig('database')); //Takhle ne, ale:
dibi::connect(NEnvironment::getConfig('database')); //Takhle by to mělo být
?>

Mělo by to být vše.

Dobré no :-D, tak jsem to měl odeslat dříve, no nic.

Editoval Padik (29. 10. 2010 23:29)

westrem
Člen | 398
+
0
-

Pridaj si do config.ini este toto:

service.Nette-Loaders-RobotLoader.factory = Nette\NConfigurator::createRobotLoader

Najlepsie pred tento riadok:

service.Nette-Loaders-RobotLoader.option.directory[] = %appDir%

A som rad, ze sa problem vyriesil ;)

jansfabik
Člen | 193
+
0
-

Johnny napsal(a):
Děkuji za rady. Ještě drobný dotaz: To zapnutí Debugu (musel jsem ale dát NDebug) a odkomentování a přepnutí $application->catchExceptions = FALSE; vlastně znamená, že jsem „zapnul laděnku“? Mám to takhle mít zapnuté asi pořád během vytváření aplikace? A poté to vypnout, ať běžní uživatelé nevidí do útrob, že?

Debug si umí sám detekovat, jestli je na produkčním nebo vývojovém serveru (podle IP adresy). Na vývojovém ti při výjimce vykreslí tu červenou stránku, na produkčním se ti uloží všechny chyby do složky log. Ten odkomentovávat nemusíš.

$application->catchExceptions = TRUE; předává odchycené výjimky ErrorPresenteru. Ten je lepší při vývoji zakomentovat.