QuickStart – Přidání databázového spojení
- kotrvecko
- Člen | 20
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:
- Nainstalovala jsem EasyPHP Devserver 16.1, kde jsem zapla Apache Server a MySQL Server.
- 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
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
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 :-)
- Jan Mikeš
- Člen | 771
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
@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
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
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
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)