Zprovoznění MySQL databáze

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

Ahoj
nikde jsem nenašel návod jak propojit nette s MySQL databázi.
Našel jsem pouze jak jej propojit s DIBI.

Prosím poraďte. Díky.

o5
Člen | 416
+
0
-

config.ini

database.driver = mysql
database.host = localhost
database.username = user
database.password = pass
database.database = db
database.charset  = utf8
wqer
Člen | 4
+
0
-

o5 napsal(a):

config.ini

database.driver = mysql
database.host = localhost
database.username = user
database.password = pass
database.database = db
database.charset  = utf8

Díky

sairon
Člen | 32
+
0
-

To nastavení ale musíš ještě někde načíst, třeba v bootstrapu: dibi::connect(Environment::getConfig('database'));

o5
Člen | 416
+
0
-

Já myslím, že to mu bylo jasné…V examples jsou příklady s sqlite, takže bude měnit jen config.ini

A když už tak..

Environment::loadConfig();
dibi::connect(Environment::getConfig('database'));
giro
Člen | 10
+
0
-

zdravim, mam mozno pre vas trivialnu otazku ale kam mam vlozit ten subor config.ini potreboval by som totis sa konektnut na svoj mysql server a nie aby mi to ako je uvedene v priklade nacitalo tabulky z /models/sample.sdb
dakujem za pochopenie prave zacinam z nette

Editoval giro (21. 3. 2009 14:41)

syky01
Člen | 25
+
0
-

giro: Stačí se podívat třeba na Akrabat a tam je umístění všech souborů. A sice tam načítá z SQLite, ale stačí údaje změnit tak jak jsou uvedeny tady a bude se připojovat k MySQL nebo k jiné databázi

Tomik
Nette Evangelist | 485
+
0
-

Soubor je třeba vložit do složky app, resp. tam, kde máš vlastní aplikaci.

Edit: Ha, syky01 byl rychlejší.

Editoval Tomik (21. 3. 2009 14:43)

giro
Člen | 10
+
0
-

syky01 napsal(a):

giro: Stačí se podívat třeba na Akrabat a tam je umístění všech souborů. A sice tam načítá z SQLite, ale stačí údaje změnit tak jak jsou uvedeny tady a bude se připojovat k MySQL nebo k jiné databázi

no ja som si to nastavil v /libs/dibi/drivers mysql a v subore /app/models/Model.php som nastavl driver na mysql a db som tam vlozil DibiConnection::alias($config, ‚database‘,‚cvo‘); asi to je zle co

giro
Člen | 10
+
0
-

no idem to tak vyskusat

giro
Člen | 10
+
0
-

no vyskusal som to a nejak mi to nefunguje do bootstrap.php som vlozil
Environment::loadConfig();
dibi::connect(Environment::getConfig(‚database‘));

a nic

giro
Člen | 10
+
0
-

vypisalo mi to tuto chybu

InvalidStateException

There is not section [development] in ‚/Applications/xampp/xamppfiles/htdocs/framework/DataGrid.part5/document_root/../app/config.ini‘.

syky01
Člen | 25
+
0
-

Config.ini:

database.driver = mysqli
database.host = localhost
database.username = user
database.password = secretPassword
database.database = database
database.lazy = TRUE
database.charset = utf8
database.result:objects = TRUE

Bootstrap.php:

Environment::loadConfig();
dibi::connect(Environment::getConfig('database'));

případně ještě do configu nakonec přidat:

[development < production]

Editoval syky01 (21. 3. 2009 15:39)

Ola
Člen | 385
+
0
-

Tak to ti v config.ini chybí vytvořená sekce development poděďující původní nastavení ..

EDIT: syky byl rychlejší :)

Editoval Ola (21. 3. 2009 15:40)

giro
Člen | 10
+
0
-

mam teda v config.ini

database.driver = mysql
database.host = localhost
database.username = admin
database.password = pokus
database.database = cvo
database.lazy = TRUE
database.charset = utf8
database.result:objects = TRUE
[development < production]

a v bootstrap.php:

<?php



// 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_once LIBS_DIR . '/Nette/loader.php';



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

// 2b) enable RobotLoader - this allows load all classes automatically
$loader = new /*Nette\Loaders\*/RobotLoader();
$loader->addDirectory(APP_DIR);
$loader->addDirectory(LIBS_DIR);
$loader->register();





// Step 3: Configure application
$application = Environment::getApplication();
$application = Environment::loadConfig();
$application = dibi::connect(Environment::getConfig('database'));
// Step 4: Run the application!
$application->run();

a nefunguje mi to

_Martin_
Generous Backer | 679
+
0
-

Dej to na začátek, [ ... ] značí sekci

[development < production]
database.driver = mysql
database.host = localhost
database.username = admin
database.password = pokus
database.database = cvo
database.lazy = TRUE
database.charset = utf8
database.result:objects = TRUE
giro
Člen | 10
+
0
-

no vyskusal som to a nefunguje to. len na ujasnenie ci tomu dobre chapem mam stiahnutu DataGrid.part5 postupoval som presne podla tutorialu no chcel by som aby mi to nacitalo db nie z sample.sdb ale z mojej mysql db vyskusal som vsetko ako ste vraveli a stale mi to vypisuje chybu dakujem

syky01
Člen | 25
+
0
-

giro: on je problém, že ten DataGrid tohle má definované v BasePresentru. Zkus se radši podívat na Akrabat.Form (.old) a tam zkusit změnu na mysql ;) Pak to možná pochopíš trochu líp

kravčo
Člen | 721
+
0
-

Na to, aby ti ktokoľvek z nás vedel pomôcť, treba okrem „nefunguje mi to“, resp. „vypisuje mi to chybu“ napísať čo najviac informácií – minimálne akú chybu to vypíše…

Toto je joke? :D

// Step 3: Configure application
$application = Environment::getApplication();
$application = Environment::loadConfig();
$application = dibi::connect(Environment::getConfig('database'));
// Step 4: Run the application!
$application->run();

Skôr by si asi mal písať niečo v zmysle

Environment::loadConfig();

dibi::connect(Environment::getConfig('database'));

$application = Environment::getApplication();

$application->run();

Prečítaj si informácie o základných súboroch a skús sa spýtať znovu.

giro
Člen | 10
+
0
-

vypisuje mi chybu
DibiDriverException #1102
Incorrect database name ‚/applications/xampp/xamppfiles/htdocs/framework/datagrid.part5/document_root/../app/config.ini‘

pritom v subore config.ini:

[production]
database.driver = mysql
database.host = localhost
database.username = admin
database.password = pokus
database.database = cvo
database.lazy = TRUE
database.charset = utf8
database.result:objects = TRUE
[development < production]

a v mysql.php

*/
	public function connect(array &$config)
	{
		DibiConnection::alias($config, 'username', 'admin');
		DibiConnection::alias($config, 'password', 'pokus');
		DibiConnection::alias($config, 'host', 'localhost');
		DibiConnection::alias($config, 'database', 'cvo');
		DibiConnection::alias($config, 'options');

hlaska je na Line: 134 File: /Applications/xampp/xamppfiles/htdocs/framework/DataGrid.part5/libs/dibi/drivers/mysql.php

Line 127:                        throw new DibiDriverException(mysql_error($this->connection), mysql_errno($this->connection));
Line 128:                    }
Line 129:                }
Line 130:            }
Line 131:
Line 132:            if (isset($config['database'])) {
Line 133:                if (!@mysql_select_db($config['database'], $this->connection)) { // intentionally @
Line 134:                    throw new DibiDriverException(mysql_error($this->connection), mysql_errno($this->connection));
Line 135:                }
Line 136:            }
Line 137:
Line 138:            if (isset($config['sqlmode'])) {
Line 139:                if (!@mysql_query("SET sql_mode='$config[sqlmode]'", $this->connection)) { // intentionally @
Line 140:                    throw new DibiDriverException(mysql_error($this->connection), mysql_errno($this->connection));
Line 141:                }

Editoval giro (21. 3. 2009 19:17)

Jod
Člen | 701
+
0
-

Píše to, že máš zlý názov databázy, nie?

giro
Člen | 10
+
0
-

prepac ale nerozumiem tomu celkom, myslel som si ze nazov db moze byt hocijaký.

kravčo
Člen | 721
+
0
-

giro napsal(a):

prepac ale nerozumiem tomu celkom, myslel som si ze nazov db moze byt hocijaký.

Nie, nemôže…

giro
Člen | 10
+
0
-

kravco napsal(a):

giro napsal(a):

prepac ale nerozumiem tomu celkom, myslel som si ze nazov db moze byt hocijaký.

Nie, nemôže…

no nikde som sa nedociral ze to neni mozne mozno som to prehladol

Jod
Člen | 701
+
0
-

No môže byť len taký ako sa volá tvoja databáza na mysql servri :D . Si si istý, že máš takú databázu, že je na tom servri a že ten užívateľ má k nej prístup?

Editoval Jod (21. 3. 2009 21:58)

syky01
Člen | 25
+
0
-

giro: Trošku mimo, ale jaké máš obecné zkušenosti s PHP?

Panda
Člen | 569
+
0
-

Navíc přístupové údaje se zadávají čistě jen do config.ini, hrabat se v dibi/drivers/mysql.php je špatné. Navíc když se v tom hrabeš špatně:

<?php
	DibiConnection::alias($config, 'username', 'user');
	DibiConnection::alias($config, 'password', 'pass');
	DibiConnection::alias($config, 'host', 'hostname');
?>

slouží k nastavení aliasů, tedy aby šlo nastavovat database.user místo database.username, database.pass místo database.password atd., ne k nastavení vlastních hodnot.

A.
Člen | 87
+
0
-

Zkusil bych prvne zacit s php a mysql a az pak nasledne zacit s nette ;-).

dotTwelve
Člen | 167
+
0
-

Ahoj, jsem nový jak v používání frameworku, tak zde v komunitě ;)
Mám problém s připojením k mysql databázi. Tady na fóru jsem našel návod, ale nevím co dělám špatně.
Používám příklad skeleton ale řekl bych že problém bude asi v načtení dibi do nette.

config.ini

[development < production]
database.driver = mysql
database.host = localhost
database.username = uzivatel
database.password = heslo
database.database = databaze
database.charset = utf8

bootstrap.php

<?php
Environment::loadConfig();
...
$application = Environment::getApplication();
$application->onStartup[] = 'BaseModel::initialize';
?>

a v /models/BaseModel.php

<?php
class BaseModel extends Object {
        public static function initialize() {
		self::$db = new DibiConnection(Environment::getConfig('database'));
	}
}
?>
romansklenar
Člen | 655
+
0
-

Nenapsal jsi ale co ti to háže za chybu :)

dotTwelve
Člen | 167
+
0
-

Chyba je 500. To nacte automaticky Error page 500 z templaty.
Jinak kdyz nedam do bootstrapu

<?php
$application->onStartup[] = 'BaseModel::initialize';
?>

Tak to bezi…

romansklenar
Člen | 655
+
0
-

Příčin může být hodně, je třeba nastartovat laděnku, adekvátně ji nastavit aby zobrazovala chyby a pak už se dá z toho vyčíst více. Bude tam nespíše část Caused-By, ve které bude přímo výjimka, která spustila ErrorPresenter.

dotTwelve
Člen | 167
+
0
-

Potrebuju teda zachytit chybu v tomto miste, jakym zapisem?

<?php
else {
	Environment::getHttpResponse()->setCode(500);
	$this->template->title = '500 Interní chyba serveru';
	$this->setView('500');

	Debug::processException($exception);
?>
romansklenar
Člen | 655
+
0
-

Nene, potřebuješ zjistit co tu chybu způsobilo. To je přávě v tom výpisu té laděnky v části Caused-By.

Tomik
Nette Evangelist | 485
+
0
-

Do bootstrap.php si přidej Debug::enable();, pak ti to místo Error presenteru zavolá při vývoji Laděnku, a u výpisu Laděnky zjistíš, co způsobuje problém.

dotTwelve
Člen | 167
+
0
-

Nejdrive mi to vyhodi hlasku, ze config musi byt pole, retezec, nebo objekt. Tak jsem prehodil pripojeni do databaze v configu do [production < common]. To pomohlo. Ale je na svete dalsi chybka:

Access to undeclared static property: BaseModel::$db
self::$db = new DibiConnection(Environment::getConfig('database'));

Editoval dotTwelve (19. 6. 2009 17:26)

o5
Člen | 416
+
0
-

a to uz je snad jasne ne? :-)

dotTwelve
Člen | 167
+
0
-

o5 napsal(a):

a to uz je snad jasne ne? :-)

není ;)

Tomik
Nette Evangelist | 485
+
0
-

dotTwelve napsal(a):

není ;)

Opravdu máš tu proměnnou $db deklarovanou? :)

dotTwelve
Člen | 167
+
0
-

Tomik napsal(a):

Opravdu máš tu proměnnou $db deklarovanou? :)

Jeste ne ;) Ale uz vim, ze to tak byt nema, nechal jsem pouze:

new DibiConnection(Environment::getConfig('database'));

a ono to slape…jdu studovat modely!

muflon
Člen | 14
+
0
-

Táto téma (Zprovoznění MySQL databáze) by mala byt spracovaná v dokumentácií. Napojenie na klasisicke mysql aj spojenie s dibi uplne to tam chýba

Tomik
Nette Evangelist | 485
+
0
-

dotTwelve napsal(a):

Jeste ne ;) Ale uz vim, ze to tak byt nema, nechal jsem pouze:

new DibiConnection(Environment::getConfig('database'));

a ono to slape…jdu studovat modely!

Ideální je zhruba toto:

<?php
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;
	}
}
?>

A od BaseModelu pak dědit všechny ostatní modely. Samozřejmě do BaseModelu by měly patřit i další společné metody – např. pro práci s oprávněními (ACL atd.) pro konkrétní model a podobně.

Tomik
Nette Evangelist | 485
+
0
-

muflon napsal(a):

Táto téma (Zprovoznění MySQL databáze) by mala byt spracovaná v dokumentácií. Napojenie na klasisicke mysql aj spojenie s dibi uplne to tam chýba

Pravda!

kuty
Člen | 7
+
0
-

Zdravim, doposud jsem programoval ve strukt. PHP. Zacal jsem pouzivat nette a jsem z nej nadsenej :-) Doufam, ze se i preucim na OOP. Mam ale problem s pripojenim k databazi. Stacil by mi nejaky jednoduchy priklad s formularem a s napojenim na databazi. Viz. napr. serial na rootu. Nemate nekdo neco tak simple a strucne?

Ondřej Mirtes
Člen | 1536
+
0
-

kuty napsal(a):

Zdravim, doposud jsem programoval ve strukt. PHP. Zacal jsem pouzivat nette a jsem z nej nadsenej :-) Doufam, ze se i preucim na OOP. Mam ale problem s pripojenim k databazi. Stacil by mi nejaky jednoduchy priklad s formularem a s napojenim na databazi. Viz. napr. serial na rootu. Nemate nekdo neco tak simple a strucne?

Nejvíc simple je asi mít tuto abstraktní třídu BaseModel – předek všech modelových tříd (počítám s tím, že chceš využít dibi):

abstract class BaseModel extends Object {

    private static $db;

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

        return self::$db;
    }
}

Díky tomuto modelu pak ve všech jeho potomcích budeš mocí přistupovat k instanci dibi přes $this->db.

Tento model počítá s takovýmto nastavením v config.ini:

[common]
database.driver = mysqli
database.lazy = TRUE
database.charset = utf8
; dalsi nastaveni tvoji aplikace...

[development < common]
database.host = localhost
database.database = db
database.username = user
database.password = ***

[production < common]
database.host = localhost
database.database = db
database.username = user
database.password = ***

Nadefinuješ si formulář v Presenteru a jeho obslužnou metodu:

class DefaultPresenter extends BasePresenter {

	protected function createComponentExampleForm() {
		$form = new AppForm;
		$form->addText('test1', 'Testovací pole')
			->addRule(Form::FILLED, 'Vyplňte první pole!');

		$form->addText('test2', 'Testovací pole')
			->addRule(Form::FILLED, 'Vyplňte druhé pole!');

		$form->addText('test3', 'Testovací pole');

		$form->addSubmit('okSubmit', 'Odeslat');

		$form->onSubmit[] = array($this, 'exampleFormSubmitted');

		return $form;
	}

	public function exampleFormSubmitted(AppForm $form) {
		$values = $form->getValues();

		$model = new ExampleModel;
		$model->insertExample($values['test1'], $values['test2'], $values['test3']);

		$this->flashMessage('Položka úspěšně přidaná'); //podívej se na flash zprávičky do dokumentace
		$this->redirect('this'); //po správném zpracování přesměrujeme
	}

}

V šabloně Default.default.phtml vykreslíš formulář:

{block #content}

{control exampleForm}

Samotný model (třída pracující s databází) by mohla vypadat takto:

class ExampleModel extends BaseModel {

	public function insertExample($test1, $test2, $test3) {
		$this->db->query('INSERT INTO [table]', array(
			'col1' = > $test1,
			'col2' = > $test2,
			'col3' = > $test3,
		));
	}

}

Pokud bys něčemu nerozuměl, tak můžeš hledat tady na fóru, v dokumentaci anebo se zeptat :)

Editoval Ondřej Mirtes (23. 11. 2009 19:32)

gdx
Člen | 26
+
0
-

ahojte, dik za prispevky mne to tiez pomohlo, chcel by som vsak poukazat na „chyby“ ak sa nemylim tak predsa:

DefaultPresenter extends DefaultPresenter{
...

je chyba

a funkcia

protected function createComponentExampleForm() {
                $form = new AppForm;
		...

by mala byt zakoncena navratom – return $form;, resp.

protected function createComponentExampleForm() {
                $form = new AppForm;
		...
		return $form;

inak vypise chybovu hlasku

Component with name 'exampleForm' does not exist.

Editoval gdx (23. 11. 2009 19:31)

Ondřej Mirtes
Člen | 1536
+
0
-

Je to tak, už jsem to opravil. To když to člověk píše z hlavy a nevyzkouší to :)

tombom
Člen | 10
+
0
-

Zdravim, jsem taky začátečník, už jsem trochu pochopil, ale když zkouším příklad popsaný výše, tak mi to napíše po odeslání formuláře Class ‚ExampleModel‘ not found, musím něco nastavit v bootstrapu? dik