Jak vzít přístup k databázi z configu

scientific
Člen | 93
+
0
-

Ahoj všem,

chci udělat custom skript a použít v něm přihlašovací údaje k databázi z nette configu.

config.local.neon:
parameters:

database:
	dsn: 'mysql:host=127.0.0.1;dbname=databaze'
	user: 'uzivatel'
	password: 'heslo'
	options:
		lazy: yes

services:
	database: @Nette\Database\Context

// zde potřebuji něco, asi něco jako require config.local.neon co umí pracovat s JSON strukturou.
// asi bych to amatérsky řešil přes neco jako $json = json_decode(); $uzivatel = $json.database.uzivatel;
// A dbname nějakou upravou stringu $json.database.dsn :-D

$servername = "localhost";
$username = "$uzivatel";
$password = "$heslo";
$dbname = "$databaze";

Děkuji za tipy.

Martk
Člen | 652
+
0
-

Udělej službu se závislostí na Database Context, btw co má dělat tento kód?

services:
	database: @Nette\Database\Context
scientific
Člen | 93
+
0
-

Kód má být spouštěný cronem.
Má pouze číst jednu tabulku databáze.
Pokud v ní něco najde, tak odešle e-mail.

Banální skript, ale funguji cestou nejmenšího odporu, takže se chci vyhnout zkoumání, jak by se to asi řešilo přes Nette Framework. Raději bych těch pár řádků napsal během několika minut, něž zkoumal jak by se to řešilo přes Nette.

Moje představa může vypadat takto jednoduše:

<?php
$servername = $hostfromapp/config/config.local.neon;
$username = $usernamefromapp/config/config.local.neon;
$password = $passwordfromapp/config/config.local.neon;
$dbname = $databasefromapp/config/config.local.neon;

$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
  die("Connection failed: " . mysqli_connect_error());
}

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
  while($row = mysqli_fetch_assoc($result)) {
    mail("admin@domain.example","reportuji toto: bla bla","reportuji tohle a tamto: ".$row['id']);
  }
}

mysqli_close($conn);
?>

Editoval scientific (11. 10. 2021 16:26)

Mysteria
Člen | 797
+
+1
-

Jestli to opravdu chceš řešit takhle prasácky, tak ti normálně stačí Neon::decode(file_get_contents('/cesta/k/souboru.neon')) a výsledkem bude pole, podobně jako u JSONu, viz dokumentace: https://doc.nette.org/cs/neon#…

jiri.pudil
Nette Blogger | 1028
+
+3
-

Popřípadě jestli to chceš řešit o trochu méně prasácky, můžeš si ve skriptu vytvořit kontejner (obdobným kódem jako standardně v aplikaci) a z něj si patřičné parametry nebo služby vytáhnout. Pokud vycházíš z web-projectu, tak třeba nějak přibližně takhle:

<?php

declare(strict_types=1);

require __DIR__ . '/vendor/autoload.php';

$configurator = App\Bootstrap::boot();
$container = $configurator->createContainer();
$connection = $container->getByType(Nette\Database\Connection::class);

// ...

Asi nejméně prasácké řešení by pak bylo kupříkladu využít contributte/console a napsat si místo skriptu konzolový command.

David Grudl
Nette Core | 8108
+
0
-