Nedaří se připojit k databázi

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

Ahoj,

nedaří se mi připojit k databázi, stránka píše chybu:

Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Configuration must be array, string or ArrayObject.' in /home/weckho/Weby/test/libs/dibi/libs/DibiConnection.php:69 Stack trace: #0 /home/weckho/Weby/test/app/models/BaseModel.php(9): DibiConnection->__construct(NULL) #1 /home/weckho/Weby/test/app/bootstrap.php(16): BaseModel->__construct() #2 /home/weckho/Weby/test/document_root/index.php(6): require('/home/weckho/We...') #3 {main} thrown in /home/weckho/Weby/test/libs/dibi/libs/DibiConnection.php on line 69

V config.ini mám:

[production]
database.driver = mysql
database.host = "localhost"
database.username = "xxx"
database.password = "xxx"
database.database = "xxx"
database.lazy = TRUE
database.charset = utf8
database.result:objects = TRUE
service.Nette-Security-IAuthenticator = Users

[common.set!]
date.timezone = "Europe/Prague"
iconv.internal_encoding = "%encoding%"
mbstring.internal_encoding = "%encoding%"
include_path = "%appDir%;%libsDir%"

V BaseModel.php potom:

class BaseModel extends Object
{
	protected static $db = null;

	public function __construct()
	{
		if (self::$db === NULL)
		self::$db = new DibiConnection(Environment::getConfig('database'));
	}

	function getDb()
	{
		return self::$db;
	}
}

Díky moc.

kravčo
Člen | 721
+
0
-

Najskôr si na vývojovom serveri a nemáš nastavené pripojenie na databázu:

#0 …/app/models/BaseModel.php(9): DibiConnection->__construct(NULL)

Volanie Environment::getConfig('database') ti vráti NULL

Musíš nakonfigurovať pre produkciu i vývoj (kľudne i rovnako):

[common.set!]
date.timezone = "Europe/Prague"
iconv.internal_encoding = "%encoding%"
mbstring.internal_encoding = "%encoding%"
include_path = "%appDir%;%libsDir%"

[production < common]
database.driver = mysql
database.host = "localhost"
database.username = "xxx"
database.password = "xxx"
database.database = "xxx"
database.lazy = TRUE
database.charset = utf8
; database.result:objects = TRUE ;; toto je už zbytočné

service.Nette-Security-IAuthenticator = Users

[development < production]
database.database = "xxx_develop"

V príklade vyššie sa na vývojovom servri použijú rovnaké nastavenia ako na produkčnom, akurát sa vyberie iná databáza („xxx“ vs. „xxx_develop“).

Trochu kratšia ukážka je i v príklade CD-Collection.

A ešte by ti možno pomohla ladenka – Debug::enable() niekde na začiatku bootstrap.php.

weckho
Člen | 94
+
0
-

Díky za radu, zkusil jsem nahradit svůj config.ini podle tvého návrhu, bohužel stále nefunguje :( Chyba se nezměnila. Co je ještě divný, laděnku mám zaplou. U chyby, kterou jsem řešil před touto, laděnka fungovala normálně… Můžu postnout jakýkoliv jiný kousek aplikace, jestli to pomůže..

Jinak ano, jsem na vývojovém serveru, u sebe na localhostu.

Děkuji moc.

marek.dusek
Člen | 99
+
0
-

A mas v bootstrapu nacteni toho configu? :-)

weckho
Člen | 94
+
0
-

marek.dusek napsal(a):

A mas v bootstrapu nacteni toho configu? :-)

Načítám ho v BaseModelu.. Teda nevím, jestli to stačí, mělo by:

Environment::getConfig('database'); //výňatek, více viz. můj příspěvek nahoře
marek.dusek
Člen | 99
+
0
-

To je jenom getter, musis volat „loadConfig“, tj. neco jako

Environment::loadConfig(APP_DIR.'/config.ini');
Milhauz
Člen | 26
+
0
-

Do bootstrapu zkus přidat

<?php
 Environment::loadConfig();
?>
weckho
Člen | 94
+
0
-

Přidáno do bootstrapu, bohužel stále stejná chyba:( Žádná změna..

Milhauz
Člen | 26
+
0
-

To je zvláštní, teď už by to běžet mělo. Vyhazuje to stále stejnou chybu InvalidArgumentException nebo to přešlo na jinou?

Jestli můžeš, vlož sem současnou podobu config.ini. Chyba musí být tam.

Honza Kuchař
Člen | 1662
+
0
-

A kde je ten config.ini?

Milhauz
Člen | 26
+
0
-

honzakuchar: Teď nevim, jestli to je bráno vážně nebo ne :-) Pochybuju, že by jsi nevěděl… weckho to určitě ví taky, když ho v prvním příspěvku vypisoval. Jinak běžně je v adresáři app/. Být může ale samozřejmě kdekoli.

weckho
Člen | 94
+
0
-

Config je ve složce app :) Jeho obsah je nyní následující:

[common.set!]
date.timezone = "Europe/Prague"
iconv.internal_encoding = "%encoding%"
mbstring.internal_encoding = "%encoding%"
include_path = "%appDir%;%libsDir%"

[production < common]
database.driver = mysql
database.host = "localhost"
database.username = "weckho"
database.password = "123456"
database.database = "mojedb"
database.lazy = TRUE
database.charset = utf8

service.Nette-Security-IAuthenticator = Users

[development < production]
database.database = "mojedb"

Nemám DB rozdělenou na vývojovou a ostrou, tak se její název shoduje.. V tom snad ale chyba být nemůže. Ještě bych doplnil, že jedu na Ubuntu. Nepředpokládám ale, že to má s chybou cokoliv společného (jenom už zoufale hledám jakýkoliv rozdíl mezi mojim nefunkčním a vaším funkčním řešením :).

Jo jinak, chyba úplně stejná:

Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Configuration must be array, string or ArrayObject.' in /home/weckho/Weby/Realitik.cz/libs/dibi/libs/DibiConnection.php:69 Stack trace: #0 /home/weckho/Weby/Realitik.cz/app/models/BaseModel.php(9): DibiConnection->__construct(NULL) #1 /home/weckho/Weby/Realitik.cz/app/bootstrap.php(16): BaseModel->__construct() #2 /home/weckho/Weby/Realitik.cz/document_root/index.php(6): require('/home/weckho/We...') #3 {main} thrown in /home/weckho/Weby/Realitik.cz/libs/dibi/libs/DibiConnection.php on line 69

Díky moc.

Ondřej Brejla
Člen | 746
+
0
-

Co ti vrací toto v BaseModelu…

$config = Environment::getConfig('database');
Debug::consoleDump($config);
Milhauz
Člen | 26
+
0
-

Chybu nevidim. Beru zpět své tvrzení, že chyba musí být tady. Bude zřejmě jinde :-(

Zkus si v bootstrapu vypsat config:

<?php
$config = Environment::loadConfig();
Debug::dump($config);
?>

Měl by tam být kromě jiného i výpis parametrů pro připojení k db.

weckho
Člen | 94
+
0
-

Jsem už prostě v koncích :( Když zkouším podle vašich rad dumpnout chyby, žádná změna. Chyba pořád stejná.. nic víc, nic míň.

EDIT: Ještě sem hodím obsah bootstrapu, třeba někdo najde nějakou chybu tam:

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

//Autoload
$loader = new RobotLoader();
$loader->addDirectory(APP_DIR);
$loader->addDirectory(LIBS_DIR);
$loader->register();

//Autentizace
require_once APP_DIR . '/models/Users.php';
$user = Environment::getUser();
$user->setAuthenticationHandler(new Users());

//Config load
Environment::loadConfig();

// Step 2: Enable Nette\Debug
// for better exception and error visualisation
Debug::enable();

// Step 3: Get the front controller
$application = Environment::getApplication();

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

Díky!

Editoval weckho (20. 7. 2009 23:11)

Ondřej Mirtes
Člen | 1536
+
0
-

Nemáš první připojení k databázi v konstruktoru Users? Prohoď Autentizaci a Config load.

weckho
Člen | 94
+
0
-

LastHunter napsal(a):

Nemáš první připojení k databázi v konstruktoru Users? Prohoď Autentizaci a Config load.

Já jsem debil, to je ta chyba.. :) Díky moc!