Jako kdybych nic nepsal – Dibi připojení

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

Zdravím páni programátoři,
jsem teprve začátečník, ale za tohle se opravdu stydím – nechápu proč se nedokážu připojit k databázi pomocí dibi. Laděnka píše: „Access denied for user ''@'localhost' (using password: NO)“.
Přitom v config.neon mám

common:
	php: # PHP configuration
		date.timezone: Europe/Prague
		# session.save_path: "%tempDir%/sessions"
		# zlib.output_compression: yes
		# default_charset: "UTF-8"

	service:
		Nette\Security\IAuthenticator: UsersModel
		Nette\Loaders\RobotLoader:
			option:
				directory: [%appDir%, %libsDir%]
			run: true
production < common:
database:
driver: mysqli
host: localhost //zkoušel jsem i server:
database: test
username: root
password: heslo
development < common:

console < common:

No a v bootstrap.php mám

// Load configuration from config.neon file
Environment::loadConfig();
// Připojíme se k databázi
dibi::connect(array(Environment::getConfig('database')));

Zkoušel jsem už strašně moc věcí a jednou jsem se i připojil, ale né přes neon ale ručně v bootstrapu.php jsem si udělal proměnou s polem, ale teď to taky nejde. Prý to musí být Integer bo String :)) Co dělám špatně, že mi píše laděnka totok i když to mám v neonu určený :(

drakul
Člen | 37
+
0
-

Mám jen pár poznatků a nevím jestli to pomůže:

  1. v tom configu nemáš tabelátorama vytvořenou hierarchii těch položek (jako to máš v tom configu v horní části). Takže zkus tu „database:“ odstrčit jedním tabelátorem, to pod ním (driver, host, …) dvěma.
  2. zkus dibi::connect(array()Environment::getConfig(‚database‘));
VaKvas
Začátečník | 111
+
0
-

Zkus to hodit do sekce common:
Mas tam host „localhost“ a pritom konfiguraci mas v production…

Legáček
Člen | 16
+
0
-

To drakul: Zkoušel jsem jak první tak druhou možnost. 1.Možnost laděnka vypsala, že špatný znaky nebo něco navíc 2. Možnost mi to vypsalo chybu, že to musí být string bo integer.
To VakVas: Asi takhle to vypadalo, když jsem to zkoušel.

common:
	php: # PHP configuration
		date.timezone: Europe/Prague
		# session.save_path: "%tempDir%/sessions"
		# zlib.output_compression: yes
		# default_charset: "UTF-8"

	service:
		Nette\Security\IAuthenticator: UsersModel
		Nette\Loaders\RobotLoader:
			option:
				directory: [%appDir%, %libsDir%]
			run: true
        database: // Jeden tab a pro driver,host.. 2x tab taky nešlo...
                driver = "mysqli"
                host = "localhost"
                database = "test"
                username = "root"
                password = "heslo"
production < common:

development < common:

console < common:
22
Člen | 1478
+
0
-
  • kde jsi přišel na tohle?
dibi::connect(array(Environment::getConfig('database')));

//správně
dibi::connect(Environment::getConfig('database'));
  • ukaž dump
Debugger::dump(Environment::getConfig('database'));
exit;

používáš správnou verzi Dibi knihovny? Dibi 1.5rc?

Editoval 22 (5. 5. 2011 10:44)

22
Člen | 1478
+
0
-

tady máš fungující vzor:
https://forum.nette.org/…sql-databazi#…

Legáček
Člen | 16
+
0
-

To 22: Když to nedělám přes array(), tak laděnka vypíše „Configuration must be array, string or object.“ (při ->ToArray() mi to hází že chybí class). Dump hází Null. A tvůj vzor už jsem zkoušel a pořád mi nejde připojit :-x A ano mám tu nejnovější verzi dibi 1.5rc .

22
Člen | 1478
+
0
-

máš něco špatně v configu, nevidím důvod, proč by to nemělo fungovat. Takže vydumpuj ještě Environment::loadConfig()
Jaká je to verze Nette? Předpokládám, že taky nějaký release z tohoto týdne aspoň…

Edit: doufám, že ty rovnítka jsi odstranil v configu databáze.. a nahradil dvojtečkou + uvozovky pryč

Editoval 22 (5. 5. 2011 12:20)

Legáček
Člen | 16
+
0
-

To 22: Stáhl jsem verzi „Nette Framework 2.0-alpha2 pro PHP 5.3 se jmennými prostory“ a k tomu ten nejnovější Dibi 1.5Rc. Takhle vypadá dump Environment::loadConfig().

Nette\Config\Config(3) {
   "php" => Nette\Config\Config(1) {
      "date.timezone" => "Europe/Prague" (13)
   }
   "service" => Nette\Config\Config(2) {
      "Nette\Security\IAuthenticator" => "UsersModel" (10)
      "Nette\Loaders\RobotLoader" => Nette\Config\Config(3) {
         "option" => Nette\Config\Config(1) { ... }
         "run" => TRUE
         "factory" => NULL
      }
   }
   "const" => NULL
}

Říkám jak kdybych do toho configu nic nenapsal. A config vypadá takhle.

common:
	php: # PHP configuration
		date.timezone: Europe/Prague
		# session.save_path: "%tempDir%/sessions"
		# zlib.output_compression: yes
		# default_charset: "UTF-8"

	service:
		Nette\Security\IAuthenticator: UsersModel
		Nette\Loaders\RobotLoader:
			option:
				directory: [%appDir%, %libsDir%]
			run: true
database: # Když to zarovnám jako service nebo php, tak to vyhodí chybu že tam mám tab a nějaký špatný písmenka nebo co...
host: localhost
username: root
password: heslo
database: test
profiler: true
lazy: true
run: true
result:
detectTypes: true
production < common:

development < common:

console < common:

Já to taky nechápu proč mám pořád nějaký problémy s Nette – Minulý týden jsem se pral vůbec abych zapnul Cool Url v Nette :(( Nechápu proč by to taky nemělo jít :-x

22
Člen | 1478
+
0
-
common:
	php: # PHP configuration
		date.timezone: Europe/Prague
		# session.save_path: "%tempDir%/sessions"
		zlib.output_compression: yes
		default_charset: "UTF-8"

	service:
		Nette\Security\IAuthenticator: UsersModel
		Nette\Loaders\RobotLoader:
			option:
				directory: [%appDir%, %libsDir%]
			run: true
	database:
		host: localhost
		username: root
		password: heslo
		database: test
		profiler: true
		lazy: true
		run: true
		result:
			detectTypes: true

musí to být takto, odsazeno stejnými tabulátory, jako předchozí sekce, které jak vidíš, se v pohodě do pole naparsují, už nevím, jak to vysvětlit asi.

Editoval 22 (5. 5. 2011 16:17)

Legáček
Člen | 16
+
0
-

To 22: Přesně tohle navrhoval drakul, abych to srovnal, ale nefungovalo mi to psalo to něco s těma řádkami. A prostě nechápu jak, ale přísahám bohu, že jsem to měl naprosto stejné jak si vložil teď ty. ALE ÚPLNĚ. A nešlo mi to. Tak jsem to zkusil ctr+c a ctr+v a nic se nezměnilo jen se odkomentovali zlib.output a default_charset a funguje to. Věc je vyřešena, ale fakt netuším co jsem tam měl za chybu – nějakou neviditelnou :-// Děkuji moc …

22
Člen | 1478
+
0
-

nějaká zapomenutá mezera, to byl na 99% ten problém.. :-)

drakul
Člen | 37
+
0
-

taky jsem hledal zapomenuté mezery a problém byl v nich. Doporučuju Ti označit si to „prázdné místo před "date.timezone: Europe/Prague“ (tzn. ty mezery / tabulátory) a pak jimi pomocí CTRL+C → CTRL+V nahradit „volné místo“ před konfigurací položek do [database]. Snad jsem to napsal pochopitelně :)

bubuss
Člen | 5
+
0
-

Je to skoro mesic co jsem tu zadal o prava na upravu dokumentace a porad se nic nedeje :( Zacinam mit pocit, ze nette na to jak se chlubi vykonem a rychlosti, tak v komunikaci tezce pokulhava a pro ty, kdoz s tim chteji zacit je to dost slozite. Myslim, ze spousta potencialnich zajemcu to vzda a radsi se poohlidne po jinem frameworku. Je to skoda, protoze jsem Nette docela fandil:(

Martin
Člen | 171
+
0
-

bubuss: nespletl sis vlákno? Malinko OT. Ale jen na okraj – jsem tu 3× déle než Ty, leccos bych taky v dokumentaci měnil a třeba i už věděl, jak. Přesto by mě ani nenapadlo žádat o práva na úpravu. Proč? Protože plno věcí se ještě mění pod rukama, horko těžko zprovozním něco s novou verzí podle starého tutoriálu, ale za týden už nějaká drobnost funguje jinak. Když proberu své posty za ty 3 měsíce, tak ve třetině z nich jsem byl úplně mimo, přitom šlo třeba jen o to, že jsem přehlédl nějakou drobnost v aktuálně nejnovějších examples, neměl jsem včerejší commit či prostě jen něco v Nette málo dlouho dělal a neznal „best practices“. Tím nepíšu, že je dobře, že David do vlákna o dokumentaci už dlouho nepsal. Ale být jím, u každého žadatele stejně nejprve projdu zpětně pár jeho postů kvůli zjištění jeho schopnosti se věcně, správně vyjádřit, než bych práva přidělil. Ty tu nemáš nic :-)

Patrik Votoček
Člen | 2221
+
0
-

<OT>

Martin napsal(a):

Tím nepíšu, že je dobře, že David do vlákna o dokumentaci už dlouho nepsal. Ale být jím, u každého žadatele stejně nejprve projdu zpětně pár jeho postů kvůli zjištění jeho schopnosti se věcně, správně vyjádřit, než bych práva přidělil.

Ono to je buřt. Stejně skoro nikdo z těch kdo si o to právo zažádali a dostali ho nic nikde nezměnil.
</OT>

jazby
Člen | 44
+
0
-

Zdravím, snažím se spojit s databází v nové verzi nette: Nette Framework 2.0-dev (revision 11c9568 released on 2011–05–18) a končím chybou InvalidArgumentException – Configuration must be array, string or object.

Nevím už co dělám špatně:
config.neon

common:
	php: # PHP configuration
		date.timezone: Europe/Prague
		# session.save_path: "%tempDir%/sessions"
		# zlib.output_compression: yes
		# default_charset: "UTF-8"

	services:
		authenticator: AuthModel
		robotLoader:
			option:
				directory: [%appDir%, %libsDir%]
			run: true

	database:
		driver: mysql
		database: file_server
		charset: utf8
		lazy: TRUE
		host: 127.0.0.1
		username: root
		password:

production < common:

development < common:

console < common:

Bootstrap.php

Debugger::$strictMode = TRUE;
Debugger::enable();


// Load configuration from config.neon file
$configurator = new Nette\Configurator;
$configurator->loadConfig(__DIR__ . '/config.neon');


// Configure application
$application = $configurator->container->application;
$application->onStartup[] = 'BaseModel::initialize';
$application->errorPresenter = 'Error';

BaseModel.php

public static function initialize()
{
	\Nette\Diagnostics\Debugger::dump(Environment::getConfig( 'database' ));
	self::$connection = new DibiConnection( Environment::getConfig( 'database' ) );
}

Debbugger vypíše NULL a laděnka poté samozřejmě informuje. že NULL není pole…
V předchozí verzi (Nette-2.0 alpha) mi to fungovalo korektně. Díky za pomoc

studna
Člen | 181
+
0
-

V bootstrapu config nahráváš do $configurator. V modelu ho pak chceš po Environmentu. Takže do bootstrapu přidej

Environment::loadConfig( __DIR__ . '/config.neon' )

a nebo třeba nějak takto

$cont = Environment::getContext();
$cont->addService('database', function() use ($container){
	return new NejakePripojeni( $container->params );
});
jazby
Člen | 44
+
0
-

moc díky za rychlou odpověď. Stačil Environment::loadconfig.
Já si říkal že to bude úplná blbost. Jen by mě možná teda potom zajímalo, jak to „nečíst“ z Environmentu a zároveň se připojovat až v basemodelu. Nechci to připojení mít v bootstrapu a také se mi teď nelíbí ten dvojitý loadconfig hned pod sebou. Tj, jak to udělat správně a dle filozofie Nette? Nějak se v té nové verzi Nette zatím neorientuji.

Editoval jazby (23. 5. 2011 17:01)

bojovyletoun
Člen | 667
+
0
-

S touto chybou se setkávám podruhé (zde) – ve zkratce to znamená toto:

$configurator=Nette\Environment::getConfigurator(); // použij tento postup
$configurator = new Nette\Configurator; // ! vytvoříš nový kontext, který je izolovaný

David říkal, že Configurator by se mělo chovat jednoinstančně, pokud se omylem použije new Configurator, ale očividně to nefunguje, takže správné je zůstat u toho, že na začátku bootstrapu použiji první řádek. (Nic mi nebrání použít druhý postup, ale pak nelze používat Environment, kbůli tomu, že má svůj context.))

Přečti si toto: https://forum.nette.org/…cy-injection
Pokud je DI složité, tak místo něj používej Environment, to není „extra prohřešek“ – věci budou fungovat jako dřív, funkcionality se s tím dá dosáhnout stejná, ale DI je „správnější návrh“

Editoval bojovyletoun (23. 5. 2011 17:25)

studna
Člen | 181
+
0
-

DI přece neznamená nepoužívat Environment. :-)

Ten hezčí způsob:

bootstrap.php

$conf = new Nette\Configurator();
$conf->loadConfig();

$cont = $conf->getContainer(); // = $conf->container
$cont->addService('database', function() use($cont)
	{
		return new DibiConnection( $cont->params['database'] );
	});

$cont->addService('logger', function() use($cont)
	{
		return new TvujLogger( $cont->database );
	});

$application = $cont->application;
// ...

TvujLogger.php

function __construct( DibiConnection $database )
{
	$this->database = $database;
}

Presenter.php

function ...(){
	$logger = $this->container->logger; // trida TvujLogger se instancuje pouze jednou
	$logger = new TvujLogger( $this->container->database );
}

Dvojímu načítání configu se můžeš vyhnout i tak jak psal bojovyletoun, zaměnit řádek

$configurator = new Nette\Configurator;

za

$configurator = Nette\Environment::getConfigurator();

Snad jsem tam nenasekal nějaké chyby. :)

Editoval studna (23. 5. 2011 20:27)

jazby
Člen | 44
+
0
-

Tak tohle je mi už jasnější. O zmiňovaném vláknu https://forum.nette.org/…cy-injection vím a čtu jej, ale říkal jsem si že si ještě počkám, jelikož mám pocit že tam ještě proběhne bouřlivý vývoj :-)) Díky

Filip Procházka
Moderator | 4668
+
0
-

Bouřlivý vývoj už snad nebude, jenom kosmetika.