Zprovoznění MySQL databáze
- giro
- Člen | 10
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)
- giro
- Člen | 10
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
- syky01
- Člen | 25
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)
- giro
- Člen | 10
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
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
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
- kravčo
- Člen | 721
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
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)
- Panda
- Člen | 569
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.
- dotTwelve
- Člen | 167
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
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
.
- romansklenar
- Člen | 655
Nene, potřebuješ zjistit co tu chybu způsobilo. To je přávě v tom
výpisu té laděnky v části Caused-By
.
- dotTwelve
- Člen | 167
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)
- Tomik
- Nette Evangelist | 485
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 BaseModel
u pak dědit všechny ostatní modely.
Samozřejmě do BaseModel
u 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ě.
- kuty
- Člen | 7
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
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
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
Je to tak, už jsem to opravil. To když to člověk píše z hlavy a nevyzkouší to :)