QuickStart – Přidání databázového spojení

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

Ahoj, začínám s nette, ale mám problém s připojením databáze podle QuickStartu.

Radši napíšu postup od začátku:

  1. Nainstalovala jsem EasyPHP Devserver 16.1, kde jsem zapla Apache Server a MySQL Server.
  2. QuickStart – začínáme:
  • Stáhla jsem Nette Framework 2.4 (manuálně).
  • Kontrola požadavků: sandbox/www/checker (V pořadku, složku jsem na doporučení smazala.)
  • Web Project: zkopírování složky sandbox do kořenového adresáře ads-www a přejmenování na nette-blog. (v návodu je složka vendor místo sandbox, ale podle mě je to špatně.)
  • Úvodní stránka Web Projectu (funguje)

Odstavec: Nejdůležitější složka je pro nás app/. Zde nalezneme soubor bootstrap.php, který slouží k načtení celého frameworku a nastavení aplikace. Aktivuje se zde autoloading, nastaví se zde debugger a routy. (Nevěděla jsem, co zde nastavit, tak jsem to přeskočila.)

bootstrap.php
<?php

require __DIR__ . ‚/../vendor/autoload.php‘;

$configurator = new Nette\Configurator;

//$configurator->setDebugMode(‚23.75.345.200‘); // enable for your remote IP
$configurator->enableDebugger(__DIR__ . ‚/../log‘);

$configurator->setTimeZone(‚Europe/Prague‘);
$configurator->setTempDirectory(__DIR__ . ‚/../temp‘);

$configurator->createRobotLoader()
->addDirectory(__DIR__)
->register();

$configurator->addConfig(__DIR__ . ‚/config/config.neon‘);
$configurator->addConfig(__DIR__ . ‚/config/config.local.neon‘);

$container = $configurator->createContainer();

return $container;

  • Nahrazení obsah souboru app/presenters/templates/Homepage/default.latte za „Hello world!“ (funguje)
  • Tracy (funguje)

3. QuickStart – Úvodní stránka:

  • Adminer: Stáhnutí verze 4.2.5 pro MySQL, vložení do kořenového adresáře eda-www a spuštění přes localhost. (funguje)
  • Vytvoření databáze „quickstart“, tabulky „posts“ a vložení řádků. (funguje)
  • Připojení k databázi nastavíme v souboru app/config/config.local.neon

config.local.neon
parameters:

database:
dsn: ‚mysql:host=127.0.0.1;dbname=quickstart‘
user: root
password:
options:
lazy: yes

  • Předání databázového spojení: app/presenters/HomepagePresenter.php a načítání příspěvků z databáze:

HomepagePresenter.php
<?php

namespace App\Presenters;

use Nette;

class HomepagePresenter extends Nette\Application\UI\Presenter
{
/** @var Nette\Database\Context */
private $database;

public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
 }

public function renderDefault()
{
$this->template->posts = $this->database->table(‚posts‘)
->order(‚created_at DESC‘)
->limit(5);
}

}

Tady mi to vyhodilo chyby. Zkusila jsem ještě pokračovat šablonou, ale to už nepomohlo.

Chyby:
Source file

File: …\nette\database\src\Database\DriverException.php:25
{
16: /** @var string /
17: public $queryString;
18:
19:
20: /**
21: * @return self
22: /
23: public static function from(\PDOException $src)
24: {
25: $e = new static($src->message, NULL, $src);
26: if (!$src->errorInfo && preg_match(‚#SQLSTATE\[(.
?)\] \[(.
?)\] (.*)#A‘, $src->message, $m)) {
27: $m[2] = (int) $m[2];
28: $e->errorInfo = array_slice($m, 1);
29: $e->code = $m[1];

Call stack
…\vendor\nette\database\src\Database\Connection.php:70 source Nette\Database\DriverException::from(arguments)

…\vendor\nette\database\src\Database\Connection.php:115 source Nette\Database\Connection->connect()

…\vendor\nette\database\src\Database\Structure.php:166 source Nette\Database\Connection->getSupplementalDriver()

inner-code Nette\Database\Structure->loadStructure(arguments)

…\vendor\nette\caching\src\Caching\Cache.php:93 source call_user_func_array(arguments)

inner-code Nette\Caching\Cache->Nette\Caching\{closure}(arguments)

…\vendor\nette\caching\src\Caching\Cache.php:176 source call_user_func_array(arguments)

…\vendor\nette\caching\src\Caching\Cache.php:94 source Nette\Caching\Cache->save(arguments)

…\vendor\nette\database\src\Database\Structure.php:157 source Nette\Caching\Cache->load(arguments)

…\vendor\nette\database\src\Database\Structure.php:58 source Nette\Database\Structure->needStructure()

…\src\Database\Conventions\DiscoveredConventions.php:31 source Nette\Database\Structure->getPrimaryKey(arguments)

…\nette\database\src\Database\Table\Selection.php:95 source Nette\Database\Conventions\DiscoveredConventions->getPrimary(arguments)

…\vendor\nette\database\src\Database\Context.php:101 source Nette\Database\Table\Selection->__construct(arguments)

…\nette-blog\app\presenters\HomepagePresenter.php:21 source Nette\Database\Context->table(arguments)

11: private $database;
12:
13: public function __construct(Nette\Database\Context $database)
14: {
15: $this->database = $database;
16: }
17:
18:
19: public function renderDefault()
20: {
21: $this->template->posts = $this->database->table(‚posts‘)
22: ->order(‚created_at DESC‘)
23: ->limit(5);
24: }
25:

inner-code App\Presenters\HomepagePresenter->renderDefault()

…\nette\application\src\Application\UI\Component.php:92 source ReflectionMethod->invokeArgs(arguments)

…\nette\application\src\Application\UI\Presenter.php:210 source Nette\Application\UI\Component->tryCall(arguments)

…\nette\application\src\Application\Application.php:149 source Nette\Application\UI\Presenter->run(arguments)

…\nette\application\src\Application\Application.php:83 source Nette\Application\Application->processRequest(arguments)

…\eds-www\nette-blog\www\index.php:8 source Nette\Application\Application->run()
**
Caused by**

PDOException
could not find driver
Source file

File: …\vendor\nette\database\src\Database\Connection.php:67

57:
58:
59: /** @return void */
60: public function connect()
61: {
62: if ($this->pdo) {
63: return;
64: }
65:
66: try {
67: $this->pdo = new PDO($this->params[0], $this->params[1], $this->params[2], $this->options);
68: $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
69: } catch (PDOException $e) {
70: throw ConnectionException::from($e);
71: }

Nejsem žádný programátor, ale potřebuji si připravit funkční prostředí pro bakalářskou práci, tak moc prosím o radu. Děkuji

Jan Mikeš
Člen | 771
+
0
-

Ahoj, většinou stačí poslat jen chybovou hlášku, není potřeba posílat celý call stack.
Podle PDOException could not find driver to vypadá, že ti neběží MySQL server nebo nemáš nainstalované PDO.
Pokud má ten easyphp devserver nějaké grafické rozhraní, zkontroluj, ze je mysql zapnuto a poté zkontroluj phpinfo(), zda se tam vyskytuje PDO.

Nebo můžeš spustit nette requirements checker, který ti zkontroluje, zda máš vše potřebné pro spuštění nette aplikace.

Editoval Lexi (8. 10. 2016 17:21)

kotrvecko
Člen | 20
+
0
-

Děkuji za reakci. Checker jsem dělala na začátku a bylo to OK. MySQL server běží, jinak bych nevytvořila databázi quickstart. V phpinfo() se vyskytuje PDO, ale u PDO drivers je no value, což bude nejspíš ta chyba. Můžeš mi, prosím tě, popsat instalaci PDO jako úplnému začátečníkovi? Děkuji :-)

CZechBoY
Člen | 3608
+
0
-

v php.ini (v instalační složce php, někde u toho easy php) máš nejspíš zakomentováno (středník na začátku řádku)

extension=php_pdo_mysql.dll
Jan Mikeš
Člen | 771
+
+1
-

http://stackoverflow.com/…syphp-16-1-1

Mělo by stačit odkomentovat řádek (zrušit ;) ;extension=php_pdo_mysql.dll ve tvém php.ini

ps. po změně konfigurace je potřeba ještě restart apache/php

Editoval Lexi (8. 10. 2016 17:42)

Michal Hlávka
Člen | 190
+
+1
-

@kotrvecko jinak pro pohodli vsech ostatnich zde na forumu pouzivej prosim formatovaci tag pro zdrojove kody, pripadne i pro vypis stack trace, co jsi zde poslala.

kotrvecko
Člen | 20
+
0
-

Moc, moc děkuji jste zlatí. :-) Může se ještě zeptat. Dnes jsem si chtěla změnit heslo uživatele root na mysql, ale přes phpmyadmin to nejde a když jsem to udělala přes adminera, tak jsem se tam už nepřihlásila s heslem, pouze bez hesla, ale s omezeným oprávnění. Musela jsem přeinstalovat celý easyphp.
Má otázka tedy je, jak si změnit bezpečně heslo uživatele root? A co používáte adminer nebo phpmyadmin?

PS: Příště budu používat tagy. ;-)

Editoval kotrvecko (8. 10. 2016 17:59)

Jan Mikeš
Člen | 771
+
0
-

Na localhostu si klidně ponech mysql bez hesla. Já používám Sequel Pro
Jinak myslím i PHPStorm má nějakou podporu pro mysql databáze (nevím, osobně jsem nikdy nevyužil), předtím jsem používál i Adminer i phpmyadmin a je to pouze o preferencích, více mi vyhovovalo clean prostředí admineru a celkově se mi zdál být i rychlejší.

Michal Hlávka
Člen | 190
+
0
-

kotrvecko napsal(a):

Moc, moc děkuji jste zlatí. :-) Může se ještě zeptat. Dnes jsem si chtěla změnit heslo uživatele root na mysql, ale přes phpmyadmin to nejde a když jsem to udělala přes adminera, tak jsem se tam už nepřihlásila s heslem, pouze bez hesla, ale s omezeným oprávnění. Musela jsem přeinstalovat celý easyphp.
Má otázka tedy je, jak si změnit bezpečně heslo uživatele root? A co používáte adminer nebo phpmyadmin?

PS: Příště budu používat tagy. ;-)

Ja takove klienty nepouzivam, ale znam je. Budes se muset pripojit do databaze mysql a ulozit nove heslo u uzivatele root v tabulce user.

Ja to delam napriklad pres mysql konzoli, kterou by jsi mela byt schopna otevrit pres easyphp klienta nebo by jsi mela najit v easyphp adresari mysql.exe a do neho zadat tyhle prikazy.

mysql -u root -p

use mysql;

update user set password=PASSWORD('nove heslo k rootu') where User='root';

flush privileges;

tyhle prikazy az na ten prvni, by melo jit aji pres phpmyadmin nebo adminer :) jenom se nazacatku musis prihlasit do databaze mysql

Editoval emptywall (8. 10. 2016 18:16)